2

引言

我们最开始使用的Docker的时候,一般是从docker官网镜像仓库进行拉取镜像,然后根据这些创建的出的容器进行运行,但是从来没有去了解过镜像是如何去构建的

实际上,Docker 官方镜像也是通过一定的方式构建出来的,如果能弄清楚其中的构建逻辑,我们也可以仿照官方镜像的构建过程,构建出自己想要的镜像

Dockerfile 是一个文本文件,其中包含了一系列命令,用于构建 Docker 镜像。在构建自定义镜像之前,我们有必要先了解一些镜像的构建与案例,已经dockerfile的相关语法

image.png

构建镜像

  1. 编写Dockerfile文件
  2. docker build命令构建镜像
  3. 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个

image.png

通过docker inspect查看镜像分层:

image.png

类似这种效果,每一行代表的就是一层

image.png

查看镜像

docker images

image.png

运行容器

docker run -p 8020:8020 image-ocr  

image.png

命令介绍:

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命令

image.png

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 设置后续指令的工作目录。

kexb
474 声望15 粉丝