Intro
最近得学FastAPI了,为了不弄乱环境,于是决定用Docker。
Docker容器安装FastAPI
Docker自己想办法装(
首先拉取pyhton的镜像。
为什么不拉FastAPI的镜像?
因为后面可能会有别的需求。
docker pull python:alpine
然后,建一个工作目录方便后续工作。
先简单的写一个FastAPI的应用。
在工作目录下新建一个main.py
// ./main.py
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "Docker"}
这段代码来自runboob,它的作用是在用户使用GET
方法访问根URL
时,返回这个JSON
。
好了,接下来应该测试这段代码了,这时我们发现,我没有FastAPI环境。
先用docker run
创建一个容器
docker run -it -v {这里是你的工作文件夹的绝对路径}:/FastAPI -p 3000:3000--name pyt python:alpine /bin/sh
- -i 打开容器的标准输入
- -t 为容器分配一个伪终端
- -v 绑定工作目录,冒号前的目录(本地目录)与冒号后的目录(容器目录)会被同步,注意这里得写绝对路径。
- -p 将容器端口3000映射到本地3000端口
- --name 指定容器名字
- /bin/sh 是alpine的shell
然后我们来安装FastAPI
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple\
&& pip install --upgrade pip\
&& pip install fastapi\
&& pip install "uvicorn[standard]"
这里为了提高下载速度,我把pip源换成了清华的,并且顺带安装了FastAPI所需要的ASGI服务器。
然后我们就能开始测试了。这里要用到刚刚装的ASGI uvicorn
uvicorn main:app --port 3000 --host 0.0.0.0 --reload
看到启动成功的提示,我们新开一个终端用curl测试一下。
curl 0.0.0.0:3000
{"Hello":"Docker"}
太好了owo!
Dockerfile
虽然刚刚已经成功了,但是据我所知,Docker不是这么用的。
所以我们在根目录下新建一个文件Dockerfile
# ./Dockerfile
FROM python:alpine #指定初始镜像
WORKDIR /FastAPI #设定工作目录
EXPOSE 3000 #指定暴露端口
# 安装fastapi与uvicorn
RUN pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple\
&& pip install --upgrade pip\
&& pip install fastapi\
&& pip install "uvicorn[standard]"
# 将当前目录文件复制到工作目录
COPY . .
# 运行程序
CMD ["uvicorn","main:app","--port","3000","--host","0.0.0.0","--reload"]
然后我们再建一个.dockerignore
文件,用来指定不用复制进去的文件。
# ./.dockerigonre
.dockerigonre
Dockerfile
然后我们用Dockerfile来创建这个镜像
docker build -t fastapi:v0 .
接下来创建容器
docker run -d --name fat fastapi:v0
这时,用curl测试发现没有正常返回,这是怎么一回事呢?
原来Dockerfile
里的EXPOSE
是没有作用的。
所以我们还是得这么写:
docker run -d -p 3000:3000 --name fat fastapi:v0
这里的-d
是让容器后台运行。
这时候再curl发现又可以正常返回了。
Docker compose
虽然刚刚已经完成了,但现在开启容器的命令也太长了,这时候我想到,可以用docker-compose来简化。
所以我们再创建一个docker-compose.yml
services:
fastapi:
build: .
ports:
- "3000:3000"
然后记得把这个文件也加进.dockerignore
# ./.dockerigonre
.dockerigonre
Dockerfile
docker-compose.yml
好,接下来让我们来启动docker-compose
docker-compose up -d --build
这里注意加入--build
可以确保使用的是新的docker镜像。
好了,最后测试一下
curl 0.0.0.0:3000
{"Hello":"Docker"}
(*´∀`)
Reference
https://www.runoob.com/fastapi/fastapi-install.html
https://docker-practice.github.io/zh-cn/