Python Hexo Docker Linux 学习空间 i007it.com /2022/05/28/服务器Docker搭….. – 2025-06-06
这条旧摘要像存档里的一枚书签,提醒着当时准备整理的内容:在 Linux 服务器上,用 Docker 搭建一个可运行的 Flask 应用。它和 Hexo 这类静态站不同,Flask 需要常驻进程、依赖运行环境,也更适合放进容器里统一管理。这里沿着旧线索,把基础流程重新梳理一遍。
为什么用 Docker 跑 Flask
Flask 本身轻量,开发时直接 `flask run` 很方便,但放到服务器上就会遇到几个现实问题:Python 版本不一致、依赖装错环境、迁移机器后命令忘记、系统升级影响运行。Docker 的价值在于把应用代码、Python 运行时、依赖包和启动命令封装成镜像,服务器上只需要有 Docker,就能用相近方式运行。
对于个人学习空间或中小型服务,这种隔离方式足够清晰:镜像负责“应用长什么样”,容器负责“应用怎么跑”,宿主机只暴露必要端口。
准备一个最小 Flask 项目
先在服务器上准备目录,结构可以很简单:
“`text
flask_app/
├── app.py
├── requirements.txt
├── Dockerfile
└── .dockerignore
“`
`app.py` 只保留一个入口:
“`python
from flask import Flask
app = Flask(__name__)
app.route(路由装饰器)(“/”)
def index():
return “Hello from Flask in Docker”
“`
`requirements.txt` 写明依赖:
“`text
Flask
gunicorn
“`
开发服务器不适合直接对外,生产环境通常用 Gunicorn 作为 WSGI 服务器,再交给容器启动。
编写 Dockerfile
Dockerfile 的重点是分层缓存和运行边界:
“`dockerfile
FROM python:3-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install –no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD [“gunicorn”, “-b”, “0.0.0.0:8000”, “app:app”]
“`
先复制依赖文件再安装,可以在代码变动时复用依赖层。`–no-cache-dir` 能减少镜像体积。Gunicorn 监听 `0.0.0.0`,容器外部才能访问;如果只监听 `127.0.0.1`,端口映射会失效。
构建与启动容器
在项目目录执行构建:
“`bash
docker build -t flask-app .
“`
然后启动:
“`bash
docker run -d –name flask-app -p 8000:8000 flask-app
“`
这里把宿主机端口映射到容器端口。实际使用时,可以按服务器安全组、防火墙和反向代理规划调整。启动后查看日志:
“`bash
docker logs -f flask-app
“`
如果容器反复退出,优先看日志,而不是先改代码。常见原因包括依赖未安装、入口文件路径不对、Gunicorn 模块名写错、端口被占用。
验证与常见排错
在服务器本机测试:
“`bash
curl 127.0.0.1 端口 8000
“`
能返回页面内容,说明 Flask 与 Gunicorn 已在容器内正常工作。若外部无法访问,检查三处:容器是否运行、端口是否映射、服务器防火墙或安全组是否放行。
开发阶段还可以用挂载方式同步代码:
“`bash
docker run -d –name flask-dev -p 8000:8000 -v “$PWD”:/app flask-app
“`
但生产环境不建议直接挂载源码,也不建议用 Flask 自带调试服务器长期对外。
下一步做什么
基础镜像跑通后,接下来可以继续补:用 Nginx 反向代理、配置 HTTPS、通过环境变量区分开发与生产、使用 Docker Compose 管理多容器、把日志和数据目录持久化到宿主机。等这些环节接上,一个 Flask 应用才算从“能跑”走向“可维护”。
这篇作为服务器 Docker 搭建 Flask 应用的第一部分,先把最小闭环走通;后续再围绕部署细节继续展开。