共计 2728 个字符,预计需要花费 7 分钟才能阅读完成。
在日常的工作中,经常须要制作本人的我的项目的镜像,个别通过以下两种形式制作镜像:Docker commit、Dockerfile。
Docker commit
Docker commit 个别用做从一个运行状态的容器来创立一个新的镜像。定制镜像应该应用 Dockerfile 来实现。
docker commit 容器名 新镜像名:tag
应用这种形式的毛病是:1. 对外不可解释,不不便排查问题,2. 可维护性差、可浏览性差。
Dockerfile
Dockerfile 是由一系列指令和参数形成的脚本,一个 Dockerfile 外面蕴含了构建整个镜像的残缺命令。Docker 通过 docker build 执行 Dockerfile 中的一系列指令主动构建镜像。以下是 Dockerfile 中一些常用字段的含意:
FROM:根底镜像,FROM 命令必须是 Dockerfile 的首个命令。
LABEL:为镜像生成元数据标签信息。原有指令 MAINTAINER 曾经放弃应用,用 LABEL maintainer=”hogwarts@testing-studio.com” 代替。
USER:指定运行容器时的用户名或 UID,后续 RUN 也会应用指定用户。
RUN:RUN 命令是 Dockerfile 执行命令的外围局部。它接受命令作为参数并用于创立镜像。每条 RUN 命令在以后根底镜像上执行,并且会提交一个新镜像。
VOLUME:定义匿名卷,容器运行时应该尽量放弃容器存储层不产生写操作,为了避免运行时用户遗记将动静文件保留的目录挂载为卷,能够当时指定某些目录挂载为匿名卷。这样就不会向容器存储层写入大量数据。
WORKDIR:WORKDIR 命令用于设置 CMD 指明的命令的运行目录。为后续的 RUN、CMD、ENTRYPOINT、ADD 指令配置工作目录。能够应用多个 WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的门路。应用 docker exec -it 进入容器后,默认也会进入到 WORKDIR 指定的目录。
ENV:指定容器启动时的环境变量 (留神,只有在容器启动时,启动脚本能读取到,如果心愿其余用户登录到容器也失效的话,须要写入 .bashrc)。
COPY:COPY 命令有两个参数,源和指标。它的根本作用是从源零碎的文件系统上复制文件到指标容器的文件系统。
EXPOSE:指定端口转发
CMD:设置容器创立是执行的默认命令。反对三种格局,默认会被 docker run 指定的参数笼罩。每个容器只能执行一条 CMD 命令。执行的命令和参数当指定多个时,只有最初一个起效。
- CMD [“executable”, “ 参数 1 ″,” 参数 2 ”]:应用 exec 形式执行,举荐。
- CMD command 参数 1 参数 2:shell 形式执行。
- CMD [“ 参数 1 ″,” 参数 2 ”]:提供给 ENTRYPOINT 做默认参数。
ENTRYPOINT:指定容器的“入口”。反对两种格局,默认不会被 docker run 指定的参数笼罩。能够指定 –entrypoint 参数去笼罩。每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最初一个起效。
- ENTRYPOINT [“executable”, “ 参数 1 ″,” 参数 2 ”]:应用 exec 形式执行。举荐 – ENTRYPOINT command 参数 1 参数 2:shell 形式执行。
shell 形式下不能承受 CMD 的参数。
HEALTHCHECK:Docker 1.12 版本后引入的判断容器运行状态是否失常。
通过上面对指令的理解后,咱们最初通过一个小小的 demo 来给大家演示一下怎么组合应用这些指令。
1. 新建一个 index.html 文件,内容
<h1>Hogwarts.</h1>
2. 新建 Dockerfile 文件
# 基于 nginx:1.17.9 镜像构建
FROM nginx:1.17.9
# 指定信息
LABEL maintainer="hogwarts@testing-studio.com>"
# 设置环境变量
ENV NGINX_VERSION 1.17.9
# 切换 root 用户
USER root
# 执行命令,装置 curl 软件,设置软链接把 nginx 服务的日志显示到终端输入上。RUN apt-get -yq update && apt-get install -y curl && \
ln -sf /dev/stdout /var/log/nginx/access.log && \
ln -sf /dev/stderr /var/log/nginx/error.log
# 设置容器内 /data 目录为匿名卷
VOLUME ["/data"]
# 设置工作目录
WORKDIR /data/html/
# 复制 index.html 文件到 WORKDIR 目录下。COPY index.html .
# 映射 80 端口
EXPOSE 80
# 此处 CMD 作为 ENTRYPOINT 的参数。# CMD ["nginx", "-g", "daemon off;"]
CMD ["-g", "daemon off;"]
# 设置容器启动的命令
ENTRYPOINT ["nginx"]
# 查看容器衰弱,通过拜访 Nginx 服务 80 端口,来判断容器服务是否运行失常。HEALTHCHECK --interval=5s --timeout=3s \
CMD curl -fs http://localhost/ || exit 1
3. 构建镜像
docker build -t n:v1 .
4. 运行容器
docker run --name nv1 -p 8080:80 n:v1
启动后,HEALTHCHECK 就会 5 秒钟拜访一次 Nginx 服务,来确保容器运行的状态。
服务失常的状态。COMMAND 栏显示的命令,为 ENTRYPOINT 指令和 CMD 指令合并后的命令。
5. 进入容器,验证后果。
docker exec -it nv1 bash
- exec:执行命令 – it:交互式 tty 终端 – nv1:容器启动的名字 – bash:应用的 shell 类型
进入容器后,默认会切换到 /data/html 目录,这个是 WORKDIR 指令指定的目录。
能够应用 id 命令查看以后用户信息,显示为 root。这个是 USER 指令指定的用户。
应用 ls 命令来查看当前目录的文件,会看到 index.html 文件,这个是 COPY 指令复制到容器的文件。
应用 env 命令能够查看以后环境下有一个变量 NGINX_VERSION=1.17.9 这个是 ENV 指令指定的信息。
我的项目的镜像的内容就先说到这里,对 Docker commit、Dockerfile 是不是有了更多一些的理解了呢?
内容全面降级,4 个月 20+ 我的项目实战强化训练,资深测试架构师、开源我的项目作者亲授 BAT 大厂前沿最佳实际,带你一站式把握测试开发必备外围技能(对标阿里 P6+,年薪 50W+)!直推 BAT 名企测试经理,广泛涨薪 50%+!