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

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

相关推荐
功德+n4 小时前
Linux下安装与配置Docker完整详细步骤
linux·运维·服务器·开发语言·docker·centos
小敬爱吃饭5 小时前
Ragflow Docker部署及问题解决方案(界面为Welcome to nginx,ragflow上传文件失败,Docker中的ragflow-cpu-1一直重启)
人工智能·python·nginx·docker·语言模型·容器·数据挖掘
木子欢儿5 小时前
Docker Hub 镜像发布指南
java·spring cloud·docker·容器·eureka
coppher6 小时前
Ubuntu 22.04 amd64 离线安装 Docker 完整教程
linux·docker
bloglin999999 小时前
docker logs 如何一直监听日志输出
运维·docker·容器
说实话起个名字真难啊10 小时前
Docker 入门之网络基础
网络·docker·php
❀͜͡傀儡师10 小时前
使用 Docker 部署 Neko 自托管虚拟浏览器(Firefox)
docker·容器·firefox
0xDevNull11 小时前
Linux Docker 安装与使用详细教程
linux·运维·docker
工具罗某人11 小时前
docker compose 部署MySQL InnoDB Cluster + Router 高可用集群-亲测可用
mysql·docker·容器
SpikeKing11 小时前
Server - 服务器 CentOS 安装与配置 Docker
服务器·docker·centos