Ubuntu下Docker部署Python应用全攻略
珍惜时间,勤奋学习!今天给大家带来《Ubuntu Docker部署Python应用教程》,正文内容主要涉及到等等,如果你正在学习文章,或者是对文章有疑问,欢迎大家关注我!后面我会持续更新相关内容的,希望都能帮到正在学习的大家!
随着容器化技术的普及,Docker已成为部署Python应用的强大工具。它能够将应用程序及其所有依赖项打包到一个独立的、可移植的容器中,确保应用在任何环境中都能一致运行。本教程将以一个基于Python的Django REST Framework应用为例,详细演示在Ubuntu 22.04系统上,如何利用Docker 24.0.7版本,从零开始构建并运行一个Docker镜像。
1. 准备工作
在开始之前,请确保您的Ubuntu 22.04系统上已正确安装Docker,版本建议为24.0.7或更高。如果尚未安装,请参照Docker官方文档进行安装。
生成项目依赖文件
在Python项目中,通常会使用虚拟环境(如venv)来管理项目依赖。为了在Docker容器中重建这些依赖,我们需要将当前虚拟环境中的所有包及其版本信息导出到一个requirements.txt文件中。在项目根目录下,执行以下命令:
pip freeze > requirements.txt
这条命令会将当前虚拟环境中安装的所有Python包及其精确版本写入requirements.txt文件。这个文件将作为Docker构建过程中安装依赖的依据。
2. 编写Dockerfile
Dockerfile是用于构建Docker镜像的文本文件,其中包含了一系列指令,描述了如何逐步构建镜像。在项目根目录下创建一个名为Dockerfile的文件(注意没有文件扩展名),并添加以下内容:
# 使用官方Python 3.10.12作为基础镜像 FROM python:3.10.12 # 设置容器内的工作目录 WORKDIR /app # 将requirements.txt文件复制到容器的工作目录中 COPY requirements.txt ./ # 在容器中安装所有Python依赖包。--quiet参数可减少输出信息 RUN pip install -r requirements.txt --quiet # 将项目根目录下的所有文件复制到容器的工作目录中 COPY . . # 暴露容器的8000端口,供外部访问。这只是声明,实际端口映射在运行时指定 EXPOSE 8000 # 定义容器启动时执行的命令。这里以Django开发服务器为例 CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
Dockerfile指令详解:
- FROM python:3.10.12: 指定构建镜像所基于的基础镜像。这里我们选择官方的Python 3.10.12镜像,它包含了Python运行时环境。
- WORKDIR /app: 设置容器内部的工作目录为/app。后续的所有操作都将在此目录下进行。
- COPY requirements.txt ./: 将宿主机当前目录下的requirements.txt文件复制到容器的/app目录下。
- RUN pip install -r requirements.txt --quiet: 在容器中执行命令,安装requirements.txt中列出的所有Python依赖。--quiet参数可以使安装过程的输出更加简洁。
- COPY . .: 将宿主机当前目录(项目根目录)下的所有文件和子目录复制到容器的/app目录下。
- EXPOSE 8000: 声明容器将监听8000端口。这只是一个文档化的声明,并不会自动进行端口映射。
- CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]: 定义容器启动时默认执行的命令。对于Django应用,这通常是启动开发服务器的命令。0.0.0.0表示监听所有可用的网络接口,以便从容器外部访问。
3. 构建Docker镜像
编写完Dockerfile后,就可以使用docker build命令来构建Docker镜像了。在项目根目录下(Dockerfile所在目录),执行以下命令:
docker build -t my-app-img:0.1.0 .
命令详解:
- docker build: 构建Docker镜像的命令。
- -t my-app-img:0.1.0: 为构建的镜像指定名称和标签。my-app-img是镜像名称,0.1.0是标签(通常用于版本控制)。
- .: 指定构建上下文的路径,即Dockerfile所在的目录。Docker守护进程会从这个目录中查找Dockerfile和构建所需的文件。
构建过程可能需要一些时间,具体取决于您的网络速度和依赖包的数量。构建成功后,您可以使用docker images命令查看已创建的镜像。
4. 运行Docker容器
镜像构建完成后,就可以使用docker run命令来启动一个Docker容器,并在其中运行您的Python应用了。
docker run --rm -d -p 8000:8000/tcp my-app-img:0.1.0
命令详解:
- docker run: 启动一个新容器的命令。
- --rm: 容器停止后自动删除。这在开发和测试环境中非常有用,可以避免产生大量无用的停止容器。
- -d: 在后台(分离模式)运行容器,不会占用当前终端。
- -p 8000:8000/tcp: 端口映射。将宿主机的8000端口映射到容器的8000端口。这样,您就可以通过访问宿主机的8000端口来访问容器中运行的应用程序。
- my-app-img:0.1.0: 指定要运行的镜像名称和标签。
5. 访问应用程序
容器成功运行后,您可以通过浏览器访问应用程序。在您的Ubuntu桌面或其他能够访问宿主机的设备上,打开浏览器并输入以下地址:
http://localhost:8000/
如果一切顺利,您将看到您的Python应用程序(如Django REST Framework的欢迎页面或API端点)在Docker容器中正常运行。
注意事项与最佳实践
为了构建更健壮、高效和安全的Docker化Python应用,请考虑以下最佳实践:
生产环境部署:
- WSGI服务器: python manage.py runserver仅适用于开发环境,不具备生产环境所需的性能、稳定性和安全性。在生产环境中,应使用Gunicorn、uWSGI等WSGI服务器来运行Django或Flask应用。
- 反向代理: 建议在WSGI服务器前部署Nginx或Apache等反向代理服务器,处理静态文件、负载均衡、SSL终止等任务。
依赖管理:
- 精确锁定版本: pip freeze可以锁定当前环境的精确版本。在团队协作或生产环境中,建议使用pip-tools等工具来管理依赖,确保requirements.txt中的版本是确定的。
镜像优化:
- .dockerignore文件: 在项目根目录下创建.dockerignore文件,列出不需要复制到镜像中的文件和目录(例如.git/, __pycache__/, venv/, .env等)。这可以显著减小镜像体积,加快构建速度。
- 多阶段构建: 对于生产环境,可以采用多阶段构建(Multi-stage builds)。例如,在一个阶段安装构建工具和编译依赖,然后在另一个阶段只复制最终的运行时文件,从而生成一个更小、更安全的生产镜像。
环境变量:
- 敏感信息: 数据库凭据、API密钥等敏感信息不应硬编码在Dockerfile或代码中。应通过Docker的环境变量(-e参数或--env-file)在容器运行时传递。
日志处理:
- 标准输出/错误: 容器化应用应将日志输出到标准输出(stdout)或标准错误(stderr),而不是写入文件。这样,Docker的日志驱动程序可以捕获这些日志,并与日志管理系统(如ELK Stack, Splunk)集成。
数据持久化:
- Docker卷(Volumes): 如果应用程序需要存储持久化数据(如数据库文件、用户上传的文件),应使用Docker卷(Volumes)或绑定挂载(Bind Mounts)来确保数据在容器生命周期之外的持久性,即使容器被删除,数据也不会丢失。
总结
通过本教程,您应该已经掌握了在Ubuntu系统上使用Docker容器化Python应用的基本流程。从依赖管理到Dockerfile编写,再到镜像构建和容器运行,Docker提供了一种高效、可移植的方式来部署您的应用程序。遵循最佳实践,您可以进一步优化您的Docker化应用,使其在开发和生产环境中都能表现出色。
今天带大家了解了的相关知识,希望对你有所帮助;关于文章的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

