入门 Dockerfile 构建 Docker 镜像

Dockerfile 是一种被 Docker 程序解释的脚本,由多条指令组成,具有独特的书写格式和支持的命令,Docker 程序将读取 Dockerfile,根据指令生成定制的 image。有了 Dockerfile,当我们需要定制自己额外的需求时,只需在 Dockerfile 上添加或者修改指令,重新生成 image 即可。与 Pull 命令不同的是,Dockerfile 提供了一个简单快捷的定制化途径,而 pull 命令仅能从 hub 或者其他镜像源中拉取官方镜像或者是又其他开发者定制好的镜像。

Dockerfile 的书写规则及常用命令使用方法

Dockerfile的编写格式一般为<命令> <形式参数>,#为注释,不区分大小写,一般命令使用大写字母。

  • FROM 用于设置基础镜像,使用Dockerfile建立镜像时必须指定一个镜像作为基础,该命令用法为 FROM <image>FROM <image>:<tag> 两种:
FROM Ubuntu
FROM Ubuntu:latest

在不带参数的时候会默认为latest,参数不可省略,创建镜像时,会自动拉去指定镜像源中指定的基础镜像,若本地存在该镜像则直接使用。

  • MAINTAINER 用于标注镜像创建者的信息,无格式限制,具体用法为 MAINTAINER <information>
MAINTIANER Steven, admin@pcap.xyz
  • RUN 用于在所设置的镜像上运行所需的命令和脚本,可以使用shell脚本语句镜像会被具体的指令进行对应的修改,具体用法为 RUN <命令>
RUN apt-get update
RUN apt-get install vim
RUN wget http://sourceforge.net/projects/phpmyadmin/files/phpMyAdmin/4.3.6/phpMyAdmin-4.3.6-all-languages.tar.gz
RUN tar -zxvf phpMyAdmin-4.3.6-all-languages.tar.gz
  • CMD 用于设置容器在启动时运行的脚本和命令,主要目的是为执行容器提供默认值,因此在使用 docker run 创建并运行容器或 docker start 启动容器时将运行对应的脚本或命令,需要注意的是,CMD仅能在Dockerfile中使用1次。
CMD echo "hello"
  • ENTRYPOINT 用于将配置容器在启动时运行指定的脚本或程序,命令格式为 ENTRYPOINT ["executable", "param1", "param2"]ENTRYPOINT command param1 param2docker run <镜像> 命令的参数将会指定为可执行入口点的参数,将会覆盖CMD命令所提供的默认参数,具体用法为:
ENTRYPOINT ["/usr/sbin/nginx"]
  • EXPOSE 用于通知容器在运行时监听指定的网络端口,并不对外暴露,若需要暴露端口,映射到主机端口,需要用 docker run 命令中的 -p 选项,EXPOSE 具体用法为:
EXPOSE 3306
  • ENV 用于指定具体环境变量的值,其格式为 ENV <键> <值>,具体用法为:
ENV MYSQL_ROOT_PASSWORD 123456
  • ADD 用于将主机构建环境(上下文)目录中的文件和目录、以及一个URL标记的文件拷贝到镜像中,指令格式为 ADD <源>... <目的>ADD ["<源>",... "<目的>"],指令执行后会将命令中指定的文件或目录或远程文件URL指定的文件拷贝到镜像文件系统路径当中,路径格式与linux中的路径格式基本一致,要注意的是在源文件为归档文件的情况下,会被解压缩。具体用法为:
ADD test1.txt test1.txt
  • COPY 用于向镜像中添加文件,指令格式为 COPY <源>... <目的>COPY ["<源>",... "<目的>"],虽然用法看起来与ADD命令类似,但是COPY命令是一个目的性更强的命令,COPY命令也不会自动解压可识别的归档文件,也不能用于从远程文件URL拉取文件。具体用法为:
ADD /usr/test.tar.gz /etc/nginx/conf.d/
  • VOLUME 用于创建一个指定名称的挂载点,并标记为保存在主机或其他容器并从外部挂载的卷,该目录下的内容存储在来源卷中,若需要将主机指定目录挂载至容器中指定目录时,需要使用 docker run -v 选项,VOLUME具体用法为:
VOLUME /data
  • WORKDIR 用于给RUN,CMD等后续命令提供工作路径,即使在后续命令中没有用到,工作路径也会被自动创建。WORKDIR命令可以在Dockerfile中出现多次,后续的WORKDIR声明会是前面声明的目录的相对路径
WORKDIR /
WORKDIR var
WORKDIR test
#此时工作路径为 /var/test/
#注:CMD和ENTRYPOINT等命令中使用json数组作为命令参数由于自己用的较少,故暂不做专门介绍

Dockerfile示例:

FROM Ubuntu

MAINTIANER Steven

WORKDIR ~/

ENV MYSQL_ROOT_PASSWORD 123456

RUN apt-get update
RUN apt-get install vim nginx mysql-server
RUN mkdir /var/www && chmod 777 /var/www

COPY ./nginx.conf /etc/nginx/nginx.conf

EXPOSE 3306