Docker + fastapi (macOS)


本文主要为了方便用户快速构建 fastapi 的 docker 镜像。
Docker 的安装及详细使用,可参考后续文章
fastapi 的使用,可参考:https://blog.csdn.net/lovechris00/article/details/121593295


本文依据:



一、准备文件

文件结构张这样:

.
├── 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:8092http://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(二)

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值