- 上一篇
- Golang模块许可证添加方法详解

- 下一篇
- PHPTraits高效复用技巧解析
-
- 文章 · python教程 | 4分钟前 |
- Python连接Snowflake数据仓库方法详解
- 236浏览 收藏
-
- 文章 · python教程 | 7分钟前 |
- PythonPillow图片处理教程详解
- 337浏览 收藏
-
- 文章 · python教程 | 1小时前 |
- Python判断键是否存在方法
- 479浏览 收藏
-
- 文章 · python教程 | 1小时前 | Python 继承 类型检查 抽象基类 isinstance()
- Python中isinstance()使用方法详解
- 140浏览 收藏
-
- 文章 · python教程 | 1小时前 |
- Pandas多列字符串匹配与列扩展技巧
- 308浏览 收藏
-
- 文章 · python教程 | 1小时前 | Python Python数据处理
- Python处理文本编码问题的技巧
- 315浏览 收藏
-
- 文章 · python教程 | 1小时前 |
- Python跨模块异常处理技巧分享
- 473浏览 收藏
-
- 文章 · python教程 | 2小时前 |
- PandasNumPy行数据相加技巧
- 264浏览 收藏
-
- 文章 · python教程 | 2小时前 |
- Python高效读写Parquet技巧
- 339浏览 收藏
-
- 文章 · python教程 | 2小时前 |
- Pythonrequests发送HTTP请求教程
- 490浏览 收藏
-
- 文章 · python教程 | 2小时前 |
- Python+TesseractOCR训练工具教程
- 213浏览 收藏
-
- 文章 · python教程 | 2小时前 |
- Python连接PostgreSQL教程及psycopg2配置指南
- 288浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 514次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 499次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 484次学习
-
- AI Mermaid流程图
- SEO AI Mermaid 流程图工具:基于 Mermaid 语法,AI 辅助,自然语言生成流程图,提升可视化创作效率,适用于开发者、产品经理、教育工作者。
- 445次使用
-
- 搜获客【笔记生成器】
- 搜获客笔记生成器,国内首个聚焦小红书医美垂类的AI文案工具。1500万爆款文案库,行业专属算法,助您高效创作合规、引流的医美笔记,提升运营效率,引爆小红书流量!
- 433次使用
-
- iTerms
- iTerms是一款专业的一站式法律AI工作台,提供AI合同审查、AI合同起草及AI法律问答服务。通过智能问答、深度思考与联网检索,助您高效检索法律法规与司法判例,告别传统模板,实现合同一键起草与在线编辑,大幅提升法律事务处理效率。
- 462次使用
-
- TokenPony
- TokenPony是讯盟科技旗下的AI大模型聚合API平台。通过统一接口接入DeepSeek、Kimi、Qwen等主流模型,支持1024K超长上下文,实现零配置、免部署、极速响应与高性价比的AI应用开发,助力专业用户轻松构建智能服务。
- 476次使用
-
- 迅捷AIPPT
- 迅捷AIPPT是一款高效AI智能PPT生成软件,一键智能生成精美演示文稿。内置海量专业模板、多样风格,支持自定义大纲,助您轻松制作高质量PPT,大幅节省时间。
- 435次使用
-
- Flask框架安装技巧:让你的开发更高效
- 2024-01-03 501浏览
-
- Django框架中的并发处理技巧
- 2024-01-22 501浏览
-
- 提升Python包下载速度的方法——正确配置pip的国内源
- 2024-01-17 501浏览
-
- Python与C++:哪个编程语言更适合初学者?
- 2024-03-25 501浏览
-
- 品牌建设技巧
- 2024-04-06 501浏览