笔记-速通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/

posted @ 2024-11-24 22:10  TashiKani  阅读(4)  评论(0编辑  收藏  举报