阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Docker 快速入门之 Dockerfile

252次阅读
没有评论

共计 4748 个字符,预计需要花费 12 分钟才能阅读完成。

Docker 快速入门之 Dockerfile

在之前的文章中我们提到可以通过容器创建一个我们自定义过的镜像,那么我们是否可以直接通过基础的镜像直接自定义镜像呢?答案当然是可以的,在 Docker 中我们可以从名为 Dockerfile 的文件中读取指令并且自动构建镜像。在本文中,将介绍 Dockerfile 的基本语法以及基本知识。

1、Dockerfile 是什么?

Dockerfile 其实是一份文本文档,里面包含了用户可以用来操作镜像的一些指令。通过顺序执行这些指令,最后得到一个自定义的镜像,这有点类似于我们的 shell 脚本。

2、Dockerfile 示例

接下来先看一个 Dockerfile 示例:

  1. FROM CentOS
  2. LABEL maintainer="Locez <locez@locez.com>"
  3. ENV TEST="This is a test env"
  4. COPY nginx.repo /etc/yum.repos.d/nginx.repo
  5. RUN yum update -y && \
  6. yum install -y nginx
  7. COPY nginx.conf /etc/nginx/nginx.conf
  8. COPY index.html /usr/share/nginx/html/index.html
  9. COPY index_files/ /usr/share/nginx/html/index_files/
  10. EXPOSE 80
  11. CMD ["/usr/sbin/nginx","-g","daemon off;"]

在上面我们可以看到 Dockerfile 中的一些指令,通过名称我们也可以猜到这些指令大概是干嘛的,其中有一些对文件的操作,因此我们先来看看用于存放 Dockerfile 的这个目录的目录结构:

  1. # tree .
  2. .
  3. ├──Dockerfile
  4. ├── index_files
  5. ├──145049z4og8xyjhx4xy8go.jpg
  6. ├──222746e5vh38d7ey3leyps.jpg
  7. ├──88x31.png
  8. ├── archlinux-splash.png
  9. ├── bdshare.css
  10. ├──Best-Linux-Markdown-Editors.png
  11. ├── core.js
  12. ├── docker-icon.jpg
  13. ├── Hadoop-pic1.png
  14. ├── jquery_002.js
  15. ├── jquery.css
  16. ├── jquery.js
  17. ├──MathJax.js
  18. ├── pic.gif
  19. ├── raspberrypiraspberry-pi-logo.jpg
  20. ├──script.js
  21. ├── scrollup.png
  22. ├── share.js
  23. ├── style.css
  24. └── z_stat.js
  25. ├── index.html
  26. ├── nginx.conf
  27. └── nginx.repo
  28. 1 directory,24 files

构建镜像

在当前目录下执行以下命令构建镜像:

  1. # docker build -t locez/nginx .
  2. Sending build context to Docker daemon 1.851 MB
  3. Step1/10: FROM centos
  4. --->196e0ce0c9fb
  5. Step2/10: LABEL maintainer "Locez <locez@locez.com>"
  6. --->Using cache
  7. --->9bba3042bcdb
  8. Step3/10: ENV TEST "This is a test env"
  9. --->Using cache
  10. ---> c0ffe95ea0c5
  11. Step4/10: COPY nginx.repo /etc/yum.repos.d/nginx.repo
  12. --->Using cache
  13. ---> bb6ee4c30d56
  14. Step5/10: RUN yum update -y &&yum install -y nginx
  15. --->Using cache
  16. --->6d46b41099c3
  17. Step6/10: COPY nginx.conf /etc/nginx/nginx.conf
  18. --->Using cache
  19. ---> cfe908390aae
  20. Step7/10: COPY index.html /usr/share/nginx/html/index.html
  21. --->Using cache
  22. --->21729476079d
  23. Step8/10: COPY index_files/ /usr/share/nginx/html/index_files/
  24. --->Using cache
  25. --->662f06ec7b46
  26. Step9/10: EXPOSE 80
  27. --->Using cache
  28. --->30db5a889d0a
  29. Step10/10: CMD /usr/sbin/nginx -g daemon off;
  30. --->Using cache
  31. ---> d29b9d4036d2
  32. Successfully built d29b9d4036d2

然后用该镜像启动容器:

  1. # docker run -d -it --rm--name test-nginx -p 8080:80 locez/nginx
  2. e06fd991ca1b202e08cf1578f8046355fcbba10dd9a90e11d43282f3a1e36d29

用浏览器访问 http://localhost:8080/ 即可看到部署的内容。

3 Dockerfile 指令解释

Dockerfile 支持 FROMRUNCMDLABELEXPOSEENVADDCOPYENTRYPOINTVOLUMEUSERWORKDIRARGONBUILDSHELL 等指令,这里只选择常用的几个进行讲解,可结合上面的示例进行理解。其它的请自行查阅官方文档。

3.1 FROM

FROM 指令用于指定要操作的基础镜像,因为在我们构建我们自己的镜像的时候需要一个基础镜像。语法:

  1. FROM <image>[AS <name>]
  2. FROM <image>[:<tag>][AS <name>]

