阅读更多

1顶
0踩

编程语言
【编者的话】本篇文章源自作者团队在长期开发过程中总结的宝贵经验,其中Supervisor、Gunicorn以及Nginx更是在使用Python开发Web应用时最常用的软件,因此对于打算使用Docker部署Python应用的读者而言,这些最佳实践是很有参考价值。同时希望各位在日常实践过程中,也能将各自踩到过的“坑”以及宝贵的经验分享出来,大家共同进步!

我们可以使用Docker简单而高效的部署Python应用,同时,也有一些最佳实践来帮助我们愉快的完成部署。当然,也不是说这些最佳实践就是完成部署的唯一方式,只不过我们团队发现它们具有高可用性,并且容易维护。注意本文中大多数内容都只是代表我的立场,基于Docker的实现方式有很多,你可以随便选择。本文中我不会过多的介绍Volume,因为它可能需要一个单独的话题来解释。我们通常会使用Volume将源代码复制到容器中,而不是在每次运行时都重新构建。
DEBIAN_FRONTEND

Docker用户应该都很熟悉这个环境变量,它告知操作系统应该从哪儿获得用户输入。如果设置为"noninteractive",你就可以直接运行命令,而无需向用户请求输入(译者注:所有操作都是非交互式的)。这在运行apt-get命令的时候格外有用,因为它会不停的提示用户进行到了哪步并且需要不断确认。非交互模式会选择默认的选项并以最快的速度完成构建。

请确保你只在Dockerfile中调用的RUN命令中设置了该选项,而不是使用ENV命令进行全局的设置,因为ENV命令在整个容器运行过程中都会生效,所以当你通过BASH和容器进行交互时,如果进行了全局设置那就会出问题。例子如下:
# 正确的做法 - 只为这个命令设置ENV变量
RUN DEBIAN_FRONTEND=noninteractive apt-get install -y python3
# 错误地做法 - 为接下来的任何命令都设置ENV变量,包括正在运行地容器
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get install -y python3

requirements.txt

相比于基本的代码(codebase),应用的依赖很少发生变化,因此我们可以在Dockerfile中安装项目依赖,这也可以加快之后的构建速度(之后的构建只需要构建变更的代码)。Docker容器的层级构建可以缓存依赖安装的过程,所以之后的的构建速度会非常快,因为它不需要重新下载和构建依赖。
文件顺序

按照上面的思路(利用缓存)来推断,文件添加到容器的顺序至关重要。我们应该把频繁变更的文件放置到Dockerfile的下方,以便充分使用缓存来加速Docker的构建过程。例如,应用配置、系统配置和依赖都很少改变,我们就可以把它们放到Dockerfile的顶部。而源文件,比如路由文件、视图(views)和数据库代码会经常发生改变,所以我们就可以把它们放在Dockerfile的下方,注意是Docker配置命令(EXPOSE、ENV等)的下方。

另外,不要考虑如何将你的文件拷贝到Docker,它不会加快你的构建速度,因为大多数的文件根本不会用到,比如应用源文件。
应用密钥

之前我们一直不知道如何把应用密钥安全的传递给应用,后来我们发现可以使用docker run命令中的env-file参数。我们会把所有的密钥和配置都放在app_config.list文件中,然后通过这个文件交付给应用。具体如下:
docker run -d -t -—env-file app_config.list <image:tag>

这个方法允许我们简单地改变应用设置和密钥,而无需重建一个容器。

注意:请务必确保app_config.list在.gitignore文件的记录中,不然它不会被检录到源文件中。
Gunicorn

我们使用Gunicorn作为容器内部的应用服务器,Gunicorn非常的稳定并且性能很好,它有非常多的配置选项,比如指定worker数量和类型(green threads、gevent等)的能力,你可以根据负载来调整应用,以获得最佳性能。

启动Gunicorn很简单:
# 安装
pip3 install gunicorn

# 运行服务器
gunicorn api:app -w 4 -b 127.0.0.1:5000

最后是在Nginx后面运行你的应用服务器,这样你可以进行负载均衡。
supervisord

你是不是想过在容器中运行多个进程?我想Supervisord绝对是你的最佳辅助工具。假设我们想部署这样一个容器,它包含Nginx反向代理以及Gunicorn应用。你通过BASH脚本可能就能实现,但是让我们想更加简洁一点。

