Docker 学习

https://www.cnblogs.com/poloyy/p/15257059.html

项目结构

.
├── app
│   ├── __init__.py
│ └── main.py
├── Dockerfile
└── requirements.txt

FastAPI 应用程序 main.py 代码

from typing import Optional

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
return {"Hello": "World"} @app.get("/items/{item_id}")
def read_item(item_id: int, q: Optional[str] = None):
return {"item_id": item_id, "q": q}

Dockerfile

# 1、从官方 Python 基础镜像开始
FROM python:3.9 # 2、将当前工作目录设置为 /code
# 这是放置 requirements.txt 文件和应用程序目录的地方
WORKDIR /code # 3、先复制 requirements.txt 文件
# 由于这个文件不经常更改,Docker 会检测它并在这一步使用缓存,也为下一步启用缓存
COPY ./requirements.txt /code/requirements.txt # 4、运行 pip 命令安装依赖项
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt # 5、复制 FastAPI 项目代码
COPY ./app /code/app # 6、运行服务
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]

第四步:运行 pip 命令解析

RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
  • --no-cache-dir 选项告诉 pip 不要将下载的包保存在本地,因为只有当 pip 将再次运行以安装相同的包时才会这样,但在使用容器时情况并非如此
  • --no-cache-dir 只与pip有关,与 Docker 或容器无关
  • --upgrade 选项告诉 pip 升级已经安装的软件包
  • 因为上一步复制文件可能会被 Docker 缓存检测到,所以这一步也会在 Docker 缓存可用时使用
  • 在这一步中使用缓存会在开发过程中一次又一次地构建镜像时节省大量时间,而不是每次都下载并安装所有依赖项

Docker 缓存

这里有一个重要的技巧 Dockerfile,首先只复制依赖项的文件,而不是 FastAPI 应用程序代码

COPY ./requirements.txt /code/requirements.txt
  • Docker 和其他工具以增量方式构建这些容器映像,在另一层之上添加一层
  • 从 Dockerfile 的顶部(首行)开始,由 Dockerfile 的每个指令来创建任何文件
  • Docker 和其他工具在构建镜像时也是用内部缓存
  • 如果文件自上次构建容器镜像后没有更改,则它将重用上次创建的同一层,而不是再次复制文件并从头开始创建一个新的层
  • 仅仅避免文件副本并不一定会改善太多,但是因为它在该步骤中使用了缓存,所以它可以在下一步中使用缓存
  • 例如,它可以将缓存用于安装依赖项的指令
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
  • requirements.txt 不会经常改变,所以通过复制该文件,Docker 可以在该步骤中使用缓存
  • Docker 将能够使用缓存进行下一步下载和安装这些依赖项,这就是节省大量时间的地方
  • 下载并安装该软件包的依赖关系可能需要几分钟,但使用的缓存将只需要几秒
  • 由于在开发过程中一次又一次地构建容器镜像以检查代码更改是否有效,因此可以节省大量累积时间
COPY ./app /code/app
  • 在 Dockerfile 尾部,复制 FastAPI 应用程序代码
  • 由于这是最常更改的内容,因此将其放在最后,在此步骤之后的任何内容都将无法使用缓存

构建 Docker Image

在 Dockerfile 打开命令行

docker build -t myimage .

查看镜像

docker images 

启动 docker 容器

docker run -d --name mycontainer -p 80:80 myimage

查看容器

docker ps

访问 127.0.0.1/

访问 127.0.0.1/docs

带有 Gunicorn 的官方 Docker 镜像 - Uvicorn

  • 此镜像包含一个自动调整机制,可根据可用的 CPU 内核设置工作进程的数量
  • 它具有合理的默认值,但仍然可以使用环境变量或配置文件更新所有配置
  • 此镜像上的进程数是根据可用的 CPU 内核自动计算的,它将尝试从 CPU 中榨取尽可能多的性能
  • 但这也意味着,由于进程数取决于容器运行的 CPU,消耗的内存量也将取决于此
  • 因此,如果应用程序消耗大量内存(例如使用机器学习模型),并且服务器有很多 CPU 内核但内存很少,容器最终可能会使用比可用内存更多的内存,这会大大降低性能(甚至崩溃)

