Dockerfile 制作镜像和推送

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

https://hub.docker.com/

访问 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 就可以下载这个镜像了。

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

相关推荐
乙酸氧铍3 小时前
【imx6ul 学习笔记】Docker 运行百问网 imx6ul_qemu
linux·docker·arm·qemu·imx6ul
ℳ₯㎕ddzོꦿ࿐4 小时前
Docker 环境下 Paperless-ngx 中文增强版部署实战
运维·docker·容器
stark张宇8 小时前
逃离 Docker Hub 限速!国内镜像 + 完整 Docker Compose 部署 Node 与 MySQL 服务
mysql·docker·容器
chinesegf9 小时前
docker迁移镜像并运行
运维·docker·容器
Zfox_10 小时前
【Docker#1】技术架构演进之路
后端·docker·容器·架构
叠叠乐10 小时前
移动家庭云电脑linux docker 容器登陆移动家庭云电脑
linux·运维·docker
H Journey10 小时前
Docker基本使用
docker·容器·eureka
I_Jln.10 小时前
Docker:快速构建、运行、管理应用的工具
运维·docker·容器
式51611 小时前
RAG检索增强生成基础(二)RAG项目实战之Milvus Docker环境配置
运维·docker·容器
Yeats_Liao11 小时前
容器化部署:基于Docker的推理环境隔离与迁移
运维·docker·容器