使用Docker部署Python应用的方法总结

本篇文章源自作者团队在长期开发过程中总结的宝贵经验,其中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 noninteractiveRUN apt-get install -y python3

登录后复制

requirements.txt

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

立即学习“Python免费学习笔记(深入)”;

文件顺序

按照上面的思路(利用缓存)来推断,文件添加到容器的顺序至关重要。我们应该把频繁变更的文件放置到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 

登录后复制

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

注意:请务必确保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 -ysupervisor

登录后复制

为了让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:5000startsecs = 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却没有任何优势,它可能只会增加复杂度。我们发现对于大多数情况,它在容器中的开销是可接受的。

我希望这些信息对各位有价值!当我们团队学到更多最佳实践时,我会更新这篇文章。

以上就是使用Docker部署Python应用的方法总结的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2275455.html

(0)
上一篇 2025年2月27日 14:34:04
下一篇 2025年2月27日 14:34:22

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • Python实现支持JSON存储和解析的对象

    我们知道利用json模块可方便的将python基本类型(dict、list等)数据永久的存储成文件,同时也可以通过自定义转换函数和继承json encode&decode的方法实现自定义类的存储。本文就在前文“ python jso…

    编程技术 2025年2月27日
    000
  • 10种Python开发者节省时间的方法分享

    python 是一个美丽的语言,可以激发用户对它的爱。所以如果你试图加入程序员行列,或者你有点厌倦c++,perl,java 和其他语言,我推荐你尝试python. Python有很多吸引程序员的功能 ,它易学,面向对象,字节码编译,免费且…

    2025年2月27日 编程技术
    200
  • 详解利用Python破解验证码实例代码

    一、前言本实验将通过一个简单的例子来讲解破解验证码的原理,将学习和实践以下知识点:      Python基本知识      PIL模块的使用二、实例详解安装 pillow(PIL)库: $ sudo apt-get update$ sud…

    2025年2月27日
    200
  • python的内存管理详细介绍

    语言的内存管理是语言设计的一个重要方面。它是决定语言性能的重要因素。无论是c语言的手工管理,还是java的垃圾回收,都成为语言最重要的特征。这里以python语言为例子,说明一门动态类型的、面向对象的语言的内存管理方式。 对象的内存使用 赋…

    2025年2月27日 编程技术
    200
  • Python制作钉钉加密/解密工具详细介绍

    又是很久没有写技术博客了,盖因最近都在学习知识,也没有总结出什么值得分享的内容,所以一直停笔至今。最近的工作和钉钉的开发打上了交到,官方并没有提供任何Python的SDK,于是只能全部自己写。现在我将其中实现起来相对费时间的“加密/解密/签…

    2025年2月27日
    200
  • 使用Python实现一个颜色色值转换的小工具介绍

      需求说明  公司的 UI 设计小哥,已经转用 Zeplin 很久了。Zeplin 的设计稿展示页面的颜色色值使用十进制的 RGB 表示的,在 Android 中的颜色表示大多情况下都需要十六进制的 RGB 表示。我的数学没有好到直接看到…

    2025年2月27日 编程技术
    200
  • 详解使用python实现删除文件或文件夹实例代码

    python 实现删除文件或文件夹          最近自己学习Python 的知识,自己学习抓取网页的内容知识等,在学习的时候Python 删除文件夹或者文件知识的时候,觉得本篇内容不错,推荐给大家。实例代码,仔细看注释明细: #-*-…

    编程技术 2025年2月27日
    200
  • 详解python根据正则表达式提取指定的内容实例介绍

    python 根据正则表达式提取指定的内容 正则表达式是极其强大的,利用正则表达式来提取想要的内容是很方便的事。   下面演示了在python里,通过正则表达式来提取符合要求的内容。 实例代码: import re #   正则表达式是极其…

    2025年2月27日
    200
  • 详解Python正则表达式的高级用法

    对于python来说,学习正则就要学习模块re的使用方法。本文将展示一些大家都应该掌握的高级技巧。 编译正则对象 re.compile函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换…

    2025年2月27日 编程技术
    200
  • Python流程控制语句的方法

    人们常说人生就是一个不断做选择题的过程:有的人没得选,只有一条路能走;有的人好一点,可以二选一;有些能力好或者家境好的人,可以有更多的选择;还有一些人在人生的迷茫期会在原地打转,找不到方向。对于相信有上帝的人来讲,这就好像是上帝事先为我们制…

    2025年2月27日
    200

发表回复

登录后才能评论