官方栗子

FROM tiangolo/uvicorn-gunicorn-fastapi:python3.9

COPY ./requirements.txt /app/requirements.txt

RUN pip install --no-cache-dir --upgrade -r /app/requirements.txt

COPY ./app /app

应用场景

  • 如果正在使用 Kubernetes,并且已经设置了集群级别的复制,就不应该使用此镜像,最好从头开始构建镜像
  • 如果应用程序足够简单以至于根据 CPU 设置默认进程数效果很好,不想费心在集群级别手动配置复制,并且运行的容器不会超过一个应用程序
  • 或者如果使用 Docker Compose 进行部署,在单个服务器上运行等

使用 poetry 的 docker  image

# 第一阶段:将仅用于安装 Poetry 并从 Poetry 的 pyproject.toml 文件生成带有项目依赖项的 requirements.txt。
FROM tiangolo/uvicorn-gunicorn:python3.9 as requirements-stage # 将 /tmp 设置为当前工作目录;这是我们将生成文件requirements.txt的地方
WORKDIR /tmp # 安装 poetry
RUN pip install poetry # 复制
COPY ./pyproject.toml ./poetry.lock* /tmp/ # 生成 requirements.txt
RUN poetry export -f requirements.txt --output requirements.txt --without-hashes # 这是最后阶段,在这往后的任何内容都将保留在最终容器映像中
FROM python:3.9 # 将当前工作目录设置为 /code
WORKDIR /code # 复制 requirements.txt;这个文件只存在于前一个 Docker 阶段,这就是使用 --from-requirements-stage 复制它的原因
COPY --from=requirements-stage /tmp/requirements.txt /code/requirements.txt # 运行命令
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt # 复制
COPY ./app /code/app # 运行服务
CMD ["uvicorn", "app.1_快速入门:app", "--host", "0.0.0.0", "--port", "80"]
  • 第一阶段 Docker 是 Dockerfile 的一部分,它作为一个临时容器的镜像是仅用于生成一些文件供后面阶段使用
  • 使用 Poetry 时,使用 Docker 多阶段构建是有意义的
  • 因为实际上并不需要在最终容器镜像中安装 Poetry 及其依赖项,只需要生成的 requirements.txt 文件来安装项目依赖项

poetry 详细教程

https://www.cnblogs.com/poloyy/p/15267494.html

