dockerfile构建镜像
Reverse Lv4

基础镜像

什么是基础镜像?基础镜像(Base Image)是 Dockerfile 中 FROM 指令指定的起始镜像,通常包含操作系统、运行时环境或特定软件的预配置环境。

基础镜像在Docker Hub是有很多的,各种环境都有,比如 python,php,nginx 等.

选中基础镜像后,你的 dockerfile 后续所做的一系列操作都是基于这个基础镜像进行再次封装,比如增加一些软件包什么的.

假设你想将官方提供的 python 镜像做为基础镜像,那么你可以你这样.

image

image

怎么开始

基于上面所说的,使用 python3 来作为基础镜像.

这里先把官方提供的示例扒下来,研究一下,看看他做了什么,以及我们要做什么.

1
2
3
4
5
6
7
8
9
10
FROM python:3

WORKDIR /usr/src/app

COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD [ "python", "./your-daemon-or-script.py" ]

首先可以看见他通过FROM指定了一个 python3 的基础镜像,这正是我们需要的.

接着,他通过WORKDIR关键字将/usr/src/app设置为了工作目录,但是这里我得改改,我想将/data作为我的工作目录.

下面使用了COPYRUN做了一些拷贝文件和执行命令的操作,但我们可以自己改改,我准备用RUN去安装一些我自己需要的软件包,比如jq jc bc ipmitool curl等.

下面依然是一个 COPY 不需要的话也可以去掉了.

最终通过CMD关键字去运行了当前工作目录下的一个 py 脚本.

以上就是这个 dockerfile 大概做的事情,我这里基于我自己的想法,将这个官方示例变成我想要的样子.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
FROM python:3

# 设置工作目录
WORKDIR /app

# 更新 apt 包索引并安装软件包
RUN apt-get update && apt-get install -y \
curl \
git \
jq \
jc \
ipmitool

# 复制 requirements.txt 文件到工作目录
COPY requirements.txt .

# 安装 Python 依赖
RUN pip install --no-cache-dir -r requirements.txt

# 复制应用代码
COPY . .

# 设置环境变量
ENV FLASK_APP=app.py
ENV FLASK_ENV=production

# 暴露端口
EXPOSE 5000

# 启动命令
CMD ["flask", "run", "--host=0.0.0.0"]

最后使用docker build进行构建,执行完成后没有产生错误,那么就表示构建成功了.

并且镜像的REPOSITORY设置为 reverse/python, 镜像的TAG设置为 t250518, 当然这个是我自己定义随便写的, 按需填写就行了.

1
2
# 开始构建,构建时工作目录为当前目录
docker build -f python.dockerfile . -t reverse/python:t250518

阿里云 ACR

既然镜像已经构建好了,那么肯定是需要有一个地方可以存储镜像的,如果没有自己搭建的镜像仓库,那么可以考虑使用阿里云的镜像仓库.

具体操作方式如下:

  • 访问阿里云 ACR然后创建一个个人实例就行.
  • 进入个人实例中,选择仓库管理 -> 访问凭证 -> 固定密码设置密码,这是docker login时的凭证.
  • 接着进入命名空间中,创建一个命名空间,假设我创建为 reverse_python.
  • 然后访问镜像仓库中创建一下,命名空间就使用刚才创建的,还有仓库名字啥的都设置一下,最后选择本地仓库.

image

image

image

image

image

因为我们的本地构建的镜像,所以我们就选择本地仓库,这样的话就可以用命令行吧构建好的镜像推送上去了.

接下来创建好镜像仓库后他会提供给我们一个文档,告诉我们如何将镜像推送上来.

这里注意你的username,别错了,然后输入你前面设置好的固定密码.

然后[ImageId]通过docker images来查看就行,找到你构建好的镜像 ID

最后的[镜像版本号]自行看着设置就行了,然后推送一下就完事了.

1
2
3
docker login --username=xxxxxx registry.cn-hangzhou.aliyuncs.com
docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/reverse_python/python:[镜像版本号]
docker push registry.cn-hangzhou.aliyuncs.com/reverse_python/python:[镜像版本号]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
╭─root@localhost /apps/data/workspace/tmp
╰─# docker tag 7a20c8c2d70f registry.cn-hangzhou.aliyuncs.com/reverse_python/python:t250518
╭─root@localhost /apps/data/workspace/tmp
╰─# docker push registry.cn-hangzhou.aliyuncs.com/reverse_python/python:t250518
The push refers to repository [registry.cn-hangzhou.aliyuncs.com/reverse_python/python]
cabed45d1c08: Pushed
6c730be0af0c: Pushed
d2e6d1137f5e: Pushed
c73f86840bfc: Pushed
55798440ca84: Pushed
3851b9a2acfc: Pushed
bf9c09fb6f3a: Pushed
fcbb8c0ae5d6: Pushed
8ce3e08e661a: Pushed
247fffb7158d: Pushed
t250518: digest: sha256:2505761bc5172f9f9bc11a5361d9d6517178d87507b56ce54429f806d598fb65 size: 2421
╭─root@localhost /apps/data/workspace/tmp
╰─#

然后你就可以在阿里平台看见你 push 上去的镜像了.

image

如何使用

前面文档也有提到,创建镜像仓库时他给默认给你一份文档,里面就详细说了如何使用.

参照文档里面的代码,直接:

1
docker pull registry.cn-hangzhou.aliyuncs.com/reverse_python/python:[镜像版本号]

以上就是从构建镜像到发布阿里 ACR 的全流程了,可能文档也有误解的地方,但是我懒得改了 :) 大伙凑合看看.