Supevisor是“一个进程控制系统,它支持用户在类UNIX操作系统上,监视并控制一些进程”。听起来很完美!你需要先在你的Docker容器内安装Supervisor。
RUN DEBIAN_FRONTEND=noninteractive apt-get install -y
supervisor

为了让Supervisor知道该运行什么以及如何管理进程,我们接下来需要为它写一个配置文件。
[supervisord]
nodaemon = true  # 这个会让supervisord运行在前端

[program:nginx]  # 你想运行的第一个程序的命名
command = /usr/sbin/nginx  # nginx可执行程序的路径
startsecs = 5  # 如果nginx保持开启5s,我们视为启动成功

[program:app-gunicorn]
command = gunicorn api -w 4 -b 127.0.0.1:5000
startsecs = 5

这是非常基本的配置,它还有很多的配置项,比如控制日志、stdout/stderr重定向、重启策略等。这个工具真不错。

一旦你完成了配置,请确保Docker将其复制到了容器中。
ADD supervisord.conf /etc/supervisord.conf

让Supervisor作为容器的自启动命令。
CMD supervisord -c /etc/supervisord.conf

它将会在容器启动的时候,运行Gunicorn和Nginx。如果已经配置过了,那将会按需重启它们。
学到的东西以及未来的目标

我们已经花了很长时间在Docker中部署代码,并且接下来会投入更多的时间。在使用Docker的过程中,我们学到的最重要经验就是如何最小化思考(think minimally)。在一个容器中运行你的整个系统真的很诱人,但是在应用各自的容器中运行应用进程却更容易维护。一般情况下,我们会在容器中运行Nignx和Web服务器,并且在一些场景中,使用单独的容器来运行Nginx却没有任何优势,它可能只会增加复杂度。我们发现对于大多数情况,它在容器中的开销是可接受的。

我希望这些信息对各位有价值!当我们团队学到更多最佳实践时,我会更新这篇文章。(翻译:孙科 校对:李颖杰)

