使用Docker快速部署FastAPI Web应用

ops/2024/11/14 13:16:11/

Docker是基于 Linux 内核的cgroup、namespace以及 AUFS 类的Union FS 等技术,对进程进行封装隔离,一种操作系统层面的虚拟化技术。Docker中每个容器都基于镜像Image运行,镜像是容器的只读模板,容器是模板的一个实例。镜像是分层结构,一个镜像可以基于另一个镜像创建,最底层的镜像是基础镜像。

安装Docker

brew install --cask --appdir=/Applications docker

docker_6">查看docker版本

% docker --version
Docker version 20.10.17, build 100c701

docker_13">查看docker是否安装成功

% docker info     
Client:Context:    defaultDebug Mode: falsePlugins:buildx: Docker Buildx (Docker Inc., v0.9.1)compose: Docker Compose (Docker Inc., v2.10.2)extension: Manages Docker extensions (Docker Inc., v0.2.9)sbom: View the packaged-based Software Bill Of Materials (SBOM) for an image (Anchore Inc., 0.6.0)scan: Docker Scan (Docker Inc., v0.19.0)

创建FastAPI镜像

依赖

% cat requirements.txt 
fastapi[standard]>=0.113.0,<0.114.0
pydantic>=2.7.0,<3.0.0

Python代码

# main.py
from fastapi import FastAPIapp = FastAPI()@app.get("/")
def index():return "测试容器部署"

目录结构

% tree
.
├── Dockerfile
├── app
│   └── main.py
└── requirements.txt

Dockerfile

% cat Dockerfile 
FROM python:3.9
WORKDIR /code
COPY ./requirements.txt /code/requirements.txt
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
EXPOSE 5000
COPY ./app /code/app
CMD ["fastapi", "run", "app/main.py", "--port", "5000"]

Dockerfile常用指令

指令描述
FROM指定基础镜像,可以指定多个,指定多个基础镜像时,编译时也会生成对应的多个镜像
MAINTAINER指定镜像维护人信息,制作人根据自己情况指定
WORKDIR设置工作目录,后续的RUN、COPY、CMD等命令都将在工作目录下运行
RUN构建镜像时运行命令,可以用他安装软件等等
CMD容器实例中运行的命令,格式与RUN相同。注意,如果在docker run命令行里指定了命令,将不会执行CMD的内容。
ENTRYPOINT容器实例中运行的命令,格式与CMD相同。注意,如果在docker run时指定了命令,该命令会以命令行参数的形式传递到ENTRYPOINT中。
COPY拷贝文件或目录到镜像中
ADD拷贝文件或目录到镜像中,如果源文件是gizp等压缩文件,会被自动解压到目标目录
ENV设置环境变量
USER为RUN、CMD 和 ENTRYPOINT 执行命令指定运行用户
ARG由外部启动时必须传入的参数,在容器启动时用–build-arg传递参数
EXPOSE声明容器暴露给宿主机的端口,可以是一个或者多个以空格间隔
HEALTHCHECK容器中服务健康检查
VOLUME用于指定持久化目录

Docker镜像中有一个层的概念,每执行一个RUN命令,就会创建一个层,层过多会导致镜像文件体积增大。尽量在RUN命令中使用&&连接多条shell命令,减少RUN命令的个数,可以有效减小镜像文件的体积。在更多情况下,我们希望在docker run命令中为我们的服务传参,而不是覆盖执行命令,那么,我们应该使用ENTRYPOINT而不是CMD。

创建镜像

% docker build -t myimage .         
[+] Building 54.4s (10/10) FINISHED                                             => [internal] load build definition from Dockerfile                       0.0s=> => transferring dockerfile: 37B                                        0.0s=> [internal] load .dockerignore                                          0.0s=> => transferring context: 2B                                            0.0s=> [internal] load metadata for docker.io/library/python:3.9              4.4s=> [internal] load build context                                          0.0s=> => transferring context: 6.57kB                                        0.0s=> [1/5] FROM docker.io/library/python:3.9@sha256:ed8b9dd4e9f89c111f4bd  18.5s# 查看镜像
% docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
myimage      latest    31030096287b   22 minutes ago   1.06GB

