docker介绍及使用

简介

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。

原理

Docker核心解决的问题是利用LXC来实现类似VM的功能,从而利用更加节省的硬件资源提供给用户更多的计算资源。同VM的方式不同, LXC 其并不是一套硬件虚拟化方法 - 无法归属到全虚拟化、部分虚拟化和半虚拟化中的任意一个,而是一个操作系统级虚拟化方法, 理解起来可能并不像VM那样直观。所以我们从虚拟化到docker要解决的问题出发,看看他是怎么满足用户虚拟化需求的。

安装docker

snap install docker

基本组成

  1. Docker镜像(Image)就是一个只读的模板。镜像可以用来创建Docker容器,一个镜像可以创建很多容器。
  2. Docker容器(Container)独立运行一个或一组应用。容器是使用镜像创建的运行实例。
  3. 仓库(Repository)是集中存放镜像文件的场所。仓库(Repository)和仓库注册服务器(Registry)是有区别的。仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
  4. 卷:目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统。备份容器内的数据到主机目录中,关闭后不会被删除。docker run后加(-v,并设置超级权限):-v 容器内部路径:容器外部路径 --privileged=true

镜像和容器的区别:1、镜像是包含了各种环境或者服务的一个模板,而容器是镜像的一个实例;2、镜像是不能运行的,是静态的,而容器是可以运行的,是动态的。

查看要安装的有哪些版本(tags),对应版本后可复制下载命令

修改镜像源

// 服务器
sudo nano /etc/docker/daemon.json
// 添加如下配置(这个是我windows电脑上的)
{
  "builder": {
    "gc": {
      "defaultKeepStorage": "20GB",
      "enabled": true
    }
  },
  "experimental": false,
  "features": {
    "buildkit": true
  },
  "registry-mirrors": [
    "https://hub-mirror.c.163.com",
    "https://mirror.baidubce.com"
  ]
}

命令字和help

docker --help
docker run --help 查看帮助(得到的内容第一列等同于同行第二列,否则用第二列名字)
第一例可以-后同时加多个命令,如下i为保持打开,t为分配一个tty
docker exec -it 9019bce34a84 cat /etc/onlyoffice/documentserver/local.json
docker exec 9019bce34a84 cat /etc/onlyoffice/documentserver/local.json

命令操作

仓管中心和仓库(Registry & Repository)

docker login                登入仓管中心
sudo docker login --username=1172648136@qq.com registry.cn-hangzhou.aliyuncs.com
docker logout               登出仓管中心。
docker search               从仓管中心检索镜像。
docker pull                 从仓管中心拉取镜像到本地。
docker pull nginx:1.17.8    下载对应版本
docker push 名字:镜像版本号  从本地推送镜像到仓管中心。结合tag命令使用

镜像

# 生命周期
docker images       查看所有镜像。
docker import       从归档文件创建镜像。
docker build        从 Dockerfile 创建镜像。
docker commit       为容器创建镜像,如果容器正在运行则会临时暂停。
docker commit 容器id 建立的镜像名:版本号(标签)
docker rmi image_id 删除镜像。id通过docker images获取,并且删除前需要将对应的容器停止运行删除后才能正常删除
docker load         从标准输入 (STDIN) 加载归档包 (tar archive) 作为镜像,包括镜像本身和标签 (tags, 0.7 起)。
docker save         将镜像打包为归档包,并输出至标准输出 (STDOUT),包括所有的父层、标签和版本 (parent layers, tags, versions, 0.7 起)。
# 其它信息
docker history                                              查看镜像的历史记录。
docker tag                                                  给镜像打标签命名(本地或者仓库均可)。
docker tag image_id 名字:镜像版本号                          出版本给push推送到服务器
# 加载 / 保存 / 导入 / 导出镜像
docker load < my_image.tar.gz                               从文件中加载镜像
docker save my_image:my_tag | gzip > my_image.tar.gz        保存既有镜像
cat my_container.tar.gz | docker import - my_image:my_tag   从文件中导入容器镜像,import后为镜像用户名、镜像名
docker export my_container_id | gzip > my_container.tar.gz  导出既有容器,导出容器为当前正常运行的,可以用上一行再倒入使用
docker export my_container_id > my_container.tar            导出既有容器

容器

# 生命周期
docker create             创建容器但不启动它。
docker rename             用于重命名容器。
docker run                一键创建并同时启动该容器。docker run --help可以查看帮助(得到的内容第一列等同于同行第二列,否则用第二列名字),-d后台运行并且打印id,-p端口转发
docker run -d -p 9011:80 onlyoffice/documentserver
docker rm id              删除容器。id通过docker ps -a查询
docker update             调整容器的资源限制。
# 启动和停止
docker start              启动已存在的容器。
docker stop               停止运行中的容器,stop后加容器id(可以通过docker ps获得)
docker restart 容器id     重启容器。
docker pause              暂停运行中的容器,将其「冻结」在当前状态。
docker unpause            结束容器暂停状态。
docker wait               阻塞地等待某个运行中的容器直到停止。
docker kill               向运行中的容器发送 SIGKILL 指令。
docker attach             连接到运行中的容器。
# 信息
docker ps                 查看运行中的所有容器。
docker ps -a              将显示所有容器,包括运行中和已停止的。
docker logs               从容器中读取日志。(你也可以使用自定义日志驱动,不过在 1.10 中,它只支持json-file和journald)。
docker inspect            查看某个容器的所有信息(包括 IP 地址)。
docker events             从容器中获取事件 (events)。
docker port               查看容器的公开端口。
docker top                查看容器中活动进程。
docker stats              查看容器的资源使用量统计信息。
docker stats --all        同样将显示所有容器,默认仅显示运行中的容器。
docker diff               查看容器文件系统中存在改动的文件。
# 导入、导出
docker cp                 在容器和本地文件系统之间复制文件或目录。
docker export             将容器的文件系统打包为归档文件流 (tarball archive stream) 并输出至标准输出 (STDOUT)。
# 执行命令
docker exec               在容器内执行命令。

