Ubuntu环境下Python应用Docker镜像的构建与运行实践

Ubuntu环境下Python应用Docker镜像的构建与运行实践

本教程详细介绍了在Ubuntu系统上,如何利用Docker容器化Python Django应用程序的简洁方法。内容涵盖从创建依赖文件requirements.txt、编写Dockerfile,到构建Docker镜像并运行容器的完整流程,旨在帮助开发者快速实现Python应用的隔离与部署,确保环境一致性与可移植性。

1. 前言与准备

随着容器化技术的普及,docker已成为部署和管理应用程序的强大工具。对于python开发者而言,将应用打包成docker镜像不仅能解决环境依赖问题,还能简化部署流程。本教程将以一个基于django rest framework的python应用为例,演示如何在ubuntu 22.04环境下,利用已安装的docker 24.0.7版本,从零开始构建并运行其docker镜像。

在开始之前,请确保您的Ubuntu系统已正确安装Docker,并且您的Python项目(例如Django应用)已准备就绪,通常在虚拟环境(如venv)中进行开发。

2. 管理项目依赖:生成requirements.txt

为了确保Docker镜像中安装的Python包与本地开发环境一致,首先需要导出项目的精确依赖列表。在项目的根目录下,执行以下命令,将当前虚拟环境中安装的所有Python包及其版本信息写入requirements.txt文件:

pip freeze > requirements.txt

这个文件将作为Dockerfile中安装依赖的依据,是实现可重复构建的关键。

3. 编写Dockerfile

Dockerfile是Docker镜像的构建蓝图,它包含了一系列指令,用于指导Docker如何一步步构建出最终的镜像。在项目根目录下创建一个名为Dockerfile的文件(注意没有文件扩展名),并添加以下内容:

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

# 指定基础镜像,这里使用官方Python 3.10.12版本FROM python:3.10.12# 设置容器内的工作目录WORKDIR /app# 将requirements.txt文件复制到容器的工作目录# 这一步单独进行,利用Docker构建缓存,当依赖未改变时可加速构建COPY requirements.txt ./# 在容器内安装所有Python依赖包# --quiet 参数可以减少安装时的输出信息RUN pip install -r requirements.txt --quiet# 将项目的所有文件复制到容器的工作目录# 注意:在生产环境中,通常会使用.dockerignore排除不必要的文件COPY . .# 声明容器将监听的端口,这里Django默认监听8000EXPOSE 8000# 定义容器启动时执行的命令# 对于Django应用,通常是运行开发服务器,并绑定到所有网络接口CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]

Dockerfile指令解析:

FROM python:3.10.12: 选择一个官方的Python基础镜像,确保Python环境的一致性。WORKDIR /app: 设置容器内的工作目录为/app。后续的所有操作都将在这个目录下进行。COPY requirements.txt ./: 将宿主机上的requirements.txt文件复制到容器的/app目录下。RUN pip install -r requirements.txt –quiet: 在容器内执行pip install命令,安装所有列出的依赖。COPY . .: 将宿主机项目根目录下的所有文件(除了.dockerignore中指定的文件)复制到容器的/app目录下。EXPOSE 8000: 声明容器内的8000端口将被暴露。这只是一个文档声明,实际的端口映射需要在运行容器时指定。CMD [“python”, “manage.py”, “runserver”, “0.0.0.0:8000”]: 定义容器启动时默认执行的命令。0.0.0.0表示Django应用将监听容器内的所有网络接口,以便外部可以访问。

注意事项:

.dockerignore文件: 为了优化镜像大小和构建速度,建议在项目根目录创建.dockerignore文件,排除如.git/、__pycache__/、*.pyc、venv/、.env等不应包含在镜像中的文件和目录。生产环境考虑: CMD中使用的runserver仅适用于开发环境。在生产环境中,应使用Gunicorn、uWSGI等WSGI服务器,并结合Nginx进行反向代理。

4. 构建Docker镜像