Docker build常用参数

参数说明
-t指定Repository以及Tag,例如helloworld:1.0
-f指定Dockerfile路径,Dockerfile不在当前目录时使用
—no-cache常见镜像的过程中不使用Build Cache构建镜像
—pull构建镜像时总是拉取Base Image的最新版本

运行

% docker run -d --name mycontainer -p 80:5000 myimage
f23deab780852268532e6f820da33df67d6b39ba007db01d6eca2660e345a224# 查看容器
% docker ps    
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                  NAMES
f23deab78085   myimage   "fastapi run app/mai…"   14 minutes ago   Up 14 minutes   0.0.0.0:80->5000/tcp   mycontainer# 进入容器
% docker exec -it mycontainer bash

这里docker run从镜像myimage实例了一个容器,守护模式,命名为mycontainer,容器内部的端口是5000,宿主机的端口是80。
访问

停止和移除容器

# 关闭容器
% docker stop mycontainer
mycontainer# 启动容器
% docker start mycontainer
mycontainer# 移除容器
% docker rm mycontainer  
mycontainer

导入镜像到生产环境

我们可以使用docker save命令将镜像保存到指定的文件中,保存的文件是一个.tar格式的压缩文件:

# 导出到tar
docker save -o hello.tar hello:1.0# 导入到生产环境的docker
docker load -i hello.tar

配置镜像加速器

{"registry-mirrors": ["https://docker.wanpeng.top"]
}

1


http://www.ppmy.cn/ops/133572.html

相关文章

【网络】应用层——HTTP协议

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;了解什么是HTTP协议。 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不会坚持。早安! > 专栏选自&#xff1a;网络 &g…

美团代付微信小程序 read.php 任意文件读取漏洞复现

0x01 产品描述&#xff1a; ‌ 美团代付微信小程序‌是美团点评旗下的一款基于微信小程序技术开发的应用程序功能&#xff0c;它允许用户方便快捷地请求他人为自己支付订单费用。通过微信小程序&#xff0c;用户可以轻松实现代付操作&#xff0c;无需跳转到其他应用或网页…

ApiSmart 最新支持大模型供应商列表+Prompt 收集项目

累计到 2024/11/08 (0.6.0) ApiSmart 已经支持16家大模型供应商&#xff0c;n大模型接入&#xff08;本地环境可无限多模型&#xff09;&#xff1b; IDEA 官方对大模型类plugin 审批也是出乎意料的快&#xff0c;基本在 2小时内&#xff1a; OpenAi Azure Gemini Anthropic…

Qt_day10_程序打包(完结)

目录 1. 设置图标 2. Debug和Release版本 3. 动态链接库 4. 打包 5. 联系项目要求 Qt开发的程序最终都是要给用户使用的&#xff0c;用户的电脑上不可能装一个Qt的开发环境导入项目使用。因此项目项目开发完成后需要打包——制作成安装包&#xff0c;用户直接下载并安装即可使用…

工位管理新策略:Spring Boot企业级应用

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

MyBatis从入门到进阶

目录 MyBatis入门1、创建项目、数据准备2、数据库配置3、编写持久层代码单元测试打印日志 基本操作查询数据插入数据删除数据更新数据 MyBatis - xml插入数据更新数据删除数据查询数据#{}与${}SQL注入排序like查询 MyBatis进阶if标签trim标签where标签set标签foreach标签sql标签…

Scala 的Map集合

Map集合有两种类型&#xff0c;可变的与不可变的&#xff0c;区别在于可变对象可以修改&#xff0c;而不可变对象不可以修改。默认情况下Scala使用不可变Map集合&#xff0c;如果需要使用可变Map集合&#xff0c;则需要显式地使用import导入包。在Scala中&#xff0c;可以同时使…

开源共建 | 长安链开发常见问题及规避

长安链开源社区鼓励社区成员参与社区共建&#xff0c;参与形式包括不限于代码贡献、文章撰写、社区答疑等。腾讯云区块链王燕飞在参与长安链测试工作过程中&#xff0c;深入细致地总结了长安链实际开发应用中的常见问题及其有效的规避方法&#xff0c;相关内容多次解答社区成员…