原文链接:Deploying Python with Docker
1
0
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • silk lobe资源公众号_电视剧资源免费看公众号【推荐】

    电视剧资源在线观看最新公众号【推荐】全网影视免费看在线观看 网盘下载感谢大家一路的支持在此谢谢大家祝大家2020生活美满,身体健康本平台提供的所有影视完全免费各种电影尽在其中↓↓↓↓↓长按识别,进入观看其它没有的资源,我们都有,回复片名观影又是一年夏天了,窗外的天热的几乎没有风,如同你在的夏天一样炎热,但是你已经走了三年了。时间真是很快啊,三年了,见到街上和你相似的老太太总是忍不...

  • silklabo哪个公众号有资源_适合新手的公众号投稿资源大整合!

    今天又给大家整理了一份公众号投稿资源,这些公众号大部分都是处于发展中的新公众号,虽然稿酬不会很多,但是适合新手们锻炼文笔,过稿率也会高一点哦,大家可以试试。下面是整理的22个公众号投稿资源,按照稿费高低顺序排好了,想要锻炼一下,顺便赚点小钱的小可爱们,可以去关注他们的公众号,查看一下具体的投稿要求,期待你们过稿的好消息哦~NO.1【南佳青年】类型:职场进化、个人成长、自我管理类干货、情...

  • silk lobe资源公众号_【好设计资源库】公众号素材获取方式说明

    公众号Tab栏功能介绍↓↓↓重点指数:★★★★Tab1:资源推荐(位置见上图)此栏目主要功能有:全部资源、C4D教程、设计必备、插画资源 1、【全部资源】:可翻看/搜索本公众号内的全部资源,进入本栏目后,点击上方搜索框— 搜索关键词(建议搜索关键词,例如:样机) 2、【C4D教程】:此栏目主要放C4D相关教程(敬请期待) 3、【设计必备】:主要是关于设计师常用的软件教程,辅...

  • silk lobe资源公众号_微小说全免费阅读公众号阅读网资源推荐

    小说免费阅读|免费小说在线阅读|免费小说资源|小说公众号推荐|免费小说全集|免费小说公众号|小说免费阅读叶辰萧初然|霸道总裁|先生是谁Su Yin岳风柳言情【免费】阅读 | 分享中文|免费 of This sentence directly pierced Su Haichao's heart.owever, the system also gave rise to monopolist...

  • SILK : SILK_RTP_PayloadFormat 中文翻译(一)

    测试版本1.3                                                                                                                                                                  J. Spittka       H. Astrom

  • pythondocker部署_使用Docker部署Python应用的一些最佳实践

    使用Docker部署Python应用的一些经验总结2019独角兽企业重金招聘Python工程师标准&gt;&gt;&gt;...Docker容器化部署Python应用1. 简介Docker是目前主流IT公司广泛接受和使用的,用于构建、管理和保护它们应用程序的...

  • python应用部署_使用Docker部署Python应用的一些经验总结

    本篇文章源自作者团队在长期开发过程中总结的宝贵经验,其中Supervisor、Gunicorn以及Nginx更是在使用Python开发Web应用时最常用的软件,因此对于打算使用Docker部署Python应用的读者而言,这些最佳实践是很有参考...

  • 【Docker + Python】使用 Docker 创建容器化 Python 应用程序(入门指南)

    本文讲解如何使用 Docker 创建容器化 Python 应用程序,你将学到如下知识: 创建一个 Python 应用程序示例 创建一个新的 Dockfile,其中包含构建 Python 镜像所需的指令 构建一个镜像,并将新构建的镜像作为一个...

  • docker部署python web应用_Docker容器化部署Python应用

    原标题:Docker容器化部署Python应用 简介Docker是目前主流IT公司广泛接受和使用的,用于构建、管理和保护它们应用程序的工具。容器,例如Docker允许开发人员在单个操作系统上隔离和运行多个应用程序,而不是为...

  • 使用Docker Compose部署应用详解

    使用Docker Compose部署应用 Tips: 本文内容以 《深入简出Docker》 第九章 &lt;使用Docker Compose部署应用&gt; 为基础, 并结合其它内容和实践来丰富本篇文章 一、简介   现在的应用,很多是通过多个更小的服务...

  • Docker 容器化部署 Python 应用

    4.创建Python应用 Flask是Python的一个轻量级Web应用框架,简单易用,可以很快速地创建web应用。我们用它来创建此demo应用。 如果还没有安装Flask模块,可以使用下面命令安装: $ pip install flask 安装成功后,...

  • Python3 - Dockerfile 最佳实践

    通过 Dockerfile 构建的镜像所启动的容器应该尽可能短暂(生命周期短)。「短暂」意味着可以停止和销毁容器,并且创建一个新容器并部署好所需的设置和配置工作量应该是极小的。

  • Python 开发人员的 Docker 最佳实践

    本文着眼于编写 Dockerfile 和使用 Docker 时应遵循的一些最佳实践。尽管列出的大多数实践适用于所有开发人员,无论使用哪种语言,但少数实践仅适用于开发基于 Python 的应用程序的开发人员。 Dockerfiles 使用...

  • 如何把Python应用构建为Docker容器

    至此, Python应用的容器化就已经介绍完毕, 但是这只是一个简单的开始, 后面需要慢慢的了解多机的容器应用的怎么控制和执行的。咱们下期见!答案获取方式:已赞 已评 已关~学习更多知识与技巧,关注与私信博主(03...

  • 在 Docker 上开发应用 - 最佳实践

    原文地址下面的开发模式对通过 Docker 构建应用程序的开发人员是有用的。1. 使镜像尽可能小小镜像可以更快的通过网络传输,在启动容器或服务时更快的加载到内存中。下面是几个保持镜像的小体积的经验法则:1.1 从...

  • 从开发到部署:使用 FastAPI 和 Docker 构建可扩展的 Python Web API

    FastAPI 是一个现代、快速(高性能)的 Web 框架,用于基于标准 Python 类型提示使用 Python 3.7+ 构建 API。FastAPI 可简化使用 Python 编程创建 Web API 的过程。它允许开发人员快速轻松地构建 API,确保最佳性能...

  • aws fargate_在AWS Fargate中使用Docker部署Web应用程序

    aws fargate 动机 ...Docker is a fantastic tool to encapsulate and deploy applications in an easy and scalable way. Indeed, something I find myself doing very often is wrapping Python libraries...

  • 基于汉字定位检测识别系统算法实现.zip

    沙度

  • 基于prometheus官方插件nodeexporter修改.zip

    基于prometheus官方插件nodeexporter修改

  • 上海建桥学院在四川2020-2024各专业最低录取分数及位次表.pdf

    那些年,与你同分同位次的同学都去了哪里?全国各大学在四川2020-2024年各专业最低录取分数及录取位次数据,高考志愿必备参考数据

Global site tag (gtag.js) - Google Analytics