专栏首页测试工程师成长之道Dockerfile究竟是做什么的

Dockerfile究竟是做什么的

开源领域的技术明星-Docker,一时风光无限好,Docker吸引了业界的众多知名企业的支持google, 亚马逊, IBM, 阿里, 腾讯等.只要有Linux的地方,就能看到docker被追捧的盛况.在技术更新迭代频繁的当下, Docker是今天翘楚.如果作为IT从业者你现在还不了解docker,那只能说明你生活在月球.

我们在之前的文章中分享过Docker的三个关键名称:仓库, 镜像, 容器之间的概念和关系.

今天我们就把重点放在Dockerfile上.

Docker通过dockerfile来自动构建镜像.

Dockerfile是什么

Dockerfile是一个创建镜像所有命令的文本文件, 包含了一条条指令和说明, 每条指令构建一层, 通过docker build命令,根据Dockerfile的内容构建镜像,因此每一条指令的内容, 就是描述该层如何构建.有了Dockefile, 就可以制定自己的docker镜像规则,只需要在Dockerfile上添加或者修改指令, 就可生成docker 镜像.

Dockerfile文件格式

Dockerfile 文件组成如下:

##  Dockerfile文件格式

# This dockerfile uses the ubuntu image
# VERSION 2 - EDITION 1
# Author: docker_user
# Command format: Instruction [arguments / command] ..

# 1、第一行必须指定 基础镜像信息
FROM ubuntu

# 2、维护者信息
MAINTAINER docker_user docker_user@email.com

# 3、镜像操作指令
RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list
RUN apt-get update && apt-get install -y nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf

# 4、容器启动执行指令
CMD /usr/sbin/nginx

Dockerfile 四部分说明:

  • 一开始必须要指明所基于的镜像名称, 关键字是FROM, 这是必须的.
  • 接下来是维护者信息关键字是MAINTAINER, 非必须, 但良好的习惯有利于后期的职责明确.
  • 后面是镜像操作指令, 如RUN等, 每执行一条RUN命令,镜像添加新的一层.
  • 最后是CMD指令,来指明运行容器时的操作命令.

Dockerfile 指令选项:

  • FROM
  • MAINTAINER
  • RUN
  • CMD
  • EXPOSE
  • ENV
  • ADD
  • COPY
  • ENTRYPOINT
  • VOLUME
  • USER
  • WORKDIR
  • ONBUILD

具体的指令使用可以参阅官方:http://www.docker.org.cn/

构建镜像

Docker build命令会根据Dockerfile文件的上下文关系构建Docker镜像. 构建上下文是指Dockerfile所在的本地路径或一个URL(Git仓库地址). 构建上线文环境会递归处理, 所以构建所指定的路径还包括子目录, 而且URL还包括了其中指定的子模块.

Dockerfile 一般位于构建上下文的根目录下,也可以通过-f来指定文件位置

docker build -f /path/to/a/Dockerfile .

镜像标签

构建时候还可以通过-t参数指定构建成镜像的仓库标签

docker build -t nginx/v3 .

如果存在多个仓库下, 或者使用多个镜像标签, 可以用多个-t参数

docker build -t nginx/v3:1.0.2 -t nginx/v3:latest .

注意:命令的最后一个点不能丢, 他是告诉docker引擎的上下文路径,默认上下文路径就是Dockerfile的所在位置, 上下文路径下面不要放无用的文件,因为他会一起打包发送给docker引擎,文件过多会造成过程缓慢.

简单示例

接下来用一个简单的示例Dockerfile如何来构建和启动容器.

在一个空白的文本文件, 命名为Dockerfile

mkdir mynginx
cd mynginx
vi Dockerfile

Dockerfile文件内容:

FROM nginx
RUN echo '<h1>It works!</h1>' > /usr/share/nginx/html/index.html

非常简单的Dockerfile, 在执行过程中重写了nginx的默认页面信息,将其替换为It works!

在dockerfile文件目录下执行:

louie-mac:mynginx louiezhou$ docker build -t nginx:v1 .
Sending build context to Docker daemon  3.072kB
Step 1/2 : FROM nginx
latest: Pulling from library/nginx
bc51dd8edc1b: Pull complete
66ba67045f57: Pull complete
bf317aa10aa5: Pull complete
Digest: sha256:ad5552c786f128e389a0263104ae39f3d3c7895579d45ae716f528185b36bc6f
Status: Downloaded newer image for nginx:latest
 ---> 2073e0bcb60e
Step 2/2 : RUN echo '<h1>It works!</h1>' > /usr/share/nginx/html/index.html
 ---> Running in 2f49ab8104be
Removing intermediate container 2f49ab8104be
 ---> e68df98a0494
Successfully built e68df98a0494
Successfully tagged nginx:v1
构建完成后,使用docker images,可以查看构建的镜像,如果存在REPOSITORY为nginx和
TAG是v1的信息,就表示成功了.
louie-mac:mynginx louiezhou$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               v1                  e68df98a0494        4 minutes ago       127MB
nginx               latest              2073e0bcb60e        2 weeks ago         127MB
可以通过命令单独查看镜像
louie-mac:mynginx louiezhou$ docker images | grep e68df98a0494
nginx               v1                  e68df98a0494        2 hours ago         127MB

