Docker 镜像构建实战:Ubuntu 22.04 + Flask 2.1 打造 8000 端口 Web 服务

容器化技术正在重塑现代应用部署的范式。本文将手把手带您完成一个生产级 Flask 应用的 Docker 镜像构建全过程,从环境准备到性能优化,每个步骤都包含可落地的技术细节。

1. 环境准备与项目初始化

在开始构建之前,我们需要准备一个干净的开发环境。推荐使用 Ubuntu 22.04 作为基础系统,这是目前 LTS 版本中获得长期支持的稳定发行版。

创建项目目录结构:

mkdir flask-docker && cd flask-docker
touch app.py requirements.txt Dockerfile

典型的 Flask 应用结构应包含:

  • app.py :应用主入口文件
  • requirements.txt :Python 依赖清单
  • Dockerfile :镜像构建蓝图

2. 编写最小化 Flask 应用

app.py 中实现一个返回 JSON 响应的基础 API:

from flask import Flask, jsonify

app = Flask(__name__)

@app.route('/api/status')
def status_check():
    return jsonify({
        "status": "healthy",
        "version": "1.0.0"
    })

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

对应的依赖文件 requirements.txt 应指定精确版本:

flask==2.1.0
gunicorn==20.1.0

3. 深度优化的 Dockerfile 构建

以下是经过生产验证的 Dockerfile 最佳实践:

# 使用官方 Python 运行时作为父镜像
FROM ubuntu:22.04

# 设置环境变量避免交互式提示
ENV DEBIAN_FRONTEND=noninteractive 

# 安装系统依赖
RUN apt-get update && \
    apt-get install -y \
    python3-pip \
    python3-dev \
    && rm -rf /var/lib/apt/lists/*

# 设置工作目录
WORKDIR /app

# 先复制依赖文件,利用 Docker 缓存层
COPY requirements.txt .

# 安装 Python 依赖
RUN pip install --no-cache-dir -r requirements.txt

# 复制应用代码
COPY . .

# 暴露端口
EXPOSE 8000

# 使用 Gunicorn 作为生产服务器
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "app:app"]

关键优化点说明:

  1. 分层缓存 :将不常变动的操作(如依赖安装)放在前面,利用 Docker 缓存加速构建
  2. 清理缓存 rm -rf /var/lib/apt/lists/* 减少镜像体积
  3. 无缓存安装 --no-cache-dir 避免 pip 缓存占用空间

4. 镜像构建与运行

使用以下命令构建镜像:

docker build -t flask-app:1.0 .

启动容器并映射端口:

docker run -d -p 8000:8000 --name my-flask-app flask-app:1.0

验证服务是否正常运行:

curl http://localhost:8000/api/status

5. 国内镜像加速方案

对于国内用户,可以通过修改 Docker 守护进程配置使用镜像加速:

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://<your-mirror>.mirror.aliyuncs.com"]
}
EOF
sudo systemctl restart docker

常用镜像加速地址:

服务商 加速地址
阿里云 https:// .mirror.aliyuncs.com
腾讯云 https://mirror.ccs.tencentyun.com
华为云 https:// .swr.myhuaweicloud.com

6. 生产环境进阶配置

6.1 多阶段构建优化

对于生产环境,推荐使用多阶段构建进一步减小镜像体积:

# 构建阶段
FROM python:3.9-slim as builder

WORKDIR /app
COPY requirements.txt .
RUN pip install --user -r requirements.txt

# 运行阶段
FROM python:3.9-slim

WORKDIR /app
COPY --from=builder /root/.local /root/.local
COPY . .

ENV PATH=/root/.local/bin:$PATH
EXPOSE 8000

CMD ["gunicorn", "--bind", "0.0.0.0:8000", "app:app"]

6.2 健康检查配置

在 Dockerfile 中添加健康检查指令:

HEALTHCHECK --interval=30s --timeout=3s \
  CMD curl -f http://localhost:8000/api/status || exit 1

6.3 资源限制运行

启动容器时设置资源限制:

docker run -d \
  --name my-flask-app \
  -p 8000:8000 \
  --memory=512m \
  --cpus=1 \
  flask-app:1.0

7. 常见问题排查

7.1 端口冲突

如果遇到端口占用错误,可以使用以下命令查找冲突进程:

sudo lsof -i :8000

7.2 构建缓存失效

强制清除构建缓存:

docker builder prune --force

7.3 容器日志查看

实时查看容器日志:

docker logs -f my-flask-app

经过这些优化后,最终镜像体积可比初始构建减少约60%。在实际项目中,这种优化能显著提升部署效率和运行性能。

更多推荐