Docker实战:Python应用从打包到部署全流程

本文将以一个简单的Python Flask应用为例,带你快速走通Docker从本地打包测试到服务器部署的全流程。

1、准备工作

项目结构

1
2
3
4
myapp/
├── app.py
├── requirements.txt
└── Dockerfile

示例文件

app.py - 一个简单的Flask应用

1
2
3
4
5
6
7
8
9
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello():
return 'Hello Docker!'

if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)

requirements.txt

1
flask==2.3.3

Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 使用Python官方镜像
FROM python:3.9-slim

# 设置工作目录
WORKDIR /app

# 复制依赖文件
COPY requirements.txt .

# 安装依赖
RUN pip install -r requirements.txt

# 复制应用代码
COPY . .

# 暴露端口
EXPOSE 5000

# 启动命令
CMD ["python", "app.py"]

2、本地构建和测试

构建Docker镜像

1
2
# 在项目目录下执行
docker build -t my-python-app .

查看构建的镜像

1
docker images

本地运行测试

1
2
3
4
5
6
# 运行容器
docker run -d -p 5000:5000 --name myapp my-python-app

# 测试应用
curl http://localhost:5000
# 应该返回: Hello Docker!

查看容器状态

1
2
docker ps
docker logs myapp

停止和清理

1
2
docker stop myapp
docker rm myapp

3、推送到Docker Hub

登录Docker Hub

1
docker login

标记镜像

1
2
# 格式: docker tag 本地镜像 用户名/仓库名:标签
docker tag my-python-app yourusername/my-python-app:v1.0

推送镜像

1
docker push yourusername/my-python-app:v1.0

4、服务器部署

服务器环境准备

1
2
3
4
5
6
# 安装Docker
curl -fsSL https://get.docker.com | sh

# 启动Docker服务
systemctl start docker
systemctl enable docker

拉取并运行镜像

1
2
3
4
5
# 拉取镜像
docker pull yourusername/my-python-app:v1.0

# 运行容器
docker run -d -p 5000:5000 --name myapp-prod yourusername/my-python-app:v1.0

服务器测试

1
2
3
4
5
# 测试应用
curl http://localhost:5000

# 或者从外部访问
curl http://服务器IP:5000

5、生产环境优化

使用docker-compose(可选)

创建 docker-compose.yml

1
2
3
4
5
6
7
version: '3'
services:
web:
image: yourusername/my-python-app:v1.0
ports:
- "5000:5000"
restart: unless-stopped

运行:

1
docker-compose up -d

常用管理命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 查看运行中的容器
docker ps

# 查看容器日志
docker logs myapp-prod

# 进入容器
docker exec -it myapp-prod bash

# 停止容器
docker stop myapp-prod

# 重启容器
docker restart myapp-prod

# 删除容器
docker rm myapp-prod

# 删除镜像
docker rmi yourusername/my-python-app:v1.0