其中 [AS <name>] 为指定一个名称,在一个 Dockerfile 中多次使用 FROM 时如有需要,可用 COPY --from=<name|index> 语法进行复制。

3.2 RUN

RUN 指令用于执行命令,并且是在新的一层上执行,并把执行后的结果提交,也就是生成新的一层。基于这个问题,我们在使用 RUN 指令时应该尽可能的把要执行的命令一次写完,以减少最后生成的镜像的层数。语法:

  1. RUN <command>
  2. RUN ["executable","param1","param2"]

3.3 CMD

CMD 指令用于给容器启动时指定一个用于执行的命令,例如上例中的 nginx 启动命令。语法:

  1. CMD ["executable","param1","param2"]
  2. CMD ["param1","param2"]### 用于给 ENTRYPOINT 指令提供默认参数
  3. CMD command param1 param2

3.4 LABEL

LABEL 指令用于为镜像指定标签,可用 docker inspect 命令查看。可用来代替被舍弃的 MAINTAINER 命令。语法:

  1. LABEL <key>=<value><key>=<value><key>=<value>...

3.5 EXPOSE

EXPOSE 指令用于告诉 Docker 容器监听的特殊端口,但是此时端口还没有暴露给 host,只有当在运行一个容器显式用参数 -p 或者 -P 的时候才会暴露端口。语法:

  1. EXPOSE <port>[<port>/<protocol>...]

3.6 ENV

ENV 指令用于设定环境变量。语法:

  1. ENV <key><value>
  2. ENV <key>=<value>...

3.7 ADD

ADD 指令用于复制新文件,目录,远程文件到容器中。其中 <src> 可以为文件,目录,URL,若为可解压文件,在复制后会解压。语法:

  1. ADD <src>...<dest>
  2. ADD ["<src>",..."<dest>"]

3.8 COPY

COPY 指令与 ADD 指令非常相似,但 COPY 比较直观且简单,它只支持本地的文件以及目录的复制,不像 ADD 指令可以远程获取文件并解压。语法:

  1. COPY <src>...<dest>
  2. COPY ["<src>",..."<dest>"]

3.9 ENTRYPOINT

ENTRYPOINT 指令也跟 CMD 指令相似,用于指定容器启动时执行的命令。当使用 ENTRYPOINT 指令时,可用 CMD 命令配合,这样在启动容器时,可以对 CMD 指令写入的参数进行覆盖。语法:

  1. ENTRYPOINT ["executable","param1","param2"]

例子:

  1. ENTRYPOINT ["top","-b"]
  2. CMD ["-c"]

上面的 -c 参数可以在启动时覆盖 docker run -it --rm --name test top -H。如果要覆盖 ENTRYPOINT 指令则用 --entrypoint 参数启动容器。

3.10 VOLUME

VOLUME 指令用于为容器创建一个挂载点,这个挂载点可以用来挂载 本地文件 / 文件夹 也可以用来挂载 数据卷。其中若在启动一个新容器时没有指定挂载目录,则会自动创建一个数据卷,当容器被销毁时,数据卷如果没有被其它容器引用则会被删除。语法:

  1. VOLUME ["/data1","/data2"]

3.11 USER

USER 指令用于设置执行 RUN, CMD, ENTRYPOINT 等指令的用户以及用户组。默认为 root 用户。语法:

  1. USER <user>[:<group>]

3.12 WORKDIR

WORKDIR 指令用于设置 RUN, CMD, ENTRYPOINT, COPY, ADD 等指令的工作目录。语法:

  1. WORKDIR /path/to/workdir

4 总结


本文从一个具体的例子出发,讲述了如何利用 Dockerfile 构建镜像,然后解释了 Dockerfile 文件中的指令的语法,有关更多内容可访问官方文档。

5 参考资料


  • Dockerfile reference

更多 Docker 相关教程见以下内容

Docker 安装应用(CentOS 6.5_x64) http://www.linuxidc.com/Linux/2014-07/104595.htm 

Ubuntu 16.04 服务器上配置使用 Docker  http://www.linuxidc.com/Linux/2017-06/145176.htm 

Ubuntu 15.04 下安装 Docker  http://www.linuxidc.com/Linux/2015-07/120444.htm 

Docker 安装实例 http://www.linuxidc.com/Linux/2017-04/142666.htm 

Docker 创建基础镜像  http://www.linuxidc.com/Linux/2017-05/144112.htm 

在 Ubuntu 15.04 上如何安装 Docker 及基本用法 http://www.linuxidc.com/Linux/2015-09/122885.htm 

Ubuntu 16.04 上 Docker 使用手记 http://www.linuxidc.com/Linux/2016-12/138490.htm 

使用 Docker 分分钟启动常用应用  http://www.linuxidc.com/Linux/2017-04/142649.htm 

Ubuntu 16.04 下 Docker 修改配置文件不生效解决办法  http://www.linuxidc.com/Linux/2017-05/143862.htm 

Docker 的详细介绍:请点这里
Docker 的下载地址:请点这里

本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-10/147887.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计4748字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中