编写完Dockerfile后,就可以使用docker build命令来构建镜像了。在项目根目录下执行:

docker build -t my-app-img:0.1.0 .

命令解析:

docker build: Docker构建镜像的命令。-t my-app-img:0.1.0: 为构建的镜像打标签(tag)。my-app-img是镜像的名称,0.1.0是版本号。这有助于管理不同版本的镜像。.: 指定构建上下文(build context),即Dockerfile所在的路径。这里的.表示当前目录。

构建过程可能需要一些时间,特别是首次下载基础镜像和安装依赖时。构建成功后,您可以通过docker images命令查看新创建的镜像。

5. 运行Docker容器

镜像构建完成后,即可使用docker run命令将其作为容器运行起来:

docker run --rm -d -p 8000:8000/tcp my-app-img:0.1.0

命令解析:

docker run: Docker运行容器的命令。–rm: 当容器停止时,自动删除容器。这对于测试和开发环境非常有用,可以避免残留无用的容器。-d: 以“分离”(detached)模式运行容器,即在后台运行,不会占用当前终端。-p 8000:8000/tcp: 端口映射。将宿主机的8000端口映射到容器的8000端口。这意味着您可以通过访问宿主机的8000端口来访问容器内运行的Django应用。/tcp是可选的,表示使用TCP协议。my-app-img:0.1.0: 指定要运行的镜像名称和标签。

运行成功后,Docker会输出一个容器ID。您可以使用docker ps命令查看正在运行的容器。

6. 访问应用程序

容器成功运行并完成端口映射后,您可以通过宿主机的浏览器访问您的Django应用程序:

http://localhost:8000/

如果一切顺利,您应该能看到Django应用的欢迎页面或您配置的任何前端页面。

7. 总结

通过以上步骤,您已成功在Ubuntu环境下,将Python Django应用容器化为Docker镜像并运行。这个过程提供了一个简单而高效的方式来打包、分发和运行您的Python应用,解决了环境依赖问题,并提升了部署效率。

后续优化与建议:

日志管理: 考虑将容器日志输出到标准输出(stdout/stderr),并使用Docker的日志驱动进行集中管理。持久化数据: 如果应用需要持久化数据(如数据库),应使用Docker卷(Volumes)进行挂载,以防止数据随容器删除而丢失。环境变量 将数据库连接字符串、API密钥等敏感信息作为环境变量传递给容器,而不是硬编码在代码或Dockerfile中。多阶段构建: 对于复杂的应用,可以使用多阶段构建来减小最终镜像的大小。Docker Compose: 对于包含多个服务的应用(如Web应用+数据库),推荐使用Docker Compose来定义和运行多容器应用。

以上就是Ubuntu环境下Python应用Docker镜像的构建与运行实践的详细内容,更多请关注创想鸟其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月14日 11:21:40
下一篇 2025年12月14日 11:21:57

