Docker之Dockerfile

1、Dockerfile

1.1、dockerfile的基本介绍

Dockerfile 是一个用来构建镜像的文本文件,该文本内容内包含了一条条构建镜像所需的指令和参数。Dockerfile其内部包含了一条条的指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。

DockerFile 对于 docker 镜像而言,可以理解为就如同 java 中某个类的 .class 文件对应上该类的 .java 文件。

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

  • Dockerfile是软件的原材料
  • Docker镜像是软件的交付品
  • Docker容器则可以认为是软件的运行态。

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

1.2、dockerfile内容

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

文件内容说明:

  • 每条保留字指令都必须为大写字母且后面要跟随至少一个数
  • 指令按照从上到下,顺序执行
  • 每条指令都会创建一个新的镜像层,并对镜像进行提交
  • #表示注释

2、Dockerfile常用指令

常用指令图:

2.1、FROM(指定基础镜像)

FROM:指定基础镜像,即当前镜像基于哪个镜像创建的。该指令必须为第一个命令。

示例:

FROM centos:6

2.2、MAINTAINER(指定维护者信息)

指明镜像维护者及其联系方式(一般是邮箱地址),例如:

MAINTAINER xxx <xxx@qq.com>

不过,MAINTAINER并不推荐使用,更推荐使用LABEL来指定镜像作者,例如:

LABEL maintainer="edisonzhou.cn"

2.3、RUN

镜像构建时运行的命令,例如:

RUN ["yum", "install", "httpd"]
RUN yum install vim   #安装vim模块
RUN yum install net-tools     

2.4、EXPOSE

声明容器运行的该容器暴露的服务端口,例如:

EXPOSE 80 443

2.5、CMD

启动容器时执行的Shell命令,例如:

CMD ["-C", "/start.sh"] 
CMD echo "success----ok"
CMD /bin/bash

Dockerfile 文件中可以存在多个 CMD 指令,但仅有最后一个会生效。并且 CMD 启动的程序会被 docker run 命令行最后所指定的参数所覆盖。

2.6、WORKDIR

指定在创建并运行容器后,默认进去的容器的目录。如果没有指定,将默认进去容器内的根目录 / 下。

也是为RUN、CMD、ENTRYPOINT以及COPY和AND设置工作目录,例如:

WORKDIR /data

2.7、ENV

设置环境变量,例如:

ENV MY_PATH /usr/test
ENV MYSQL_ROOT_PASSWORD 123456
ENV JAVA_HOME /usr/local/jdk1.8.0_45

设置的环境变量可以在后续的任何RUN指令中使用,也可以在其它指令中直接使用这些环境变量。比如:WORKDIR $MY_PATH

2.8、COPY

将宿主机目录下的文件或者目录拷贝进镜像中,例如:

COPY ./start.sh /start.sh

2.9、ADD

将宿主机目录下的文件或者目录拷贝进镜像中,相对于 COPY 命令的区别是如果是URL或压缩包,会自动下载或自动解压。

例如:

ADD 宿主机文件路径 镜像文件路径
ADD html.tar.gz /var/www/html
ADD https://xxx.com/html.tar.gz /var/www/html

2.10、VOLUME

指定容器挂载点到宿主机自动生成的目录或其他容器,例如:

VOLUME ["/var/lib/mysql"]

一般不会在Dockerfile中用到,更常见的还是在docker run的时候指定-v数据卷。

2.11、ENTRYPOINT

启动容器时执行的Shell命令,同CMD类似,只是由 ENTRYPOINT 启动的程序不会被 docker run 命令行指定的参数所覆盖,而且,这些命令行参数会被当作参数传递给 ENTRYPOINT 指定的程序。

例如:

ENTRYPOINT ["/bin/bash", "-C", "/start.sh"]
ENTRYPOINT /bin/bash -C '/start.sh'

Dockerfile 文件中也可以存在多个 ENTRYPOINT 指令,但仅有最后一个会生效。

2.12、ONBUILD

用于设置镜像触发器,当所构建的镜像被用做其它镜像的基础镜像,该镜像中的触发器就会被触发。

2.13、USER

指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户

# 格式:
  USER user
  USER user:group
  USER uid
  USER uid:gid
  USER user:gid
  USER uid:group

# 示例:
  USER wen

使用USER指定用户后,Dockerfile 中其后的命令 RUN、CMD、ENTRYPOINT 都将使用该用户。镜像构建完成后,通过 docker run 运行容器时,可以通过 -u 参数来覆盖所指定的用户。

原文地址:https://www.cnblogs.com/wenxuehai/p/15159370.html