6.3 Python项目容器化

系列 - 应用程序容器化
目录
实验目标
通过本实验,你将学习如何将Python应用程序容器化,把一个简单的Flask应用打包成Docker镜像,掌握基本的Dockerfile编写技巧。
项目概述
本次实验我们将使用一个基于Flask框架开发的简单网页应用进行容器化实践。Flask是Python中轻量级的Web框架,广泛应用于各类Web开发项目。
技巧
Flask是Python中非常流行的轻量级Web框架,它简单易学,适合初学者入门Web开发。
项目地址:https://git.seahi.me/docker/python-flask-docker-hello-world
传统运行方式
在没有使用Docker前,运行这个Python Flask项目通常需要以下步骤:
# 使用pip软件包管理工具安装项目依赖
pip install -r requirements.txt
# 运行项目
python app.py
摘要
pip是Python的包管理工具,用于安装和管理Python包。requirements.txt文件包含了项目所需的所有依赖包及其版本信息。
实验要求
- 编写Dockerfile将该Python Flask项目打包到Docker镜像中
- 父镜像使用
python:3
- 确保容器启动后应用可以正常访问
Dockerfile 关键指令
EXPOSE 指令详解
EXPOSE指令用于声明容器运行时将会使用的网络端口。它在Dockerfile中扮演着重要角色,主要有两个作用:
- 文档作用:向使用镜像的人表明容器需要映射哪些端口
- 功能作用:当使用
docker run -P
(大写P)时,Docker会自动将EXPOSE声明的所有端口映射到主机上的随机端口
EXPOSE的常见误解
EXPOSE指令不会实际开放端口,它只是一种声明。要让容器端口可从外部访问,仍需在
docker run
命令中使用-p
或-P
选项进行端口映射。实际使用示例
在Dockerfile中:
EXPOSE 80 443
这声明容器将使用80和443端口,但实际映射仍需通过以下方式完成:
# 将容器的80端口映射到主机的8080端口
docker run -p 8080:80 镜像名称
# 或者使用大写P自动映射所有EXPOSE的端口到随机端口
docker run -P 镜像名称
Flask应用端口暴露
对于Flask应用,通常需要暴露5000端口(Flask的默认端口)。在Dockerfile中可以添加:
EXPOSE 5000
参考Dockerfile结构
Dockerfile基本结构
一个完整的Dockerfile通常包含以下部分:
- 基础镜像(FROM)
- 工作目录设置(WORKDIR)
- 文件复制(COPY)
- 依赖安装(RUN)
- 端口暴露(EXPOSE)
- 启动命令(CMD)
提交作业
完成Dockerfile编写后,可以按照以下步骤验证:
# 构建Docker镜像
docker build -t python-flask-app .
# 运行容器
docker run --rm -d -p 5000:5000 python-flask-app