Docker 镜像构建实战:Ubuntu 22.04 + Flask 2.1 打造 8000 端口 Web 服务
·
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"]
关键优化点说明:
- 分层缓存 :将不常变动的操作(如依赖安装)放在前面,利用 Docker 缓存加速构建
-
清理缓存
:
rm -rf /var/lib/apt/lists/*减少镜像体积 -
无缓存安装
:
--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%。在实际项目中,这种优化能显著提升部署效率和运行性能。
更多推荐


所有评论(0)