FastAPI(62)- FastAPI 部署在 Docker的更多相关文章

  1. 使用Docker构建持续集成与自动部署的Docker集群

    为什么使用Docker " 从我个人使用的角度讲的话  部署来的更方便 只要构建过一次环境 推送到镜像仓库 迁移起来也是分分钟的事情 虚拟化让集群的管理和控制部署都更方便 hub.docke ...

  2. docker:(5)利用docker -v 和 Publish over SSH插件实现war包自动部署到docker

    在 docker:(3)docker容器挂载宿主主机目录 中介绍了运行docker时的一个重要命令 -v sudo docker run -p : --name tomcat_xiao_volume ...

  3. Ubuntu16.04 部署安装Docker容器 & 注意事项

    一.部署安装Docker容器 1.1 Ubuntu下安装 crul sudo apt install curl curl是利用URL语法在命令行方式下工作的开源文件传输工具.它被广泛应用在Unix.多 ...

  4. 把ABP框架部署到Docker中

    本文旨在将Abp项目部署到Docker容器中,借助Gitee存储,Jenkins持续构建,利用Docker Compose生成镜像.启动镜像,在官网给定的Abp项目中,虽然用到了Dockerfile. ...

  5. .net4.5部署到docker容器

    .net4.5部署到docker容器 部署到windows容器 部署到linux容器 部署到windows容器 由于.net本身就是运行在windows平台的,所以它与windows容器也是更加适合, ...

  6. aspnetcore2.1 部署到docker (访问出现404)

    Dockerfile FROM microsoft/dotnet:2.1-aspnetcore-runtime WORKDIR /app COPY ./publish . ENTRYPOINT [&q ...

  7. .net core Ocelot实现API网关并部署在docker中

    基于Ocelot(http://ocelot.readthedocs.io)搭建的API网关demo 软件以及系统版本:  Asp.Net Core 2.2 Ocelot 13.5.0 CentOS ...

  8. 容器部署解决方案Docker

      容器部署解决方案Docker 课程目标 目标1:了解Docker与虚拟机的不同点,相比的优势 目标2:掌握Docker的启动方法 目标3:掌握Docker镜像操作 目标4:掌握Docker容器操作 ...

  9. Asp.Net Core使用System.Drawing.Common部署到docker报错问题

    Asp.Net Core 2.1发布后,正式支持System.Drawing.Common绘图了,可以用来做一些图片验证码之类的功能.但是把网站部署到docker容器里运行会遇到很多问题,也是非常闹心 ...

随机推荐

  1. 关于Mysql 5.7版本 一直出现时间 不对 链接出现问题 以及日志的问题 解决方案

    问题: mysql版本号: 报错信息: Cause:java.sql.SQLException: The server time zone value '�й���׼ʱ��' is unrecogni ...

  2. promise小案例

    页面中有个板块,需要多张图片加载完之后才能进行显示 //页面中有个板块 需要多张图片加载完之后才能进行显示 const loadImg = (src) => { return new Promi ...

  3. Linux 自旋锁,互斥量(互斥锁),读写锁

    自旋锁(Spin Lock) 自旋锁类似于互斥量,不过自旋锁不是通过休眠阻塞进程,而是在取得锁之前一直处于忙等待的阻塞状态.这个忙等的阻塞状态,也叫做自旋. 自旋锁通常作为底层原语实现其他类型的锁. ...

  4. 查看局域网内所有的主机名、MAC地址和IP地址

    查看所有 IP at MAC $ arp -a ? (10.125.49.187) at 18:81:e:eb:ef:c0 on en0 ifscope [ethernet] ? (10.125.50 ...

  5. Spring Cloud Zuul 学习+实践

    首先有必要了解一下什么是Zuul,它和Spring Cloud有什么关系. Zuul在Spring Cloud中承担着网关的职责,可以理解为客户端和服务端交互中的唯一通道.所有的客户端请求都会首先发送 ...

  6. Python 高级特性(1)- 切片

    前言 面 tx 被问到 python 的高级特性相关,这里做个补充学习吧 正向范围取值 关键点 首位下标是 0 第一个数字是起始下标,第二个数字是结束下标(但最终结果不包含它) 代码块一 # 正向范围 ...

  7. 排查dubbo接口重复注销问题,我发现了一个巧妙的设计

    背景 我在公司内负责自研的dubbo注册中心相关工作,群里经常接到业务方反馈dubbo接口注销报错.经排查,确定是同一个接口调用了两次注销接口导致,由于我们的注册中心注销接口不能重复调用,调用第二次会 ...

  8. django框架开发流程

    python开发没有按目录划分,不像其它语言要先建一个包文件,所以python有必要先新建一个虚拟环境.这样不同的项目所依赖的环境和插件互不影响.虚拟环境的方法很多,这儿先用   virtualenv ...

  9. [转]SpringBoot系列——花里胡哨的banner.txt

    Creating ASCII Text Banners from the Linux Command Line In Ubuntu, Debian, Linux Mint etc. $ sudo ap ...

  10. windows 安装zip 压缩

    * 到sourceforge上下载 zip-3.0-bin.zip https://sourceforge.net/projects/gnuwin32/files/zip/3.0/zip-3.0-bi ...