网络(Networks)

# 生命周期
docker network create
docker network rm
# 其它信息
docker network ls
docker network inspect
# 建立连接
docker network connect
docker network disconnect

 卷标(Volumes)

# 生命周期
docker volume create
docker volume rm
# 信息
docker volume ls
docker volume inspect

其他

清理
最新的 数据管理命令 已在 Docker 1.13 实现:
docker system prune
docker volume prune
docker network prune
docker container prune
docker image prune

df 命令
docker system df 将显示当前 Docker 各部分占用的磁盘空间。
Heredoc 声明 Docker 容器
docker build -t htop - << EOFFROM alpineRUN apk --no-cache add htopEOF

最近一次的容器 ID
alias dl='docker ps -l -q'docker run ubuntu echo hello worlddocker commit $(dl) helloworld

带命令的提交(需要 Dockerfile)
docker commit -run='{"Cmd":["postgres", "-too -many -opts"]}' $(dl) postgres

获取 IP 地址
docker inspect $(dl) | grep -wm1 IPAddress | cut -d '"' -f 4
或使用 jq:
docker inspect $(dl) | jq -r '.[0].NetworkSettings.IPAddress'
或使用 go 模板:
docker inspect -f '{{ .NetworkSettings.IPAddress }}' <container_name>
或在通过 Dockerfile 构建镜像时,通过构建参数 (build argument) 传入:
DOCKER_HOST_IP=`ifconfig | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep -v 127.0.0.1 | awk '{ print $2 }' | cut -f2 -d: | head -n1`echo DOCKER_HOST_IP = $DOCKER_HOST_IPdocker build \  --build-arg ARTIFACTORY_ADDRESS=$DOCKER_HOST_IP   -t sometag \  some-directory/

获取端口映射
docker inspect -f '{{range $p, $conf := .NetworkSettings.Ports}} {{$p}} -> {{(index $conf 0).HostPort}} {{end}}' <containername>

通过正则匹配容器
for i in $(docker ps -a | grep "REGEXP_PATTERN" | cut -f1 -d" "); do echo $i; done`

获取环境变量配置
docker run --rm ubuntu env

强行终止运行中的容器
docker kill $(docker ps -q)

删除所有容器(强行删除!无论容器运行或停止)
docker rm -f $(docker ps -qa)

删除旧容器
docker ps -a | grep 'weeks ago' | awk '{print $1}' | xargs docker rm

删除已停止的容器
docker rm -v `docker ps -a -q -f status=exited`

停止并删除容器
docker stop $(docker ps -aq) && docker rm -v $(docker ps -aq)

删除无用 (dangling) 的镜像
docker rmi $(docker images -q -f dangling=true)

删除所有镜像
docker rmi $(docker images -q)

删除无用 (dangling) 的卷标
Docker 1.9 版本起:

docker volume rm $(docker volume ls -q -f dangling=true)
1.9.0 中,参数 dangling=false 居然 没 用 - 它会被忽略然后列出所有的卷标。
查看镜像依赖
docker images -viz | dot -Tpng -o docker.png
Docker 容器瘦身

在某层 (RUN layer) 清理 APT
这应当和其他 apt 命令在同一层中完成。 否则,前面的层将会保持原有信息,而你的镜像则依旧臃肿。

RUN {apt commands} \  && apt-get clean \    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

压缩镜像
ID=$(docker run -d image-name /bin/bash)docker export $ID | docker import – flat-image-name

备份
ID=$(docker run -d image-name /bin/bash)(docker export $ID | gzip -c > image.tgz)gzip -dc image.tgz | docker import - flat-image-name

监视运行中容器的系统资源利用率
检查某个容器的 CPU、内存以及网络 I/O 使用情况,你可以:
docker stats <container>

按 ID 列出所有容器:
docker stats $(docker ps -q)

按名称列出所有容器:
docker stats $(docker ps --format '{{.Names}}')

按指定镜像名称列出所有容器:
docker ps -a -f ancestor=ubuntu

常用功能

查看容器id
docker ps
查看所有容器id
docker ps -a
删除容器
docker rm container_id

查看镜像
docker images
删除镜像
docker rmi image_id

更改onlyoffice配置
docker exec 容器id /bin/bash nano /etc/onlyoffice/documentserver/default.json
docker exec 9019bce34a84 nano /etc/onlyoffice/documentserver/default.json
docker exec f5ea2621d95f cat /etc/onlyoffice/documentserver/local.json

更改配置后重启镜像ID
docker restart 9019bce34a84

将本地容器打包后发布版本到服务器,从服务器下载使用。先登录对应服务器
docker tag image_id 名字:镜像版本号
docker push 名字:镜像版本号
docker pull nginx:1.17.8(名字:镜像版本号)

虚悬镜像(误操作产生,一般有就删掉)
查看(查询后repository和tag为none)
docker image ls -f dangling=true
删除虚悬镜像
docker image prune
 

dockerfile将jar打包部署到docker中
# 基础镜像使用java
from java:8
# 作者
maintainer hgx
# volume指定临时文件目录为/temp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
volume /tmp
# 将jar包添加到容器中并更名
add 远来的jar文件名 新的jar文件名
# 运行jar包
run bash -c 'pwd'
entrypoint ["java", "-jar", "/xx.jar(新的jar文件名)"]
# 暴露端口作为微服务
expose 6666
 
dockerfile和java文件放在同一目录去执行构建,打包成镜像文件
docker build -t xx:版本号 .
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值