5分钟教会你用Docker部署一个Python应用
本文详细介绍如何使用Docker部署Python项目,涵盖Dockerfile常用指令解析、镜像构建及容器运行流程。通过Flask示例演示从开发测试到端口映射的完整操作,帮助开发者快速掌握容器化部署技能。
前言
在传统物理机或云服务器上部署项目时,往往面临诸多痛点。
常见问题包括项目部署效率低下、服务器资源利用率低、迁移过程复杂以及扩展性不足。
相比之下,采用 Docker 进行项目部署具有显著优势:
- 能够高效利用系统资源。
- 服务启动速度更快。
- 环境保持一致,使得迁移操作更加便捷。
本文将介绍使用 Docker 部署 Python 项目的标准流程。
1. Dockerfile 描述文件
Dockerfile 是位于项目根目录下的配置文件,Docker 命令可依据该文件构建镜像。
其中常用的指令包括:
FROM
用于指定基础镜像。
MAINTAINER
用于指定维护者信息,该指令可省略。
RUN
通常与安装命令结合使用,用于安装工具及依赖包。
ADD
用于将宿主机文件复制到容器内,并自动执行解压操作。
COPY
功能与 ADD 类似,但不会执行解压操作。
WORKDIR
用于切换容器内的工作目录。
VOLUME
用于配置宿主机与容器之间的目录映射。
EXPOSE
用于配置容器内项目对外暴露的端口号。
CMD
用于指定容器启动后执行的命令。
例如,可通过该指令运行特定命令来启动项目。
2. 实战一下
使用 Docker 部署应用的常规流程如下:
首先完成项目开发并在本地测试通过。
随后编写 Dockerfile 并放置到项目根目录。
接着打包生成镜像文件。
然后运行镜像容器。
最后进行功能测试。
为便于演示,本文以简单的 Flask 项目为例进行讲解。
2-1 项目开发
from flask import Flask
# 安装依赖
# pip3 install -U flask
app = Flask(__name__)
@app.route('/')
def index():
return "测试容器部署!"
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8888)
# 浏览器访问测试
# http://127.0.0.1:8888/
项目开发完成并通过本地测试后,即可开始编写 Dockerfile 文件。
2-2 编写 Dockerfile
在项目根目录下创建 Dockerfile 文件,并依据前述指令编写描述脚本。
需注意,Dockerfile 中通过 EXPOSE 指令暴露的端口号,必须与入口文件中定义的端口号保持一致。
# Dockerfile
FROM centos:7.9.2009
RUN yum makecache fast;
RUN yum install python3-devel python3-pip -y
RUN pip3 install -i https://pypi.douban.com/simple flask
COPY main.py /opt
WORKDIR /opt
EXPOSE 8888
CMD ["python3","main.py"]
2-3 构建镜像
# 在当前文件夹下,根据Dockerfile文件构建一个镜像
# 镜像名称:xag/my_flask_web
# --no-cache:不使用旧的缓存进行镜像构建
docker build --no-cache -t "xag/my_flask_web" .
2-4 运行镜像容器
使用 docker run 命令基于已构建的镜像运行容器。
其中涉及的参数说明如下:
-d:表示容器在后台运行,而非前台运行。
--name:用于指定容器的别名。
-p:用于配置宿主机与容器之间的端口映射。
# -d:后台运行
# 宿主机(9999)映射容器内的8888(上面Dockerfile已经暴露了8888端口)
docker run -d --name flask_web -p 9999:8888 xag/my_flask_web
2-5 测试一下
最后,在浏览器中通过宿主机暴露的端口号 9999 访问项目。
访问地址为:http://127.0.0.1:9999/
3. 总结
本文通过一个简单的 Web 项目,阐述了利用 Docker 部署项目的标准流程。
实际上,Dockerfile 具有极高的灵活性,还支持 ARG/ENV 设置环境变量、VOLUME 指令挂载目录、ENTRYPOINT 配置启动程序和参数等功能,读者可根据官方文档自行扩展学习。
至此,关于使用 Docker 部署 Python 应用的介绍到此结束。如需了解更多相关内容,请搜索本站历史文章或继续浏览后续文章,感谢大家的支持!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









