公众号搜索:TestingStudio 霍格沃兹测试开发的干货都很硬核

在日常的工作中,常常需要制作自己的项目的镜像,一般通过以下两种方式制作镜像:Docker commit、Dockerfile。

todo:将反引号改为加粗符号**

Docker commit

Docker commit一般用做从一个运行状态的容器来创建一个新的镜像。定制镜像应该使用Dockerfile来完成。

docker commit 容器名 新镜像名:tag

**使用这种方式的缺点是:1.对外不可解释,不方便排查问题, 2.可维护性差、可阅读性差。

todo:用加粗** 代替反引号

Dockerfile

Dockerfile 是由一系列指令和参数构成的脚本,一个 Dockerfile 里面包含了构建整个镜像的完整命令。Docker 通过docker build执行 Dockerfile 中的一系列指令自动构建镜像。以下是 Dockerfile 中一些常用字段的含义:

todo:下面命令太抽象,而且只是介绍,没有demo,可以给每个命令引入demo,比如解释 FROM ubuntu:16.04

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是不是有了更多一些的了解了呢

软件测试/测试开发丨学习Docker就应该掌握的dockerfile语法与指令相关推荐

  1. 软件测试/测试开发丨Docker 容器技术与常用命令

    公众号搜索:TestingStudio 霍格沃兹测试开发的干货都很硬核 Docker 简介 Docker 是一个开源的应用容器引擎,基于 Go 语言开发,Docker 可以让开发者打包他们的应用以及依 ...

  2. 软件测试/测试开发丨必知必会的Docker 命令

    公众号搜索:TestingStudio 霍格沃兹测试开发的干货都很硬核 我们下载 Docker 镜像的时候,默认会访问 Docker 网站,而 Docker 网站是在国外部署的,距离比较远下载速度特别 ...

  3. 软件测试/测试开发丨Java or Python?测试开发工程师如何选择合适的编程语言?

    很多测试开发工程师尤其是刚入行的同学对编程语言和技术栈选择问题特别关注,毕竟掌握一门编程语言要花不少时间成本,也直接关系到未来的面试和就业(不同企业/项目对技术栈要求也不一样),根据自身情况做一个相对 ...

  4. 软件测试/测试开发丨ChatGPT在软件测试领域的应用

    随着互联网技术的迅速发展,软件已经成为现代社会中不可或缺的一部分.而软件测试作为保障软件质量的关键环节,也越来越受到人们的关注.在这个领域,ChatGPT作为一种新型的人工智能技术,正逐渐应用于软件测 ...

  5. 软件测试/测试开发丨免安装免配置环境的免费 ios 调试工具 sib 来啦

    公众号搜索:TestingStudio 霍格沃兹的干货都很硬核 sib是以gidevice为底层实现的iOS调试工具,因为go语言特性,编译好的二进制文件可以直接运行,所以不需要额外配置python环 ...

  6. 软件测试 | 测试开发| 80后专科学历入职世界500强企业,二线城市年薪超30W

    本文为霍格沃兹测试学院优秀学员跳槽笔记,测试开发进阶学习文末加群. 这篇文章是写给想在测试行业或者转行做测试行业的小伙伴的.我将叙述如何从0到1转行到测试行业并入职世界500强企业.先交待一下我的背景 ...

  7. 软件测试 | 测试开发 | 测试人生 | 00后0经验应届毕业生拿下2线城市15W offer,好励志~

    本文为霍格沃兹测试开发学社优秀学员跳槽笔记,测试开发进阶学习文末加群. 本人毕业于武汉市某不知名二本院校的物联网工程专业,物联网专业在我们学校是偏硬件的,对于软件的学习仅仅停留在基本的理论和操作方面. ...

  8. 软件测试 | 测试开发 | 年薪超过40W,一位测试媛宝妈的 BAT 大厂逆袭之旅

    本文为霍格沃兹测试学社优秀学员跳槽笔记,测试开发进阶学习文末加群. 本人之前是在一家二流互联网企业(已上市,不算真正的互联网),工作2年多.因为业务不断的调整和结婚生孩子,导致绩效不佳还是刚入职时的薪 ...

  9. 软件测试 | 测试开发 | 测试人生 | (汇总篇)从小团队的业务到独角兽的测开,涨薪超过60%,90后凤凰涅槃了

    本文为霍格沃兹测试学院优秀学员跳槽笔记,测试开发进阶学习文末加群. 作为七年的测试老鸟,做过几年外包,也做过自研项目,目前在一家电商小团队做业务功能测试,涉及一点压力测试,只是配合开发写jmeter脚 ...

最新文章

  1. Git 面对不同的场景的命令使用
  2. 软件测试(一):概念篇
  3. CSDN Blog V3.0.0.2升级公告
  4. 渗透知识-内网渗透(详细版本)
  5. java 大文件 md5_使用Java为大文件生成MD5非常慢
  6. SQL 调试:无法启动 T-SQL 调试。未能附加到 SQL Server 进程
  7. 使用localhost访问远程tensorboard
  8. R语言中不能安装包(Package)的四种解决办法
  9. redis lettuce 超时_Spring Cache 操作 Redis 实现数据缓存(上)
  10. Java中的关键字--volatile
  11. 快速构建Windows 8风格应用9-竖直视图
  12. matlab 有限域函数,matlab有限域上的运算.docx
  13. Tin与Markdown的对比
  14. 基于支持向量机的图像分类(上篇)
  15. 怎样安装2003服务器系统安装,Windows 2003系统详细安装教程图解
  16. samba报错“Failed to open /etc/secrets.tdb”
  17. 不应该只做你喜欢的事,而是去做让自己更伟大的事
  18. qq解冻显示服务器开小差了是什么意思,腾讯内容开放平台
  19. mysql查询名字叫小明的_MySQL(命令和查询语句)
  20. ajax实现留言板功能 -

热门文章

  1. 计算机为什么无法睡眠,电脑一休眠就唤醒不了该怎么解决
  2. 关于 android 平台上的 usb 投屏
  3. [BZOJ4537][Hnoi2016]最小公倍数(并查集+分块)
  4. Python实现base64编码文件转化为jpg/png/jpeg/格式图片
  5. 邮箱服务之阿里云平台
  6. ckeditor富文本编辑器的使用和图片上传,复制粘贴图片上传
  7. PHP实现水仙花算法
  8. 计算机cmd如何设置路由,Windows 系统cmd设置添加静态路由方式
  9. 速都app推广:移动网页seo优化和APP发布与aso优化试水
  10. google浏览器显示Adobe Flash player过期的处理方法