引言
我们最开始使用的Docker的时候,一般是从docker官网镜像仓库进行拉取镜像,然后根据这些创建的出的容器进行运行,但是从来没有去了解过镜像是如何去构建的
实际上,Docker 官方镜像也是通过一定的方式构建出来的,如果能弄清楚其中的构建逻辑,我们也可以仿照官方镜像的构建过程,构建出自己想要的镜像
Dockerfile 是一个文本文件,其中包含了一系列命令,用于构建 Docker 镜像。在构建自定义镜像之前,我们有必要先了解一些镜像的构建与案例,已经dockerfile的相关语法
构建镜像
- 编写Dockerfile文件
- docker build命令构建镜像
- docker run依镜像运行容器实例
DockerFile构建过程解析
(1) 每条保留字指令都必须为大写字母且后面要跟随至少一个参数
(2) 指令按照从上到下,顺序执行
(3) #表示注释
(4) 每条指令都会创建一个新的镜像层并对镜像进行提交
注:保留字也叫关键字
编写示例:
# 使用官方的 Python 3.9.19 作为基础镜像
FROM python:3.9.19
# 设置工作目录为 /usr/src/app
WORKDIR /usr/src/app
# 安装 requirements.txt 中列出的所有依赖库
# 使用 --no-cache-dir 参数防止 pip 缓存安装包,以减小镜像体积
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
# 声明容器将在运行时监听的端口,这里是 8020 端口
EXPOSE 8020
# 设置环境变量,用于应用程序的配置
ENV ACCESS_KEY root
ENV SECRET_KEY yunzhi.club
ENV ENDPOINT=minio-minio1-1:9000
# 将主机当前目录下的 .env、config.ini 和 main.py 文件复制到容器的工作目录中
COPY .env ./
COPY config.ini ./
COPY main.py ./
CMD [ "python", "./main.py" ]
build构建镜像
docker build -t image-ocr .
这里发现正在构建的有13个
通过docker inspect查看镜像分层:
类似这种效果,每一行代表的就是一层
查看镜像
docker images
运行容器
docker run -p 8020:8020 image-ocr
命令介绍:
FORM
定制的镜像都是基于 FROM 的镜像,这里的 python 就是定制需要的基础镜像。后续的操作都是基于 python。
FROM python:3.9.19
RUN
用于执行后面跟着的命令行命令。有以下俩种格式:
shell 格式:
RUN <命令行命令>
RUN pip install --no-cache-dir -r requirements.txt
exec 格式:
RUN ["pip", "install", "--no-cache-dir", "-r", "requirements.txt"]
等同于在终端执行shell命令
COPY
复制指令,从上下文目录中复制文件或者目录到容器里指定路径。
COPY requirements.txt ./
COPY .env ./
COPY config.ini ./
COPY main.py ./
CMD [ "python", "./main.py" ]
CMD
类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:
CMD 在docker run 时运行。
RUN 是在 docker build。
CMD [ "python", "./main.py" ]
ENV
设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。
ENV <key1>=<value1> <key2>=<value2>...
ENV ACCESS_KEY root
ENV SECRET_KEY yunzhi.club
ENV ENDPOINT=minio-minio1-1:9000
EXPOSE
作用:
帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。
在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。
EXPOSE <端口1> [<端口2>...]
EXPOSE 8020
常用指令
- FROM 指定基础镜像,用于后续的指令构建。
- RUN 在构建过程中在镜像中执行命令。
- CMD 指定容器创建时的默认命令。(可以被覆盖)
- EXPOSE 声明容器运行时监听的特定网络端口。
- ENV 在容器内部设置环境变量。
- ADD 将文件、目录或远程URL复制到镜像中。
- COPY 将文件或目录复制到镜像中。
- VOLUME 为容器创建挂载点或声明卷。
- WORKDIR 设置后续指令的工作目录。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。