基础概念
Dockerfile是什么?
Docker为我们提供的一个用于自定义构建镜像的一个配置文件:描述如何构建一个对象;利用Docker提供的build命令,指定Dockerfile文件,就可以按照配置的内容将镜像构建出来
为什么需要Dockerfile?
作为开发者需要将自己开发好的项目打包成Docker镜像
作为运维人员需要构建更精简的基础设施服务镜像,满足公司需求以及尽可能减少冗余的功能占用过多的资源
Dockerfile能做什么?
1、 可以自定义镜像内容
2、 构建公共基础镜像减少其他镜像配置
3、 开源程序的快速部署
4、 实现企业内部项目的快速交付
常用命令
FROM
指定以什么镜像作为基础镜像,在改进项的基础之上构建新的镜像。 如果不想以任何镜像作为基础:FORM search
语法:
FROM <image>
FROM <image>:<tag>
FROM <image>:<digest>
以上三种写法,后两者为指定具体版本,第一种则使用latest即最新版本
MAINTAINER
描述作者信息
LABEL
为镜像设置标签,一个Dockerfile中可以配置多个LABEL
语法:
LABEL<key>=<value>
如:
LABEL "example.label"="Example Label"
LABEL label-value="LABEL"
LABEL version="1.0.0"
LABEL description="可以写多行,使用'\'符号可以拼接多行的value"
ENV
设置容器的环境变量,可以设置多个
语法:
ENV <key> <value>
ENV <key>=<value> <key>=<value> ...
两种语法的区别为:第一种只能设置一个环境变量,第二个可以一次设置多个
RUN
构建镜像过程中要执行的命令
语法:
RUN <command>
RUN ["executable", "param1", "param2"]
第一种写法就是直接写Shell脚本即可
第二种写法类似函数调用,第一个参数为可执行文件,后面的都是参数
ADD
复制命令,把src的文件复制到镜像的dest位置
语法:
ADD <src> <dest>
ADD ["<src>","<dest>"]
WORKDIR
WORKDIR /app
在设置完工作目录后,执行pwd命令,打印的目录就是/app
VOLUME
设置挂载目录,可以将主机中的指定目录挂载到容器中
语法:
VOLUME ["<dir>"]
VOLUME <dir>
VOLUME <dir> <dir>
以上三种写法都可
EXPOSE
该镜像运行容器后,需要暴露给外部的端口,但仅仅表示该容器想要暴露某些端口,并不会与主机端口有映射关系,如果想将容器暴露的端口与主机映射则需要使用-p或-P参数来映射,可以暴露多个端口
语法:
EXPOSE <port>/<tcp/udp>
CMD 和 ENTRYPOINT
CMD 和 ENTRYPOINT选择其一即可,作用是描述镜像构建完成后,启动容器时默认执行的脚本
CMD: 该镜像启动容器时默认执行的命令或参数
语法:
CMD ["executable", "param1", "param2"]
CMD ["param1", "param2"]
CMD <command> <param1> <param2>
以上为该命令的三种写法,第三种与普通Shell命令类似,第一、二两种都是可执行文件+参数形式,另外数组内的参数必须使用双引号。
ENTRYPOINT: 运行容器时的启动命令,感觉与CMD命令很像,实际上还是有很大区别,简单对比一下:
语法:
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2
相同点: 在整个Dockerfile中只能设置一次,如果写了多次则只有最后一次生效
不同点:
-
ENTRYPOINT不会被运行容器时指定的命令所覆盖,而CMD会被覆盖
-
如果同时设置了这两个指令,且CMD仅仅是选项而不是参数,CMD中的内容会作为ENIRYPOINT的参数(一般不这么做)
-
如果两个都是完整命令,那么只会执行最后一条
构建镜像
commit指令
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
例:
docker commit -a="wolfcode" -m="first image" contos7 mycentos
OPTIONS:
-a:镜像作者
-c:使用Dockerfile指令来构建镜像
-m:提交时的描述
-p:在commit时暂停容器