1. Dockerfile
1.1 构建镜像
容器是用镜像制作出来的,Dockerfile 就是用来制作镜像的。
Dockerfile 是一个文件,里面详细的列出了镜像是如何制作的。
🌰:使用 Dockerfile 制作镜像,并推送到 Docker Hub:
python
# main.py
from fastapi import FastAPI
import uvicorn
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=8000)
txt
# requirements.txt
fastapi==0.128.0
uvicorn==0.40.0
运行程序需要有python环境,然后安装 requirementsx.txt 中的包python -m pip install -r requirments.txt,然后在控制台执行 python main.py。
浏览器http://127.0.0.1:8000就能看到如下输出

把这段程序打包成 Docker 镜像,需要创建一个 Dockerfile 文件(D需要大写),文件也没有任何后缀名。
所有 Dockerfile 第一行都是 FROM 选择一个基础镜像,就是当前镜像是从哪个镜像的基础上面构建而来的,这里基础镜像需要自带python,可以去 Docker Hub 上面去查找符合要求的基础镜像。

当前选择 3.13-slim(linux发行版是slim里面内置了python 3.13) 这个镜像作为基础镜像。

dockerfile
FROM python:3.13-slim
# 所有 Dockerfile 第一行都是 FROM 选择一个基础镜像
WORKDIR /app
# WORKDIR 类似 cd 命令切换到镜像内到一个目录,作为工作目录,后到命令都是在这个目录下执行的
COPY . .
# 使用 COPY 将代码文件复制到镜像内的工作目录 第一个 . 是代表电脑的当前目录 第二个 . 代表镜像内的当前工作目录 也就是上面的 /app
RUN pip install -r requirements.txt
# 安装依赖 使用 RUN 命令表示后面的语句是在镜像中执行
EXPOSE 8000
# 表示声明镜像提供服务的端口是哪个,因为 fastAPI 启动时使用的是 8000 端口。这里只是做一个声明并不是强制的,给使用镜像的同学做一个提示,不写也不影响,实际使用的时候还是以启动容器的 -p 参数为准。
CMD ["python3", "main.py"]
# CMD 是容器运行时的默认启动命令。每当容器启动时,容器内部都会自动执行这个命令,使得容器内有一个 python 程序在运行。命令最好写成这种数组的形式,中间最好不要用空格,一个 Dockerfile 文件里面只能写一个 CMD。
ENTRYPOINT ["python3", "main.py"]
# 与 CMD 类似的是 ENTRYPOINT,优先级更高,不容易被覆盖。(和上面CMD选择一个使用)
Dockerfile 文件准备好后,就可以构建镜像,在当前目录执行 docker build -t 镜像名:版本号 . 版本号也可以省略不写,最后 . 代表是在当前文件夹构建。构建好后可以使用 docker images 查看。

📝 Content Size: 镜像"理论"大小(自己本体的大小) Disk Usage: 实际占用磁盘空间(考虑共享层和缓存)
如果可以查到构建好的镜像就可以开始使用了。
docker run -d -p 80:8000 test01 命令基于这个镜像创建一个容器,并且运行起来。

然后在本地浏览器访问 http://127.0.0.1:80 就会返回 {"Hello": "World"}
7.2 推送到 Docker Hub
访问 Docker Hub 进行登陆,如果没有账号可以注册一个,后面需要输入一个 username,就是我们的命名空间。
在控制台使用 docker login 命令进行登陆,给了一个验证码码和网站。

点击给出的链接(跳转到之前登陆的浏览器中),输入验证码,返回控制台就可以看到 Login Succeeded,代表登陆成功。
接下来重新打一个镜像,因为在推送镜像时,必须要带上自己的用户名。
docker build -t key2world/test01 .
然后执行 push 就可以看到镜像推送到了 Docker Hub 上。
docker push key2world/test01
推送成功后使用命名空间和镜像名到 Docker Hub 查找。其他同学使用 docker pull key2world/test01 就可以下载这个镜像了。

少年易老学难成,一寸光阴不可轻