临汾技术博客:Docker容器化部署Nginx+Flask+Pos方案

2026-08-11 10 阅读 技术博客
技术博客
临汾技术博客:Docker容器化部署Nginx+Flask+Pos方案

为什么容器化部署

还记得以前部署应用的痛苦吗?在服务器上手动安装Python/ pip/ PostgreSQL/ Nginx…版本冲突依赖缺失环境不一致…"在我电脑上是好的啊"成了程序员的噩梦。Docker容器化彻底解决了这些问题——将应用及其所有依赖打包到一个标准化的容器中保证在任何环境中都以相同的方式运行。对于临汾的技术团队来说掌握Docker部署已经成为必备技能。

Dockerfile编写最佳实践

Flask应用Dockerfile:基础镜像选择python:3.11-slim-bullseye(精简版体积小);利用Docker缓存机制——先复制requirements.txt安装依赖(这层会被缓存除非requirements.txt变化)再复制源代码(每次代码变更只重新构建这一层);设置非root用户运行(提高安全性);使用gunicorn作为WSGI服务器而非flask run(开发服务器不适合生产)。示例:
FROM python:3.11-slim-bullseye
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
C>USER nobody
CMD ["gunicorn", "-w", "4", "-b", "0.0.0.0:8000", "app:create_app()"]
Nginx Dockerfile:基于nginx:alpine(极简版);自定义nginx.conf配置反向代理(upstream指向flask容器)/ SSL证书/ gzip压缩/ 静态文件缓存/ 安全headers;SSL证书文件通过docker secret或volume挂载。

docker-compose.yml编排

使用Docker Compose将多个容器编排为一个统一的服务。典型的三层架构compose文件包含4个服务:
1. db(PostgreSQL):使用官方postgres镜像通过volume持久化数据(/var/lib/postgresql/data挂载到named volume)设置POSTGRES_PASSWORD等环境变量暴露端口仅给internal网络不对外
2. web(Flask):build上下文指向Dockerfile位置depends_on db(等待数据库就绪)连接db服务名作为hostname环境变量传入DATABASE_URL
3. nginx:配置反向代理proxy_pass http://web:8000; 挂载ssl证书和nginx.conf ports映射80:80和443:443 depends_on web
4. redis(可选):缓存服务用于session存储和热点数据缓存
使用docker compose up -d一键启动所有服务docker compose logs -f查看日志docker compose down停止清理。