相关推荐

  • python中什么是猴子补丁?

    猴子补丁是Python中动态修改类、模块或函数行为的技术,利用Python的动态特性在运行时替换或增强功能。例如可修改第三方库函数而不改动源码,适用于修复bug、测试模拟或扩展功能。但存在可维护性差、冲突风险、调试困难等问题,应谨慎使用。推荐优先采用继承、装饰器、上下文管理器、依赖注入和组合等更安全…

    好文分享 2025年12月14日
    000
  • Pandas数据清洗:从混合字符串列中提取数值并进行分组聚合

    本教程详细介绍了如何在Pandas DataFrame中处理包含混合文本和数字的字符串列。通过使用str.extract结合正则表达式,可以高效地从字符串中提取数值,并将其转换为适当的数字类型。文章进一步演示了如何利用这些提取出的数值进行分组聚合,包括基础的总和计算以及基于其他列的条件性聚合,从而解…

    2025年12月14日
    000
  • python中怎么使用@property装饰器?

    @property装饰器将方法转为属性访问,实现简洁接口与内部控制的平衡,支持读、写、删的精细化管理,如数据校验和动态计算。 Python中的 @property 装饰器,简而言之,就是一种优雅地将类方法转化为属性访问方式的工具。它允许你像访问普通属性一样去调用一个方法,同时在背后可以执行复杂的逻辑…

    2025年12月14日
    000
  • Python怎么使用with语句_with语句与上下文管理器详解

    with语句是Python中资源管理的最佳实践,它通过上下文管理器协议(__enter__和__exit__方法)确保资源的初始化与释放。使用with语句可自动处理文件、锁、数据库连接等资源的打开与关闭,无论代码块是否抛出异常,都能保证资源被正确清理,避免泄露。其核心优势在于提升代码的可读性、简洁性…

    2025年12月14日
    000
  • python opencv如何读取和显示图片_opencv-python读取并显示图像的基础操作

    答案:使用OpenCV读取显示图像需正确调用cv2.imread()、cv2.imshow()、cv2.waitKey(0)和cv2.destroyAllWindows(),并注意路径格式、文件存在性及BGR颜色模式,避免窗口一闪而过或加载失败。 在Python中使用OpenCV库来读取和显示图片,…

    2025年12月14日
    000
  • python中怎么在一个模块中导入另一个模块的变量_Python模块间变量导入方法

    Python模块间导入变量的常见方式有三种:import module、from module import name和from module import 。最推荐使用import module形式,它通过模块名访问变量,避免命名冲突;from module import name可直接使用变量名…

    2025年12月14日
    000
  • python如何使用pandas读取excel文件_pandas读取Excel文件实战教程

    使用pandas.read_excel()函数可高效读取Excel文件,需先安装pandas和openpyxl库。通过指定文件路径、sheet_name参数读取特定工作表或所有工作表,结合dtype和na_values参数控制数据类型与缺失值识别,利用skiprows、header、usecols和…

    2025年12月14日
    000
  • Python怎么写入文件_Python文件写入操作指南

    答案:Python文件写入需选择合适模式以避免数据丢失或覆盖,’w’覆盖写入、’a’追加内容、’x’确保文件不存在时创建,结合with语句和异常处理可提升安全性和健壮性。 Python写入文件,主要通过内置的 open() 函数…

    2025年12月14日
    000
  • 在Flask应用外部查询SQLAlchemy数据库:解决导入与上下文问题

    本教程旨在解决在Flask应用外部(如定时任务或后台服务)使用Flask-SQLAlchemy模型访问数据库时遇到的导入错误和上下文问题。通过解耦SQLAlchemy实例,并正确初始化应用上下文,我们能够实现模型复用,避免循环导入,并确保外部脚本能够稳定、专业地与Flask应用数据库进行交互。 引言…

    2025年12月14日
    000
  • python怎么执行系统命令_python执行系统命令方法汇总

    执行系统命令首选subprocess模块,因其功能全面、安全性高且支持精细控制;os.system()和os.popen()虽简单但功能有限,易引发安全风险,适用于简单场景;使用时需避免shell注入、注意编码和资源管理。 Python执行系统命令,在我看来,主要有那么几板斧:最直接的 os.sys…

    2025年12月14日
    000
  • 解耦Flask-SQLAlchemy:实现应用外部数据库查询与模型复用

    本教程详细阐述了如何在Flask应用的核心Web请求上下文之外,安全有效地访问和操作Flask-SQLAlchemy数据库。通过解耦SQLAlchemy实例的初始化,采用db.init_app()模式,并结合Flask应用上下文管理,解决了常见的导入错误和循环依赖问题,使得定时任务或后台服务能够无缝…

    2025年12月14日
    000
  • HDF5文件中一维数组图像的读取与可视化:从诊断到重建

    本文旨在解决HDF5文件中图像数据以一维数组形式存储时,如何正确读取、重建并可视化的问题。我们将探讨HDF5文件结构,分析导致图像无法直接显示的ValueError,并提供多种策略来查找关键的图像尺寸信息(如高度、宽度和通道数)。最终,通过Numpy和PIL库,演示如何将一维数组重塑为可识别的图像格…

    2025年12月14日
    000
  • 使用Python和VirusTotal API进行URL扫描及结果解析指南

    本教程详细指导如何使用Python与VirusTotal API进行URL扫描。文章涵盖了URL提交、结果查询的完整流程,并重点解决了在结果查询时常见的“Wrong URL id”错误。通过正确的ID格式提取方法,确保API调用的成功,从而有效获取URL的安全分析报告,提升自动化安全分析能力。 Vi…

    2025年12月14日
    000
  • 使用Pandas精确检测360度周期性数据中的逆行点

    本教程探讨如何利用Pandas有效识别行星等360度周期性坐标数据中的逆行(反向运动)点。针对传统方法在跨越0/360度边界时出现的误判问题,我们提出了一种基于差值阈值和局部极值判断的Pandas解决方案,确保在周期性数据中准确区分真正的运动反转与边界穿越,提供鲁棒的分析方法。 引言:360度周期性…

    2025年12月14日
    000
  • Python怎么用Beautiful Soup解析HTML_Beautiful Soup HTML解析实战教程

    答案:Beautiful Soup通过解析HTML为结构化对象,结合find、find_all和select等方法高效定位元素,可与Selenium配合处理动态内容,并需注意编码、容错、性能及反爬策略。 Python使用Beautiful Soup解析HTML的核心在于,它能将复杂的HTML或XML…

    2025年12月14日
    000
  • Pandas中从混合字符串列提取数字并进行分组聚合的教程

    本教程将详细介绍如何在Pandas数据帧中处理包含混合文本和数字的列。我们将学习如何利用str.extract结合正则表达式高效地从字符串中提取数值,并通过groupby方法对提取出的数据进行分组求和。文章还将涵盖条件性聚合的实现,帮助读者掌握清洗和分析复杂数据列的关键技巧。 在数据分析实践中,我们…

    2025年12月14日
    000
  • VirusTotal API URL扫描结果获取:正确处理ID的关键

    本教程详细介绍了如何使用Python通过VirusTotal API进行URL扫描。文章重点阐述了在提交URL进行扫描后获取的分析ID与查询扫描结果所需的URL ID之间的区别与正确处理方法,旨在帮助用户避免常见的“Wrong URL id”错误,确保能准确检索到URL扫描报告。 1. VirusT…

    2025年12月14日
    000
  • 解耦Flask-SQLAlchemy:在应用外部执行数据库操作的教程

    本教程旨在解决在Flask应用外部(如定时任务或后台服务)访问Flask-SQLAlchemy数据库模型时遇到的导入错误和循环引用问题。通过将SQLAlchemy实例与Flask应用解耦,并利用应用程序上下文,我们能够在一个独立的文件中安全、高效地执行数据库操作,确保代码的可维护性和可扩展性。 背景…

    2025年12月14日
    000
  • python中什么是上下文管理器?

    上下文管理器通过__enter__()和__exit__()方法确保资源正确获取与释放,核心解决资源泄露、代码复杂性和错误处理分散三大痛点。使用with语句可自动管理文件、数据库连接等生命周期,避免手动try-finally嵌套,提升代码安全与可读性。两种创建方式:类实现或contextlib装饰器…

    2025年12月14日
    000
  • python中怎么从字符串中切片_Python字符串切片操作详解

    答案是Python字符串切片通过[start:end:step]语法创建新字符串对象,省略start或end分别默认从开头或到结尾,step可实现反转、跳跃取字符等操作,且因字符串不可变性每次切片均生成新对象。 Python中从字符串中切片,核心就是利用方括号 [] 配合冒号 : 来指定一个范围,就…

    2025年12月14日
    000

发表回复

登录后才能评论
关注微信