接下来是启动容器, 使用docker run 命令

louie-mac:mynginx louiezhou$ docker run  --name docker_nginx_v1 -d -p 80:80 nginx:v1
32180627ef8a97710726d14efa499d4c61ccb95d9e7b0d293cd1f0227fc74f94

docker run还有丰富的参数可以使用

docker run -p 3000:3000 -ti --rm --init nginx:v1

这条命令会使用nginx镜像启动一个容器, 命名为 docker_nginx_v1 , 映射端口是80

打开浏览器地址localhost,就可以看到

这样一个简单使用Dockerfile构建镜像,运行容器就完成了.

通过docker exec 命令可以进入容器内部

louie-mac:mynginx louiezhou$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                        NAMES
32180627ef8a        nginx:v1            "nginx -g 'daemon of…"   2 hours ago         Up 2 hours          80/tcp, 0.0.0.0:99->99/tcp   docker_nginx_v1
louie-mac:mynginx louiezhou$ docker exec -it 32180627ef8a /bin/bash
root@32180627ef8a:/#

带上容器id,就可以进入容器内部进行访问了

修改容器内容

容器启动后,需要对容器内容的文件进行完善, 可以使用

docker exec -it 容器名称 bash 命令进行修改, 基于上面示例基础修改启动提示内容

docker exec -it docker_nginx_v1 /bin/bash
root@3729b97e8226:/# echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
root@3729b97e8226:/# exit
exit

以交互式终端方式进入docker_nginx_v1 容器, 并执行bash命令,也就是获取了一个可操作的shell,再次刷新浏览器, 就是你新修改的内容了.

修改了容器的文件,也就是动了容器的存储层,可以通过docker diff命令看到具体改动

louie-mac:mynginx louiezhou$ docker diff docker_nginx_v1
C /run
A /run/nginx.pid
C /var/cache/nginx
A /var/cache/nginx/client_temp
A /var/cache/nginx/fastcgi_temp
A /var/cache/nginx/proxy_temp
A /var/cache/nginx/scgi_temp
A /var/cache/nginx/uwsgi_temp

到此Dockerfile使用方式就介绍的差不多了

补充内容:

缓存

Dockerfile守护进程会一条条执行Dockerfile中的命令, 而且会在每一步提交并生成一个新镜像,最后会输出最终镜像的id, 生成完成后, Docker守护进程会自动清理你发的上下文.

Dockerfile文件中的每一条指令都会被独立执行, 并会创建一个新的镜像,RUN命令等不会对下一条指令产生影响.

更多的实用docker命令, 请关注后回复关键字docker,即可获取.

总结:

测试是一门技术, 更是一门艺术. 也许你今天拥有的技术, 明天就会被淘汰. 同时需要我们开拓思维和眼界, 积极拥抱变化, 学习新知识, 新方法,新技能, 计算机领域讲究的是实践, 学习更要讲究方式方法. 学习和动手一定要结合, 光看不练,犹如看武功秘籍, 是永远成不了武功大侠的.

本文分享自微信公众号 - 测试工程师成长之道(louiezhou001),作者:Louiezhou

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-02-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 测试必会 | Docker 核心命令技能

    attach; build; commit; cp; diff; export; images; exec;

    louiezhou001
  • 测试技能扩展 | Nginx知识

    nginx几乎是众多大型网站必用技术, 大多数情况下, 我们不需要亲自去配置,但了解他在应用程序中的角色, 以及如何解决这些问题是非常有帮助的.

    louiezhou001
  • Docker基本概念

    2010年,几个大胡子年轻人在旧金山成立了一家PaaS(Platform as a Service)平台的公司,起名为「dotCloud」. dot...

    louiezhou001
  • 玩转容器技术

    归档镜像 docker image save image_name > xxx.tar

    猿哥
  • Docker 私有仓库安装配置 (Registry v2)

    使用 Docker Compose + Docker machine 配置一个 Docker 私有仓库。

    康怀帅
  • 安装和配置docker

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    颍川
  • .net core项目实战之开发环境搭建

    首先建议采用 Windows 10 专业版/企业版/教育版,且必须是64位操作系统,原因是docker装起来比较方便,Win7装起来比较麻烦,且不确定是否有其他...

    Bug生活2048
  • Docker下Nginx+Tomcat实现负载均衡

    本文介绍在Docker上配置负载均衡,启动一个nginx容器,三个tomcat容器。

    菲宇
  • 为你的网站加上SSL,可以使用HTTPS进行访问

    苹果在之前就说了,api接口得用https,不然不给上架,这是对于我来说无所谓,毕竟我们就是一个网站嘛~ 有没有s无所谓,但是我们要追求极高的造诣,那么加个s装...

    风间影月
  • 使用 docker 作为 Web 开发服务器

    提供一种思路,临时启动一个 nginx 容器作为服务器来开发前端应用,nginx 作为静态页面发布器,并可以代理远端 API。同时,我们也可以在 shell 中...

    谢正伟

扫码关注云+社区

领取腾讯云代金券