Dockerfile详解

一、概念

Dockerfile 是用来构建 Docker 镜像的构建文件,是由一系列命令和参数构成的脚本。

使用Dockerfile可以创建自定义镜像,Dockerfile 由一行行命令语句组成,并且支持以 # 开头的注释行。

二、构建步骤

  • 编写Dockerfile文件
  • docker build
  • docker run

Dockerfile 样例

#使用的基础镜像
FROM centos
#作者信息
MAINTAINER by zhengjiang (99514925@qq.com)
 
#创建目录
RUN mkdir -p /java/jdk1.8.0_121
#把当前目录下的jdk文件夹添加到镜像
ADD jdk /java/jdk1.8.0_121
 
#创建tomcat目录
RUN mkdir -p /java/apache-tomcat-8.0.35
#把当前目录下的tomcat文件夹添加到镜像
ADD tomcat /java/apache-tomcat-8.0.35
 
#添加环境变量
ENV JAVA_HOME /java/jdk1.8.0_121
ENV CATALINA_HOME /java/apache-tomcat-8.0.35
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin
 
#暴露8080端口
EXPOSE 8080
 
#启动时运行tomcat
CMD ["/java/apache-tomcat-8.0.35/bin/catalina.sh","run"]

Dockerfile 文件组成:

分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。

三、指令

指令的一般格式为 INSTRUCTION arguments ,指令包括 FROM 、 MAINTAINER 、 RUN 等。

1、FROM

格式为 FROM <image> 或 FROM <image>:<tag>

image:镜像名称

第一条指令必须为 FROM 指令。并且,如果在同一个Dockerfile中创建多个镜像时,可以使用多个 FROM 指令(每个镜像一次)。

 

2.MAINTAINER

格式为 MAINTAINER <name> ,指定维护者信息。

3.RUN

格式为 RUN <command> 或 RUN ["executable", "param1", "param2"]

前者将在 shell 终端中运行命令,即 /bin/sh -c ;后者则使用 exec 执行。指定使用其它终端可以通过 第二种方式实现,例如 RUN ["/bin/bash", "-c", "echo hello"]

每条 RUN 指令将在当前镜像基础上执行指定命令,并提交为新的镜像。当命令较长时可以使用 \ 来换 行。

 

4.CMD

支持三种格式

  1. CMD ["executable","param1","param2"] 使用 exec 执行,推荐方式;
  2. CMD command param1 param2 在 /bin/sh 中执行,提供给需要交互的应用;
  3. CMD ["param1","param2"] 提供给 ENTRYPOINT 的默认参数;

指定启动容器时执行的命令,每个 Dockerfile 只能有一条 CMD 命令。如果指定了多条命令,只有最后一条 会被执行。

如果用户启动容器时候指定了运行的命令,则会覆盖掉 CMD 指定的命令

 

5.EXPOSE

格式为 EXPOSE <port> [<port>...]

告诉 Docker 服务端容器暴露的端口号,供互联系统使用。在启动容器时需要通过 -P,Docker 主机会自动 分配一个端口转发到指定的端口

 

6.ENV

格式为 ENV <key> <value> 。 指定一个环境变量,会被后续 RUN 指令使用,并在容器运行时保持 例如:

#添加环境变量

ENV CATALINA_HOME /java/apache-tomcat-8.0.35

ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin

 

7.ADD

格式为 ADD <src> <dest>

该命令将复制指定的 <src> 到容器中的 <dest> 。 其中 <src> 可以是Dockerfile所在目录的一个相对路径;也可以是一个 URL;还可以是一个 tar 文件(自动解压为目录)

8.COPY

格式为 COPY <src> <dest>

  1. 复制本地主机的 <src> (为 Dockerfile 所在目录的相对路径)到容器中的 <dest>
  2. 当使用本地目录为源目录时,推荐使用 COPY

9.ENTRYPOINT

两种格式:

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

ENTRYPOINT command param1 param2 (shell中执行)

配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖

每个 Dockerfile 中只能有一个 ENTRYPOINT ,当指定多个时,只有最后一个起效

10.VOLUME

格式为 VOLUME ["/data"]

创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等

 

11.USER

格式为 USER daemon

指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户

当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户,例 如: RUN groupadd -r postgres && useradd -r -g postgres postgres 。要临时获取管理员权限可以 使用 gosu ,而不推荐 sudo 。

12.WORKDIR

格式为 WORKDIR /path/to/workdir

为后续的 RUN 、 CMD 、 ENTRYPOINT 指令配置工作目录

可以使用多个 WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。例如

WORKDIR /a

WORKDIR b

WORKDIR c

RUN pwd

则最终路径为 /a/b/c

13.ONBUILD

格式为 ONBUILD [INSTRUCTION]

配置当所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令

例如,Dockerfile 使用如下的内容创建了镜像 image-A

[...]

ONBUILD ADD . /app/src

ONBUILD RUN /usr/local/bin/python-build --dir /app/src

[...]

如果基于 image-A 创建新的镜像时,新的Dockerfile中使用 FROM image-A 指定基础镜像时,会自动执行 ONBUILD 指令内容,等价于在后面添加了两条指令

FROM image-A

#Automatically run the following

ADD . /app/src

RUN /usr/local/bin/python-build --dir /app/src

使用 ONBUILD 指令的镜像,推荐在标签中注明,例如 ruby:1.9-onbuild

 

四、创建镜像

 

编写完成 Dockerfile 之后,可以通过 docker build 命令来创建镜像

基本的格式为 docker build [选项] 路径

docker build -f Dockerfile路径 -t 新镜像名:TAG

[root@192]# docker build -t myrepo/myapp /tmp/test1/

要指定镜像的标签信息,可以通过 -t 选项

该命令将读取指定路径下(包括子目录)的 Dockerfile,并将 该路径下所有内容发送给 Docker 服务端,由服务端来创建镜像。因此一般建议放置 Dockerfile 的目录为空 目录。也可以通过 .dockerignore 文件(每一行添加一条匹配模式)来让 Docker 忽略路径下的目录和文 件。

 

五、Dockerfile 执行流程

  1. docker 从基础镜像运行一个容器
  2. 执行一条指令并对容器做出修改
  3. 执行类似 docker commit 指令提交一个新的镜像层
  4. docker 再基于刚提交的镜像运行一个新容器
  5. 执行 dockerfile 中的下一条指令直到所有指令都执行完成

 

六、Dockerfile、Docker镜像和Docker容器三者关系

Dockerfile:需要定义一个 Dockerfile,Dockerfile 定义了进程需要的一切东西。Dockerfile 设计的内容包括执行代码或者文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版本、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道时,需要考虑如何设计 namespace 的权限控制)等。

Docker 镜像:在用 Dockerfile 定义一个文件后,docker build 会产生一个 Docker 镜像,当运行 Docker 镜像时,才真正开始提供服务。

Docker 容器:容器是直接提供服务的。

 

从应用软件的角度来看,Dockerfile、Docker镜像和Docker容器分别代表软件的三个阶段:

  • Dockerfile:软件的原材料
  • Docker镜像:软件的交付品
  • Docker容器:软件的运行状态

Dockerfile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker体系的基石。

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值