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

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

相关推荐
杨浦老苏15 小时前
把项目管理搬回自己服务器:Windshift部署与避坑
docker·项目管理·群晖
木雷坞15 小时前
Baserow Docker部署:导入设备借用CSV,再用表单新增登记
运维·docker·容器
wefg116 小时前
【Docker】基本指令
运维·docker·容器
牛马工作号18 小时前
Copyparty 轻量文件共享:Docker Compose 部署、权限与多协议使用全指南
运维·docker·容器
oioihoii19 小时前
Windows部署MySpeed自建测速服务:Docker运行后直接测速,再配置固定公网地址远程查看
运维·docker·容器
Jack N21 小时前
【Strapi 系列之八】二次开发 + 生产部署,Docker + PostgreSQL + Nginx 一把梭
nginx·docker·postgresql·strapi
岁月宁静1 天前
一个 AI 项目从本地到上线,要经过哪些步骤?全流程讲清楚
python·docker·agent
正经教主2 天前
【FDE系列】阶段2:Day 42(UP详细版):Dockerfile 实战 — 把你的应用打包成镜像
人工智能·docker·fde
刘马想放假2 天前
Copyparty 轻量文件共享:Docker Compose 部署、权限与多协议使用全指南
docker·容器
岁寒良木2 天前
麒麟 V10 (x86_64) 离线/联网部署 Docker 26.1.4 与 MaxKB v2.10 LTS 实战指南
python·docker·kylin