Docker_03_Dockerfile
@
Dockerfile
DockerFile:基于DSL(Domain Specific Language)语法,构建Docker镜像
1)本质:通过脚本定义文件和docker bulid命令构建镜像;
2)文件中一行一个命令(每个命令代表一层镜像);
3)文件中的各种命令都必须是大写的
通过Dockerfile上传镜像流程:
1)编写DockerFile文件;
2)使用Docker build使脚本文件生成镜像;
3)使用Docker run运行镜像;
4)使用Docker push 发布镜像(公有或私有)
Dockerfile构建
Dockerfile和docker bulid构建镜像流程:
1)创建用于存储Dockerfile文件的目录(每个Dockerfile独占一个目录);
2)在创建目录下,创建并编写Dockerfile文件;
3)编写完成并保存后,通过docker build构建镜像;
构建环境(Build environment):存储Dockerfile的目录;
1)构建时,会将构建上下文中和该构建上下文中的文档上传到Docker守护进程
//也可成为上下文(context)或构建上下文(Build context)
DockerFile编写:
1)每个指令都必须是大写字母
2)执行顺序是从上到下
3)每一个指令都会提交一个新的镜像层
4)“#”代表注释
Dockerfile中所含指令
指令 | 含义 |
---|---|
FROM | 指定基础镜像 必须是DockerFile中第一个指令 |
LABEL | 镜像添加元数据 常用于指定镜像的作者、版本和简介等信息 |
USER | 指定运行容器时的用户/用户组 RUN、CMD、ENTRYPOINT也默认使用该用户 |
WORKDIR | 指定镜像的内部登入/工作目录(可多次使用) |
EXPOSE | 声明容器暴露的端口,但并不会暴露该端口 若运行时使用随机暴露端口,自动暴露EXPOSE指定端口 |
ARG | 设置镜像编译时的环境变量 |
ENV | 设置镜像运行的环境变量 |
ADD | 编译镜像时从主机/远端拷贝资源到镜像中 |
COPY | 编译镜像只能从主机拷贝资源到镜像中 |
RUN | 编译镜像时运行的脚本/命令 (默认使用/bin/sh -c执行) |
VOLUME | 指定容器挂载的数据卷 |
ONBUILD | 镜像添加触发器 |
CMD | 以替代形式指定容器启动时运行的命令 |
ENTRYPOINT | 以追加形式设置容器启动时运行的命令 |
(1)FROM格式:FROM 镜像名
1)Dockerfile从FROM语句开始运行,且FROM可出现多次
2)“scratch”是一个空白镜像(Docker Hub上大部分镜像都从该镜像开始)
(2)LABEL格式:LABEL 元数据1=值1 元数据N=值N
1)建议所有的元数据放到一条LABEL指令中,防止创建过多镜像层
(3)USER格式:USER 用户名:用户组
1)可仅指定用户名/用户组,且用户名/用户组可使用名称或UID形式表示;
2)若没有USER指令,默认以root身份运行
3)可被“docker run -u 用户名:用户组”命令所替代
(4)WORKDIR格式:WORKDIR 目录路径
1)RUN、CMD、ENTRYPOINT、COPY、ADD指令都在该目录下执行
2)可被“docker run -w 路径”命令替代
(5)EXPOSE格式:EXPOSE 端口号
(6)ARG格式1:ARG 变量名
ARG格式2:ARG 变量名=变量值
1)格式2为变量名指定了默认变量值
//若构建时不为变量指定值,则使用默认值
(7)ENV格式:ENV 变量名 变量值
ENV格式2:ENV 变量名1=变量值1 变量名N=变量值N
1)创建多个变量时,变量名和变量值使用“=”连接(多个变量之间空格分隔);
2)调用生成的变量只需在变量名在添加“$”(创建时不需);
3)在变量前添加“\”代表转义
(8)ADD格式:ADD 源文档路径 目的路径
1)源文件路径必须是构建目录下的文件,也可以是URL
2)目的路径为容器内部路径,若不存在,则会自动创建该路径
//且创建的文档默认权威为0755,UID和GID都是0
3)目标路径以“/”结尾代表源文档是目录(反之是文件)
4)若源文档是压缩文档,在传递过程中会自动解压
//若目的路径下有同名文档,则不会覆盖同名文档
(9)COPY格式:COPY 源文档路径 目的路径
1)源文档路径必须是构建目录下的文件
2)目的路径为容器内部路径,若不存在,则会自动创建该路径
//且创建的文档默认权威为0755,UID和GID都是0
3)若源文档是压缩文档,则在传递过程中保持不变
(10)RUN格式1:RUN 命令和参数
RUN格式2:RUN [“命令”,“参数1”,“参数N”]
1)若在不支持Sheel的系统中运行RUN指令,则需通过数组格式(格式2)
(11)VOLUME格式:VOLUME [“容器内部挂载点1” “容器内部挂载点N”]
(12)ONBUILD格式1:ONBUILD 其他指令
1)其他指令不可以是:FROM 、LABEL和ONBULID;
2)ONBUILD指令添加的指令,默认跟在FROM之后执行;
3)ONBUILD触发器会按照父镜像中指定的顺序执行,且只能被继承一次
//其他Dockerfile中的指令均可调用
(13)CMD格式:CMD [“命令”,“参数1”,“参数N”]
1)可被docker run命令中指定的启动命令替代
2)Dockerfile中仅能存在一个CMD指令(若有多个,则只有最后一个生效)
3)CMD也可用来仅传递参数
(14)ENTRYPOINT格式:ENTRYPOINT [“命令”,“参数1”,“参数N”]
1)ENTRYPOINT命令不能被docker run命令指定的启动命令所覆盖,而docker
run命令指定的命令所指定的任何参数,都被当作参数传递给ENTRYPOINT指定的命令
2)docker run --entrypoint运行格式则可覆盖ENTRYPOINT指令
3)可组合使用CMD和ENTRYPOINT指令,生成带有参数的命令
4)Dockerfile中仅能存在一个(若有多个,则只有最后一个生效)
如:运行nginx镜像,若不指定运行方式,守护进程默认以后台方式运行
1)配置Dockerfile文件
2)若docker run -it 镜像名 -g “daemon off”,则Nginx守护进程需在前台运行
3)若docker run -it 镜像名,则以/usr/sbin/nginx -h方式启动Nginx
不同处 | COPY | ADD |
---|---|---|
当资源为压缩包时 | 将压缩包放到容器 | 解压后放到容器 |
是否可从链接地址获取资源 | 否 | 是 |
Dockerfile运行流程:
1)从FROM指定的镜像,运行一个基础容器;
2)执行一条指令(对容器做出修改);
3)执行类似docker commit命令的操作(提交一个新的镜像层);
4)运行添加新镜像层的容器,并执行下一条指令;
5)重复3)和4)步骤,直至指令执行完
//若执行过程中部分指令出错,导致不能正常结束,但仍可得到一个镜像,该镜像不会拥有出错指令后续部分的配置
如:编写具有网络工具的Centos镜像
build
build命令:通过DockerFile构建镜像
指令格式:docker build 选项 保存路径
选项 | 含义 |
---|---|
-t | 指定名称和标签(NAME:TAG) |
--no-cache | 关闭构建缓存 |
--build-arg 变量名=变量值 | 给ARG指令指定的变量赋值 |
1)指定名称时,可同时声明该镜像属于的仓库“仓库名/镜像名:TAG”,若不指定标签,则默认指定为“lastest”
2)保存路径必须是构建目录;
3)构建缓存:在构建过程中单个镜像提交成功的记录将被记录下,当再次构建该镜像时,仅会从修改镜像位置开始构建
如:编写Dockerfile,并通过build命令创建该镜像
a)编写Dockerfile
b)使用该脚本建立镜像
c)查看创建的镜像和数据卷
history命令:列出指定镜像的构建过程
指令格式:docker history 镜像ID
1)本质是:查看对应的DockerFile执行流程
2)若使用镜像名,则默认列出的是最新版创建历史
如:列出mwl_centos镜像的创建历史
//每一行都代表组成镜像的单层镜像的构建成功