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

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

相关推荐
我可以将你更新哟2 小时前
【linux】配置 Docker 国内镜像源, centos7安装docker-ce,docker相关命令,永久配置 DNS
linux·运维·docker
云雾J视界2 小时前
年终复盘2.0:NLP自动萃取经验教训,构建可执行策略库
人工智能·docker·nlp·复盘·技术架构·工业级设计
machunlin~2 小时前
centos 系统安装相关
linux·运维·docker·centos
孤岛悬城2 小时前
47 Dockerfile场景化:公司内网业务上线(分角色/分模块)
docker·容器·云计算
小代码20162 小时前
ubuntu vscode docker php 环境搭建
vscode·ubuntu·docker·php·laravel
程序终结者3 小时前
CDH6.3.2集群docker容器化离线部署客户端parcel+配置全流程详解
运维·docker·容器
ERP面壁者3 小时前
Docker小白搭建xxl-job,mysql的过程日志
mysql·docker·容器
青花锁3 小时前
Mac电脑安装Docker
macos·docker·容器
Fortune_yangyang4 小时前
docker 搭建lnmp
运维·docker·容器