IT工程师都需要掌握的容器技术之Dockerfile

开发 前端
今天我们继续来学习Docker技术,本篇文章主要介绍Dockerfile,Dockerffile是一个文本文件,Docker通过读取Dockerfile文件来自动构建镜像。

 今天我们继续来学习Docker技术,本篇文章主要介绍Dockerfile,Dockerffile是一个文本文件,Docker通过读取Dockerfile文件来自动构建镜像。

下面就由成哥来介绍Dockerfile的语法及使用方法吧!

01 Dockerfile概述

Dockerfile相当于一个文档,用户可以基于dockerfile生产新的容器。Dockerfile仅仅是用来制作镜像的源码文件,是构建容器过程中的指令,docker能够读取dockerfile的指令进行自动构建容器,基于dockerfile制作镜像,每一个指令都会创建一个镜像层,即镜像层是多层叠加的,镜像层数越多,效率越低。所以创建镜像时尽量通过越少的指令完成需要的动作。Docker通过dockerfile进行build及build后的镜像运行流程逻辑如下图所示。

 

IT工程师都需要掌握的容器技术之Dockerfile

 

02 Dockerfile的编写

(1) 上下文

上下文就是指我们build Docker镜像时Dockerfile文件所在的目录,构建镜像是由Docker守护程序而不是CLI运行的,该过程的第一件事是将 Dockerfile 文件所在目录下的所有内容递归的发送到守护进程。所以在大多数情况下,最好是创建一个新的目录,在其中保存 Dockerfile,并在其中添加构建 Dockerfile 所需的文件。

现在我们就在系统中创建一个空目录以便下面Dockerfile文件的创建及后面的镜像构建

 

IT工程师都需要掌握的容器技术之Dockerfile

 

(2) Dockerfile格式

Dockerfile的语法格式如下所示:

 

  1. 1. # 格式为语法+参数   
  2. 2. INSTRUCTION arguments   

 

该指令不区分大小写。但是,约定将它们大写,以便更轻松地将它们与参数区分开。Dockerfile按顺序运行指令。

(3) Dockerfile常用指令

1)FROM

一个Dockerfile 必须以开始FROM的指令。使用FROM指令指定一个基础镜像,后续指令将在此镜像的基础上运行,在一个Dockerfile文件中FROM可以出现多次,下面我们来看看FROM的语法格式

  1. 1. FROM [--platform=<platform>] <image> [AS <name>]   

我们创建一个Dockerfile文件,其中FROM指定以centos为基础镜像

 

  1. 1. # 指定以centos为基础镜像进行build   
  2. 2. FROM centos   

 

2)WORKDIR

WORKDIR用于指定工作目录,所有执行的shell语句都会在该指定的目录中运行,我们后面讲的 RUN,CMD,COPY,ADD 等指令将会在指定的工作目录中去执行。该指令也可以在一个Dockerfile文件中出现多次,最后一次出现的目录依次是上个目录的子目录。如下所示:

 

  1. 1. WORKDIR /a   
  2. 2. WORKDIR b   
  3. 3. WORKDIR c   
  4. 4. RUN pwd   

 

最后这个pwd的命令执行的目录为/a/b/c。我们继续基于上面的指令来指定WORKDIR目录为'/'

 

IT工程师都需要掌握的容器技术之Dockerfile

 

3)RUN

RUN 指令用于执行命令,该指令有两种形式:

a. RUN ,使用 shell 去执行指定的命令 command,一般默认的 shell 为 /bin/sh -c

b. RUN ["executable", "param1", "param2"],使用可执行的文件或程序后面并可以跟上相关参数

下面我们通过这两种形式来创建执行命令

 

  1. 1. # 第一种RUN指令方式   
  2. 2. RUN yum update   
  3. 3.    
  4. 4. # 第二种RUN指令方式   
  5. 5. RUN ["/bin/bash""-c""echo hello"]  

4)CMD

CMD 的使用方式跟 RUN 类似,其跟RUN的区别是RUN是在构建镜像是运行执行而CMD是容器运行后执行的指令。在一个 Dockerfile 文件中只能有一个 CMD 指令,如果有多个 CMD 指令,则只有最后一个会生效。CMD也有三种命令格式具体如下

 

  1. 1. # 第一种执行命令推荐用法   
  2. 2. CMD ["executable","param1","param2"]   
  3. 3.    
  4. 4. # 第二种该格式主要配合ENTRYPOINT使用,CMD 指令的值会作为 ENTRYPOINT 指令的参数   
  5. 5. CMD ["param1","param2"]   
  6. 6.    
  7. 7. # 第三种执行shell form,该方法与第一种的执行效果一致   
  8. 8. CMD command param1 param2    

 

我们通过第一种方式来创建来执行wc的帮助指定具体如下

 

  1. 1. CMD ["/usr/bin/wc","--help"]   

第二种方法需要在Dockerfile中使用ENTRYPOINT指令,ENTRYPOINT 指令会覆盖 CMD 指令作为容器运行时的默认指令,并且不会在 docker run 时被覆盖,如下示例

 

  1. 1. FROM centos   
  2. 2. ENTRYPOINT ["ls""-a"]   
  3. 3. CMD ["-l"]   

 

