入门Docker File构建Docker镜像

作者: 昊炜 分类: 技术 发布时间: 2017-06-22 16:33

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

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

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

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

FROM Ubuntu
FROM Ubuntu:latest

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

(2).MAINTAINER 用于标注镜像创建者的信息,无格式限制,具体用法为MAINTAINER <information>:

MAINTIANER Steven, admin@pcap.xyz

(3).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

(4).CMD 用于设置容器在启动时运行的脚本和命令,主要目的是为执行容器提供默认值,因此在使用docker run创建并运行容器或docker start启动容器时将运行对应的脚本或命令,需要注意的是,CMD仅能在Dockerfile中使用1次。

CMD echo "hello"

(5).ENTRYPOINT 用于将配置容器在启动时运行指定的脚本或程序,命令格式为ENTRYPOINT [“executable”, “param1”, “param2”] 或
ENTRYPOINT command param1 param2,docker run <镜像>命令的参数将会指定为可执行入口点的参数,将会覆盖CMD命令所提供的默认参数,具体用法为:

ENTRYPOINT ["/usr/sbin/nginx"]

(6).EXPOSE 用于通知容器在运行时监听指定的网络端口,并不对外暴露,若需要暴露端口,映射到主机端口,需要用docker run命令中的-p选项,EXPOSE 具体用法为:

EXPOSE 3306

(7).ENV 用于指定具体环境变量的值,其格式为ENV <键> <值>,具体用法为:

ENV MYSQL_ROOT_PASSWORD 123456

(8). ADD 用于将主机构建环境(上下文)目录中的文件和目录、以及一个URL标记的文件拷贝到镜像中,指令格式为ADD <源>… <目的>或ADD [“<源>”,… “<目的>”],指令执行后会将命令中指定的文件或目录或远程文件URL指定的文件拷贝到镜像文件系统路径当中,路径格式与linux中的路径格式基本一致,要注意的是在源文件为归档文件的情况下,会被解压缩。具体用法为:

ADD test1.txt test1.txt

(9).COPY 用于向镜像中添加文件,指令格式为COPY <源>… <目的>或COPY [“<源>”,… “<目的>”],虽然用法看起来与ADD命令类似,但是COPY命令是一个目的性更强的命令,COPY命令也不会自动解压可识别的归档文件,也不能用于从远程文件URL拉取文件。具体用法为:

ADD /usr/test.tar.gz /etc/nginx/conf.d/

(10).VOLUME 用于创建一个指定名称的挂载点,并标记为保存在主机或其他容器并从外部挂载的卷,该目录下的内容存储在来源卷中,若需要将主机指定目录挂载至容器中指定目录时,需要使用docker run -v选项,VOLUME具体用法为:

VOLUME /data

(11).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

发表评论

电子邮件地址不会被公开。 必填项已用*标注