共计 2938 个字符,预计需要花费 8 分钟才能阅读完成。
前言
本文为学习整理和参考文章,不具有教程的功能。其次,后面将会陆续更新各种应用的容器化部署的实践,如 MySQL 容器化,Jenkins 容器化,以供读者参考。
镜像获取
docker pull [options] [Docker Registry 地址]< 仓库名 >:< 标签 >
-a, –all-tags: 下载该镜像的所有版本
Docker Registry 地址默认为 Docker Hub,一般格式为 IP:端口号仓库名为两段式 < 用户名 >:< 软件名 > 默认用户名为 library 标签不填则默认为 latest
列出镜像
docker images [options] [Repository[:tag]]
默认情况会展示所有最终镜像,如果加上了镜像名,则会展示该镜像的所有信息
-a, –all: 展示所有镜像,包括中间层
-f, –filter filter: 根据某种条件对镜像进行筛选
–format string: 使用 go 的模板语法
-q,–quiet: 只返回镜像的 ID
docker images -f since=mongo:3.2 #查看 mongo3.2 版本之后建立的镜像,如果是要在之前,则使用 before
docker images –format “{{.ID}}:{{.Repository}}” #输出结构为 ID:Repository
虚悬镜像
虚悬镜像是指既没有仓库名,也没有标签的镜像。这种镜像的产生常常由于当前的仓库名和标签被更新版本占用,导致当前境像失效。
docker images -f danling=true #列出所有虚悬镜像
docker rmi $(docker images -q -f dangling=true) #利用复合指令删除虚悬镜像
commit 镜像
commit 会将容器的存储层保存下来成为新的镜像
docker commit [options] < 容器 ID 或容器名 > [< 仓库名 >[:< 标签 >]]
-a, –author string: 容器所有者
-c, –change list: 在容器上执行 Dockerfile 指令
-m, –message string: 提交信息
-p, –pause: 提交过程中停止容器的运行,默认为 true
docker history IMAGE #显示镜像的历史记录
docker diff CONTAINER #查看容器的改动
尽量不要使用 commit 指令构建镜像
Dockerfile
构建镜像
利用 Dockerfile 构建镜像。
docker build [options] PATH | URL | –
-f, –file string: Dockerfile 的路径
–rm: 成功构建后删除中间镜像
-t, –tag: 以 name:tag 的形式为镜像命名
docker build -t nginx:v3 . #执行当前目录下的 Dockerfile 并构建镜像,新的镜像名为 nginx:v3
docker build https://…… #直接从 github 构建,会自动 clone 这个项目,切换到指定分支(默认为 master),并进入指定目录进行构建
最后的路径是指镜像构建的上下文,docker 在 build 的时候会把该上下文中的而所有内容全部打包上传给 docker 引擎。当在 Dockerfile 中需要引用相对路径时,就是以该上下文作为当前指令执行的目录。可以编写.dockerignore 文件来剔除无需打包的文件。在默认情况下,如果不指定 Dockerfile 的位置,就会从构建的上下文寻找 Dockerfile 来执行
FROM
指定基础镜像,Dockerfile 的第一行必须制定基础镜像
RUN
执行命令。RUN 指令会新建一层并在其上执行指令,指令完成之后再 commit 该镜像。所以 RUN 指令中的内容应当尽可能合并,并且记得清除冗余的内容如缓存等。
RUN < 指令 >
RUN [“ 可执行文件 ”, “ 参数 1 ”, “ 参数 2 ”]
RUN mkdir newDir \
&& touch newFile
COPY
将构建上下文中源路径中的内容复制到目标路径之下。可以使用通配符。如果目标目录不存在,容器会帮助创建。复制过程不改变文件属性。
COPY 源路径 目标路径
COPY [“ 源路径 ”,…,” 目标路径 ”]
COPY hom* /mydir/
CMD
默认的容器的主进程的启动命令,在运行时可以指定新的命令来替代镜像设置中的默认命令。比如 ubuntu 的默认指令是 /bin/bash。如果使用第一种形式,则会以 sh - c 的形式执行,这样就能够得到环境变量。容器中的应用都应该前台执行。
CMD < 命令 >
CMD [“ 可执行文件 ”, “ 参数一 ”, “ 参数二 ”, …]
CMD [“ 参数一 ”, “ 参数二 ”…]
CMD [“nginx”, “-g”, “daemon off;”]
docker run -it ubuntu #直接进入 bash,因为默认指令为 /bin/bash
docker run -it ubuntu /etc/os-release #默认指令变成 /etc/os-release
ENTRYPOINT
指定容器启动程序及参数,当指定了 ENTRYPOINT 之后,CMD 的含义就变成了 ENTRYPOINT 的参数。从而实现我们在 build 镜像时可以根据配置修改启动指令的参数。在 docker run 运行时可以用 –entrypoint 覆盖
ENTRYPOINT “CMD”
ENTRYPOINT [“ 可执行文件 ”, “ 参数一 ”, “ 参数二 ”…]
ENV
设置环境变量
ENV KEY VALUE
ENV KEY1=VALUE2 KEY2=VALUE2
ARG
同 ENV,设置环境变量并为其提供默认值,不同的是在容器运行时,这些值将不存在。在运行时可以用 –build-arg < 参数名 >:< 值 > 覆盖
ARG < 参数名 >[= 默认值]
VOLUMN
指定匿名卷,防止用户忘记挂载, 运行时用 -v HOST_DIR/CONTAINER_DIR 进行覆盖
VOLUMN PATH
EXPOSE
声明运行时容器提供的服务端口,运行时应用并不会因为这个声明而打开这个端口。docker run - P 时会对声明的端口随机映射
EXPOSE 端口一 端口二
WORKDIR
指定容器之后各层的工作目录。因为本层的 cd 并不会顺带到下一层。
WORKDIR PATH
USER
改变之后层执行 RUN,ENTRYPOINT 等指令的身份
RUN groupadd -r redis && useradd -r -g redis redis
USER redis
RUN [“redis-server”]
ONBUILD
ONBUILD 其它指令
用于构建基础镜像,被引用是才会真正执行。可以提取出重复的部分,方便维护
删除
docker rmi [options] <image1> [<image2>….] #删除镜像
docker rm [options] <container1> [<container2>…] #删除容器
进入容器
docker attach CONTAINER_NAME
查看数据卷信息
docker inspect CONTAINER_NAME
匿名的数据卷默认位于 /var/lib/docker/volumes 之下
查看容器
docker logs [-f] container
查看端口映射配置
docker port container container_port
容器链接
–link container_name:alias