docker file的编写

一个dockerfile的形成

从#的注释看起,1  首先表明这个Dockerfile用的是ubuntu镜像,2  然后注明镜像的版本是EDITION 1,3  接着说明镜像的作者是docker_user,4  最后说明下命令的格式。

 

 

1  FROM ubuntu的意思是这个镜像是基于ubuntu镜像创建的。一般的Dockerfile都是基于某个纯净版的基本镜像构建,所以开始就会注明镜像的来源地址,镜像是一层一层叠加的,初始化的镜像再最下边。

2 MAINTAINER是这个镜像的创始人和维护者.

3 RUN 创建镜像前的一些环境一般基于一些环境的搭建    Dockerfile最重要的内容,镜像的特性就是通过这段代码来实现的。这段代码展示的是镜像生成的时候需要做哪些操作,这些操作一般都是一些命令。

4 CMD命令最后一段内容表示的是镜像做好后变成容器需要运行的命令。这里一般是一个服务的启动命令,比如上面示例中表示的就是启动nginx服务。

 

过程步骤理解:如基于centos镜像  首先做时间的对应,yum源的配置。  安装命令所需依赖包。再依赖nginx镜像对外提供web服务。

 

docker file指令详解:

1 RUN命令:类似于linux系统最后的shell的命令  使用特殊字符完成文件的追加 和重建   使用sed命令可以对文件进行替换。由于镜像层级关系的缘故 可以使用多个&&字符连接起来。

2 CMD命令:如果换成exec格式,上面那条命令就等于CMD["sh","-c","cat/etc/redhat-release"]。所以,CMD后面如果跟的是shell命令,那么实际底层运行是用exc的sh-c方式。再比如,CMD后面写的是systemctl start mysqld,那么就等于CMD["sh","-c","systemctl start mysqld"]。  就是使用 sh -c ”进去容器后执行的命令“

2.1这个CMD命令一般是在Dockerfile最后才写的,Dockerfile前面的内容都是为配置环境做一些准备,等都做得差不多了,最后一句就是CMD启动容器主进程的指令,类似Docker的开机启动项。

 

3  ENTRYPOINT指令
ENTRYPOINT一般和CMD配合使用,CMD里的内容可以作为参数传到ENTRYPOINT里使用。官网是这么介绍ENTRYPOINT指令的:ENTRYPOINT指令可以让你的容器功能表现得像可运行程序一样。

功能:

3.1列如再dockerfile文件中添加了此条内容    ENTRYPOINT ["/bin/cat”]

那么这个做成后的镜像运行时将带有cat的功能。我们在运行这个镜像的时候写上一个文件路径,那么就会返回输出这个文件内容。

$ docker run -it image_test_entrypoint /etc/fstab
其中,image_test_entrypoint是假设做好的镜像名字。
运行这个命令后,结果将是输出/etc/fstab文件的内容。

 

3.2  列:

FROM centos:7.2

ENTRYPOINT ["vmstat","3"]
CMD ["5"]
ENTRYPOINT里原本运行的是每隔3秒输出vmstat监控信息,然后有了CMD参数,传入了一个数字5,表示vmstat结果只能输出5次。同理,还可以看看下面这个top命令的Dockerfile,道理都差不多。

ENTRYPOINT可以定义一些初始化的命令、参数甚至脚本,做成的镜像更像一个可运行程序,我们可以把它当作工具反复使用。所以,有些场景如果想把容器做成工具,可以使用ENTRYPOINT。不过得注意的是,整个Dockerfile里ENTRYPOINT只能使用一次,如果写了多个,那么生效的是最后一个。

 

4.COPY指令
在构建Docker镜像的时候,肯定涉及把某个文件、脚本从某个路径复制到另外一个路径的操作。可以用COPY命令去完成这一操作。

命令格式如下所示。
COPY<源路径>...<目标路径>
COPY["<源路径1>",..."<目标路径>"]
比如我们复制install.sh这个脚本到/opt/shell下,就可以这样写:
COPY install.sh /opt/shell
而且这个命令也支持通配符,比如用*和?,跟Linux命令一样。
COPY install* /opt/shell
COPY install /opt/shell
注意,这里的目标路径就是容器里面的目标路径,如果事先没创建也没关系,运行的时候会自动创建。

 

5.ADD指令 可以自动解压缩包    可以链接URL
ADD指令和COPY指令有点儿类似,但是ADD指令相对高级些。高级在哪儿呢?高级在ADD指令不仅能复制,还能自动解压缩。比如我们想复制一个mysql.tar.gz到/opt下面,如果使用COPY指令就是单纯地把mysql.tar.gz复制到/opt下。如果使用ADD指令,就不仅仅是复制过去了,同时还会解压缩这个tar包。

 

 6 ENV指令

大家看到ENV这个词,应该差不多能猜到它是什么意思了,ENV就是环境变量(environment variables)的缩写。在Dockerfile里,我们也经常要定义一些环境变量。语法如下:
单个变量:ENV<key><value>
多个变量:ENV<key1>=<value1><key2>=<value2>...