http://gimg2.baidu.com/image_search/src=http%3A%2F%2Fc-ssl.duitang.com%2Fuploads%2Fitem%2F202005%2F08%2F20200508102713_L8aCB.jpeg&refer=http%3A%2F%2Fc-ssl.duitang.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1649077062&t=40b7b14053ef546a57de4934b9442cbe",

DockerFile

1、DockerFile简介

  DockerFile是由一系列命令和参数构成的脚本配置文件,可以用来快速构建自定义Docker镜像文件。其内容涉及执行代码或文件、环境变量、依赖包、运行时环境、动态链接库、操作系统发行版、服务进程、内核进程等。
  从应用软件的角度看:Dockerfile是软件原材料,docker镜像是软件交付品,docker容器是软件的运行态。Dockerfile面向开发,docker镜像成为交付标准,docker容器涉及部署和运维,三者缺一不可,共同构成Docker体系的基石。

2、DockerFile构建过程

指令从上到下,顺序执行;
执行流程:
 (1)从基础镜像开始运行一个容器;
 (2)执行一条命令并对容器进行修改;
 (3)执行类似docker commit的操作提交一个新的镜像层;
 (4)基于刚提交的镜像运行一个新的容器;
 (5)执行dockerfile中的下一条命令并对容器进行修改;
 (6)执行类似docker commit的操作提交一个新的镜像层;
 (循环.............)
 (7)直到dockerfile中的所有命令都执行完成。

3、DockerFile保留字指令

使用 # 开头来标示注释行;
每个保留字指定必须大写,且后面不能0参数;

FROM

FROM命令必须是DockerFile的第一条指令,用于指定当前镜像所基于的基础镜像,如果不以任何镜像为基础,写法为:FROM scratch。语法:

##<tag>和<digest> 指定镜像版本,缺省值为 latest
FROM <image>
FROM <image>:<tag>
FROM <image>:<digest> 

MAINTAINER

用于指定镜像维护者的姓名和邮箱地址语法:

MAINTAINER <name>

RUN

容器构建时需要运行的命令。

##格式一:(command为要执行的命令,Linux中默认:/bin/sh -c ;windows上默认:cmd /S /C)
RUN <command>
RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME
##格式二:(executable为可执行文件,param1、param2位参数)
RUN ["executable", "param1", "param2"]
 RUN ["/bin/bash", "-c", "echo hello"]

对于RUN后面多行命令一行写不下的可使用换行符 \。建议尽量少写RUN 命令,原因是Dockerfile中每一个RUN指令都会建立一层镜像,多个RUN就构建了多层镜像,容易造成镜像的臃肿、多层,不仅仅增加了构件部署的时间,还容易出错。

CMD

用于指定容器启动时要运行的命令。

##用法一:exec格式,CMD ["executable(可执行文件)","param1","param2"...]
CMD [ "sh", "-c", "echo $HOME" ]
##用法二:exec格式,CMD ["param1","param2"...]
CMD [ "echo", "$HOME" ]
##用法三:shell格式,CMD <command> <param1> <param2> ...
CMD echo $HOME

注意:因为docker将CMD后的参数解析为JSON array,故参数不能使用单引号,一定要用双引号,

RUN和CMD的区别

RUN是容器构件的时候运行的命令,并会提交运行的结果;
CMD是容器启动的时候执行的命令,在构件时并不运行,构件时只是对容器运行时需要执行的命令作了定义了;

ENTRYPOINT

用于指定容器启动时要运行的命令。

##用法一:exec格式,ENTRYPOINT ["executable", "param1", "param2"]
##用法二:shell格式,ENTRYPOINT command param1 param2

CMD和ENTRYPOINT的区别

相同点:
运行时机相同,都是在容器启动时运行;
ENTRYPOINT和CMD在dockerfile中都只能写一条,如何存在多个,那么各自都只有最后一个生效。

不同点:
docker run 命令后面的command 会被当做参数传递给ENTRYPOINT,形成新的命令组合;
docker run 命令后面的command 会覆盖掉dockerfile中的CMD命令;
当Dockerfile中同时写了ENTRYPOINT和CMD,且CMD不是一个完整的可执行命令,则CMD指定的内容将会作为ENTRYPOINT的参数。

EXPOSE

指定当前容器对外暴露的监听端口。注意:EXPOSE并不会使容器访问主机的端口,如果要使容器端口与主机端口有映射关系,要在容器启动时候使用 -P 参数指定。

EXPOSE <port>

WORKDIR

指定在容器创建后,终端登陆后的默认工作目录,未指定的缺省目录为根目录 \ ,指定不存在的目录会创建,对RUN、CMD、ENTRYPOINT、COPY、ADD命令生效

WORKDIR <dir>

ENV

用于设置在构建镜像过程中使用的环境变量,先定义,后使用

##一次设置单个环境变量
ENV <key> <value>
##一次设置多个环境变量
ENV <key1>=<value1> <key2> <value2> ...
##使用定义的环境变量
$key

ADD

将宿主机目录下的文件copy至镜像,且ADD命令会自动处理URL和解压tar压缩包。

##用法一:
ADD <src1> <src2> ... <dest>
##用法二:
ADD ["<src1>", "<src2>",..."<dest>"]

其中容器内的绝对路径,或者相对于工作目录的相对路径;是一个本地文件/压缩文件,或者一个url(类似于wget)。不建议把指定一个文件夹为,这样会复制整个目录的内容,包括文件系统元数据。

COPY

将从构建上下文目录中<源路径>的文件/目录复制到行的一层镜像内的<目标路径>位置。

##用法一:
COPY <src> <src2> ... <dest>
##用法二:
COPY ["<src>", "<src2>",..."<dest>"]

ADD和COPY的区别:

ADD有自动解压缩功能,COPY没有;
COPY的只能是本地文件,ADD的无此限制。

VOLUME

容器数据卷,可挂载本地文件夹或其他容器中的文件夹,用于数据的保存和持久化工作。

##用法: ["/data"]可以是一个JsonArray ,也可以是多个值
VOLUME ["/data"]
##示例:
VOLUME ["/var/data/"]
VOLUME /var/data
VOLUME /var/data /var/log

ONBUILD

当构建一个被继承的Dockerfile时运行的命令,在有子镜像继承此父镜像后,在子镜像构建时触发ONBUILD命令。

##用法:ONBUILD [INSTRUCTION]
ONBUILD RUN ls -al

4、DockerFile示例

  DockerFile主体内容四要素:基础镜像信息、维护者信息、镜像操作指定、容器启动时执行指令。
  DockerFile构建三步骤:编写、docker build 、docker run 。

from centos
ENV  logindir /tmp
WORKDIR $logindir
RUN yum -y install vi
RUN yum -y insatll net-tools
EXPOSE 80

5、本地镜像发布至阿里云

##制作本地镜像
docker commit -a deepinthought -m "just a test images" [container id] [imagename]:[tag]
##登陆阿里云
sudo docker login --username= deepinthought registry.cn-hangzhou.aliyuncs.com
##关联标签、版本号
sudo docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/deepinthought/testimages:[镜像版本号]
##推送镜像
sudo docker push registry.cn-hangzhou.aliyuncs.com/deepinthought/testimages:[镜像版本号]
posted @ 2019-05-28 00:20  DeepInThought  阅读(481)  评论(0编辑  收藏  举报