目录
[1. 从基础镜像运行容器](#1. 从基础镜像运行容器)
[2. 执行指令并修改容器](#2. 执行指令并修改容器)
[3. 提交新的镜像层](#3. 提交新的镜像层)
[4. 基于新镜像运行新容器](#4. 基于新镜像运行新容器)
[5. 执行下一条指令](#5. 执行下一条指令)
[6. 循环执行指令](#6. 循环执行指令)
[7. 所有指令执行完成](#7. 所有指令执行完成)
[1. FROM 使用基础镜像作为起点](#1. FROM 使用基础镜像作为起点)
[2. LABEL 指定镜像的维护者信息](#2. LABEL 指定镜像的维护者信息)
[3. USER 指定的用户](#3. USER 指定的用户)
[4. RUN 容器构建时需要运行的命令](#4. RUN 容器构建时需要运行的命令)
[5. COPY 复制本地文件或目录到镜像中](#5. COPY 复制本地文件或目录到镜像中)
[6. ADD 将文件的文件拷贝进镜像](#6. ADD 将文件的文件拷贝进镜像)
[7. WORKDIR 设置工作目录](#7. WORKDIR 设置工作目录)
[8. ENV 设置环境变量](#8. ENV 设置环境变量)
[9. EXPOSE 当前容器对外暴露出的端口](#9. EXPOSE 当前容器对外暴露出的端口)
[10. ENTRYPOINT 用来指定一个容器启动时要运行的命令](#10. ENTRYPOINT 用来指定一个容器启动时要运行的命令)
[11. CMD 定义容器启动时运行的默认命令](#11. CMD 定义容器启动时运行的默认命令)
[12. VOLUME 容器数据卷](#12. VOLUME 容器数据卷)
一、Dockerfile保留字是什么?
在 Dockerfile 中,有一些关键字或指令是被认定为保留字的,它们具有特殊的含义,用于定义 Docker 镜像的构建过程。指令告诉 Docker 如何从基础镜像创建一个新的镜像。
二、Docker构建流程
1. 从基础镜像运行容器
- Docker 引擎从指定的基础镜像开始创建一个新的容器实例。
2. 执行指令并修改容器
- Dockerfile 中的每个指令都会导致容器内部的文件系统、环境变量等发生相应的修改。
3. 提交新的镜像层
- 当容器内的修改达到一个阶段时,可以执行
docker commit
或类似的操作,将容器的状态保存为一个新的镜像层。 - 这个新的镜像层包含了容器的变更,形成一个新的镜像。
4. 基于新镜像运行新容器
- 使用刚刚创建的新镜像,Docker 引擎再次运行一个新的容器实例。
5. 执行下一条指令
- Docker 引擎在新容器内执行 Dockerfile 中的下一条指令,导致新的修改和状态。
6. 循环执行指令
- 迭代上述过程,逐步执行 Dockerfile 中的每一条指令,每次都可能创建一个新的镜像层。
7. 所有指令执行完成
- 当 Dockerfile 中的所有指令都被成功执行后,得到的最终镜像即为包含了所有修改和变更的最终版本
三、保留字
1. FROM 使用基础镜像作为起点
Dockerfile第一条必须是FROM
bash
# 使用基础镜像作为起点
FROM ubuntu:20.04
2. LABEL 指定镜像的维护者信息
bash
LABEL version="1.0" description="My Docker Image" maintainer="your_name <your_email@example.com>"
ps:MAINTAINER:指定镜像的维护者
Docker 1.13 被标记为已弃用,指定镜像的维护者(建议使用 LABEL 替代)
因为 Docker 社区更倾向于使用 LABEL 来提供元数据
bash
MAINTAINER your_name <your_email@example.com>
3. USER 指定的用户
指定该镜像以什么样的用户去执行,如果不指定,默认是root
bash
USER 【userName】
4. RUN 容器构建时需要运行的命令
在镜像中执行命令,更新软件包列表并安装一些软件包
两种格式:
-
shell格式
等同于在终端操作的shell命令
格式:RUN <命令行命令>
RUN yum -y install vim
-
exec格式
格式:RUN ["可执行文件" , "参数1", "参数2"]
RUN ["./test.php", "dev", "offline"] # 等价于 RUN ./test.php dev offline
RUN是在docker build时运行
5. COPY 复制本地文件或目录到镜像中
bash
COPY 【源路径】【容器路径】
6. ADD 将文件的文件拷贝进镜像
将宿主机目录下(或远程文件)的文件拷贝进镜像,且会自动处理URL和解压tar压缩包。
bash
ADD https://example.com/file.tar.gz /tmp/
7. WORKDIR 设置工作目录
设置工作目录,后续命令将在该目录下执行
bash
WORKDIR /app
8. ENV 设置环境变量
用来在构建镜像过程中设置环境变量。
这个环境变量可以在后续的任何RUN
指令或其他指令中使用
bash
# 格式 ENV 环境变量名 环境变量值
# 或者 ENV 环境变量名=值
ENV MY_PATH /usr/mytest
# 使用环境变量
WORKDIR $MY_PATH
9. EXPOSE 当前容器对外暴露出的端口
bash
EXPOSE 80
10. ENTRYPOINT 用来指定一个容器启动时要运行的命令
类似于CMD命令,但是ENTRYPOINT不会被docker run后面的命令覆盖,这些命令参数会被当做参数送给ENTRYPOINT指令指定的程序。
ENTRYPOINT可以和CMD一起用,一般是可变参数才会使用CMD,这里的CMD等于是在给ENTRYPOINT传参。
当指定了ENTRYPOINT后,CMD的含义就发生了变化,不再是直接运行期命令,而是将CMD的内容作为参数传递给ENTRYPOINT指令,它们两个组合会变成 <ENTRYPOINT> "<CMD>"。
bash
FROM nginx
ENTRYPOINT ["nginx", "-c"] # 定参
CMD ["/etc/nginx/nginx.conf"] # 变参
对于此Dockerfile,构建成镜像 nginx:test后,如果执行;
docker run nginx test,则容器启动后,会执行 nginx -c /etc/nginx/nginx.conf
docker run nginx:test /app/nginx/new.conf,则容器启动后,会执行 nginx -c /app/nginx/new.conf
11. CMD 定义容器启动时运行的默认命令
指定容器启动后要干的事情。
有两种格式:
- shell格式
bash
# CMD <命令>
CMD echo "hello world"
- exec格式
bash
# CMD ["可执行文件", "参数1", "参数2" ...]
CMD ["catalina.sh", "run"]
- 与ENTRYPOINT指令配合使用
bash
# CMD ["参数1", "参数2" ....],与ENTRYPOINT指令配合使用
12. VOLUME 容器数据卷
容器数据卷,用于数据保存和持久化工作。类似于 docker run 的-v参数。
bash
VOLUME 挂载点
挂载点可以是一个路径,也可以是数组
ps:数组中的每一项必须用双引号
bash
VOLUME /var/lib/mysql