本文主要为了方便用户快速构建 fastapi 的 docker 镜像。
Docker 的安装及详细使用,可参考后续文章
fastapi 的使用,可参考:https://blog.csdn.net/lovechris00/article/details/121593295
本文依据:
- FastAPI in Containers - Docker
https://fastapi.tiangolo.com/zh/deployment/docker/?h=docker
一、准备文件
文件结构张这样:
.
├── app
│ ├── __init__.py
│ └── main.py
├── Dockerfile
└── requirements.txt
1、python 文件
main.py
from typing import Union
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
2、Requirements 文件
fastapi>=0.68.0,<0.69.0
pydantic>=1.8.0,<2.0.0
uvicorn>=0.15.0,<0.16.0
3、Dockerfile 文件
注:此文件没有后缀名
# 使用 3.9 版本的 python
FROM python:3.9
# docker 中,此项目的运行地址为 /code
WORKDIR /code
# 拷贝本地的 requirements.txt 文件到地址:/code/requirements.txt
COPY ./requirements.txt /code/requirements.txt
# 根据 requirements 文件安装 python 第三方包
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
# 拷贝 app 文件夹的内容到 /code/app
COPY ./app /code/app
# 执行命令,启用 fastapi 应用
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]
二、构建/运行 docker镜像
1、构建镜像 build image
为方便标识,这里镜像名设置为 myimage2; .
代表当前文件夹
docker build -t myimage2 .
2、创建容器并运行 run
$ docker run --restart=always -d --name mycontainer2 -p 8092:8092 myimage2
9cdf4991e48665893c2808fac919407a8daa2e4847e312dab7f1cf73b759e5b9
$ docker run --restart=always -d --name mycontainer3 -p 8095:8092 myimage2
7507c7b22677617991a7b7e92b93e92602ec6862ef72c3b58ec662fbc08314a5
容器名为 mycontainer,指定镜像 myimage2
本地 8095 端口映射docker 中的 8092端口,
访问 http://127.0.0.1:8092 和 http://127.0.0.1:8095 都可以访问到 docker 中的接口。
如果出现下述报错,可以修改 container 名称和端口号,再起run
docker: Error response from daemon: Conflict. The container name “/mycontainer” is already in use by container “30a69a32e5c585d98345877a2b3d4f88387c90bcda829147d68354703395d166”. You have to remove (or rename) that container to be able to reuse that name.
可能会用到的命令:
# 查看所有容器(包含未运行)
$ docker ps -a
# 查看当前运行的容器
$ docker ps
# 删除(已停止)容器
$ docker rm
# 列举出所有容器,进行删除
$ docker rm -f $(docker ps -a)
# 查看镜像
$ docker images
# 删除某个镜像(如果某容器引用了它,需要先删除容器,再删除镜像)
$ docker rmi [image]
# 删除全部镜像
$ docker rmi -f $(docker images -qa)
# 查看容器日志
docker logs -f --tail 1000 容器id
3、打包/加载 本地镜像
将镜像打包为 tar 文件。
注意使用镜像名,而非容器名来打包。
语法:
docker save [OPTIONS] IMAGE [IMAGE…]
docker load [OPTIONS]
OPTIONS 说明:
-o
: 输出到的文件。--input
,-I
: 指定导入的文件,代替 STDIN。--quiet
,-q
: 精简输出信息。
示例:
# 打包
$ docker save -o path_image_v1.tar image_name
# 加载
$ docker load --input path_image_v1.tar
# 运行容器
docker run --restart=always -d --name mycontainer2 -p 7777:7777 myimage2
- 在打包生成完成之前,在命令执行的文件夹,会有一个
.docker_temp_247xxxx34
隐藏文件。 - load 的镜像,如果与本地镜像同名,本地之前的可能会被覆盖
2022-05-31(二)