【Docker 学习十二】利用dockerfile构建FastAPI容器

目录结构

目录结构,如下所示:

1
2
3
4
5
.
├── app
│ └── main.py
├── Dockerfile
└── requirements.txt

创建FastAPI项目

  • 创建一个目录并输入它。app
  • 使用以下命令创建文件:main.py
    切换到fastapi目录(如果没有,就自行创建项目即可)下创建文件/目录
    1
    cd /home/dockers/fastapi
    1
    mkdir app
    编写main.py,命令下vi main.py
    1
    2
    3
    4
    5
    6
    7
    8
    from fastapi import FastAPI

    app = FastAPI()

    @app.get("/")
    def read_root():
    return {"Hello": "World"}

    编写requirements.txt,命令下vi requirements.txt
    1
    2
    fastapi==0.104.0
    uvicorn==0.23.2

创建Dockerfile

创建一个文件:Dockerfile

1
vi Dockerfile

编写文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
FROM python:3.11

# 设置工作目录
WORKDIR /code

# 复制该文件到工作目录中
COPY ./requirements.txt /code/requirements.txt

# 安装requirements.txt 将重用上次创建的同一层,而不是再次复制文件并从头开始创建新层
# 通过仅复制该文件,Docker 将能够将缓存用于该步骤。
# 然后,Docker 将能够将缓存用于下载和安装这些依赖项的下一步。在这里,我们节省了大量时间
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/

# 把app目录复制到/code下
# 由于这是最频繁更改的内容,因此我们将其放在末尾,因为几乎总是,此步骤之后的任何内容都将无法使用缓存
COPY ./app /code/app
# 暴露端口 尽量要与uvicorn服务的端口一致
EXPOSE 8123
# 命令行运行,启动uvicorn服务,指定ip和端口
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8123"]

构建自己的FastAPI镜像

build命令来构建

1
docker build -f Dockerfile路径 -t 镜像名 [:TAG] .
1
docker build -f Dockerfile -t fastapi:0.1 .

运行容器

run命令来启动运行这个镜像生成的实例容器

1
docker run -it 镜像名[:TAG]
1
2
# -d 表示后台执行
docker run -d --name fastapi-test -p 8000:8123 fastapi:0.1

查看容器运行情况

1
2
3
docker ps
# CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 0bd6986c65ea fastapi:0.1 "uvicorn app.main:ap…" 42 seconds ago Up 41 seconds 0.0.0.0:8000-->8123/tcp fastapi-test

测试访问接口

1
2
curl localhost:8000
# {"Hello":"World"}