笔记-速通Docker
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"}
(*´∀`)
Re
上面虽然快乐速通了,但我们打开镜像列表会发现,怎么一下出来了这么多镜像。
docker images
看来不能这么做。
于是我们再次更改docker-compose.yml
的内容。
# ./docker-compose.yml
services:
fastapi:
image: fastapi:v0
ports:
- "3000:3000"
volumes:
- ./FastAPI/Work:/FastAPI
然后回了后续学习,我们创建一个./FastAPI
目录,并把FastAPI的相关文件移进去。
顺带一提我把项目根目录的名字也改掉了,避免重名。
mkdir FastAPI
mkdir FastAPI/Work
mv Dockerfile ./FastAPI
mv .dockerignore ./FasstAPI
mv main.py ./FastAPI/Work
好了,现在再启动docker compose的时候就不会创建镜像了。
并且上面还指定了文件夹映射,所以我们重新构建一下镜像。
# ./FastAPI/Dockerfile
FROM python:alpine
WORKDIR /FastAPI
EXPOSE 3000
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]"
CMD ["uvicorn","main:app","--port","3000","--host","0.0.0.0","--reload"]
docker build . -t fastapi:v0
构建完成后记得清理掉老的镜像。
然后我们再次使用docker-compose启动容器。
docker-compose up -d
并再次使用curl测试:
curl 0.0.0.0:3000
{"Hello":"Docker"}
( ̄︶ ̄)
Outrol
好了,现在我们终于完成了环境的搭建,现在可以开始学FastAPI了。
这是FastAPI的官方教程:https://fastapi.tiangolo.com/zh/tutorial/
Reference
https://www.runoob.com/fastapi/fastapi-install.html
https://docker-practice.github.io/zh-cn/