上述构建的镜像,在我们使用 docker run 时等同于 docker run ls -a l 命令。CMD 指令的值会被当作 ENTRYPOINT 指令的参数附加到 ENTRYPOINT 指令的后面,并且如果 docker run 中指定了参数,会覆盖 CMD 中给出的参数。

5)COPY&ADD

COPY 和 ADD 都用于将文件,目录等复制到镜像中。两者的区别在于ADD可以使用远程URL路径作为复制源,如果只复制本地文件建议使用COPY,两个指令的语法格式如下:

 

  1. 1. # ADD命令格式   
  2. 2. ADD [--chown=<user>:<group>] <src>... <dest>   
  3. 3. ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]   
  4. 4.    
  5. 5. # COPY命令格式   
  6. 6. COPY [--chown=<user>:<group>] <src>... <dest>   
  7. 7. COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]   

--chown用于指定文件目录用户与权限, 可以指定多个,但是其路径不能超出上下文的路径,即必须在跟 Dockerfile 同级或子目录中。 不需要预先存在,不存在路径时会自动创建,如果没有使用绝对路径,则 为WORKDIR指定目录的相对路径。

6)ENV

ENV用于定义Dockerfile的环境变量,变量设置的值将在构建阶段中所有后续指令的环境中使用,并且在许多情况下也可以内联替换。其命令格式如下:

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

使用示例如下

 

  1. 1. # $MYDIR将被替换成"/mydir"   
  2. 2. ENV MYDIR="/mydir"   
  3. 3. RUN mkdir $MYDIR   

 

7)VOLUME

VOLUME用于在Dockerfile文件中指定挂载目录,在容器运行时,将自动创建相应的匿名卷,其命令格式如下

 

  1. 1. VOLUME ["/data"]   

该条命令会在容器运行时创建一个匿名卷,同时将容器中/data目录挂载到该卷上。

8)EXPOSE

EXPOSE指令通知Docker容器在运行时监听指定的网络端口。您可以指定端口是侦听TCP还是UDP,如果未指定协议,则默认值为TCP。EXPOSE指令实际上并未发布端口。它充当构建映像的人员和运行容器的人员之间的一种文档类型,有关打算发布哪些端口的信息。如果要将容器端口暴露出来,需要在 dcoker run 命令中使用 -p。

EXPOSE指令格式与用法示例如下:

 

  1. 1. # EXPOSE命令格式   
  2. 2. EXPOSE <port> [<port>/<protocol>...]   
  3. 3.    
  4. 4. # 使容器同时监听TCP与UDP的80端口   
  5. 5. EXPOSE 80/tcp   
  6. 6. EXPOSE 80/udp   

 

03 Dockerfile镜像构建

我们现在通过Dockerfile来构建一个nginx服务器,Dockerfile具体配置如下:

 

  1. 1. # 指定基础镜像   
  2. 2. FROM centos   
  3. 3.    
  4. 4. # 设置环境目录   
  5. 5. WORKDIR /   
  6. 6.    
  7. 7. # 安装nginx   
  8. 8. RUN yum install nginx -y   
  9. 9.    
  10. 10. # 容器对外暴露80端口   
  11. 11. EXPOSE 80   
  12. 12.    
  13. 13. # 启动nginx   
  14. 14. CMD ["/usr/sbin/nginx""-g""daemon off;"]   

 

接着通过该Dockerfile文件进行镜像构建,具体如下

 

IT工程师都需要掌握的容器技术之Dockerfile

 

 

IT工程师都需要掌握的容器技术之Dockerfile

 

最后我们启动容器,同时查看nginx服务是否能够访问,具体操作如下

 

IT工程师都需要掌握的容器技术之Dockerfile

 

 

IT工程师都需要掌握的容器技术之Dockerfile

 

 

IT工程师都需要掌握的容器技术之Dockerfile

 

责任编辑:华轩 来源: 今日头条
相关推荐

2020-11-25 09:27:49

Docker容器技术

2020-10-19 09:32:49

容器Docker管理

2020-10-26 15:11:50

Docker容器IT

2020-10-27 10:52:37

Docker容器存储

2010-08-10 13:22:41

2020-03-17 15:15:49

Python工程师面试题

2020-07-22 14:50:35

Python数据分析

2022-08-12 09:21:43

前端JavaScript代码

2020-08-05 08:25:58

大数据Java技术

2021-03-31 22:25:46

运维工程师技能

2017-09-22 08:33:34

机器学习Web设计UI

2013-08-15 09:47:27

企业网络简化网络工程师

2010-08-10 13:29:58

软件工程师

2012-03-31 16:57:52

工程师创业团队

2021-03-09 10:47:56

系统架构师算法工程师人工智能工程师

2021-03-09 10:24:46

数学计算机系统架构师

2021-03-24 15:15:34

数据工程师开发工具

2018-12-29 15:10:22

工程师爬虫Python

2012-02-13 17:13:00

2013-12-23 09:09:29

网络工程师技术愿望2014
点赞
收藏

51CTO技术栈公众号