小王最近接了个小项目,要给客户搭个内部用的 API 服务。以前他习惯直接在服务器上装 Python、配 Nginx、改配置、跑进程,结果上线后发现换台机器又得重来一遍,ref="/tag/271/" style="color:#479099;font-weight:bold;">环境不一致还老出错。后来他试了容器技术,三行命令就把整个服务打包带走,换服务器一运行就起来——这背后靠的就是靠谱的容器部署方法。
先搞懂:容器不是虚拟机,是“打包运行”的新思路
别一上来就背概念。你可以把容器理解成一个带好所有依赖(Python 版本、库、配置文件、启动脚本)的“软件快递盒”。它不模拟整台电脑,只隔离进程和文件系统,启动快、体积小、在哪都能跑。
Docker 是最常用的入门工具
大多数人的容器部署,就是从 Docker 开始的。装好 Docker Desktop(Mac/Windows)或 docker.io(Linux)后,第一步是写个 Dockerfile:
FROM python:3.11-slim
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . /app
WORKDIR /app
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "app:app"]这个文件就像一份“安装说明书”,告诉 Docker 怎么一步步构建镜像。接着执行:
docker build -t my-api .
docker run -d -p 8000:8000 --name api-prod my-api服务就跑起来了。本地测试没问题,打包好的镜像可以直接拷到另一台装了 Docker 的服务器上运行,完全不用操心环境差异。
进阶一点:用 docker-compose 管理多服务
真实项目往往不止一个组件。比如一个博客系统,前端 Vue、后端 Flask、数据库 PostgreSQL,三个服务要协同工作。这时候手敲一堆 docker run 就太累了。建个 docker-compose.yml 更清爽:
version: "3.9"
services:
web:
build: ./web
ports: ["8080:80"]
depends_on: [db]
db:
image: postgres:15
environment:
POSTGRES_PASSWORD: example
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:然后一条命令:docker-compose up -d,三个服务自动拉起、联网、按顺序启动,连数据库连接地址都自动注入好了。
再往上走:轻量级生产部署(不碰 Kubernetes)
很多中小项目根本用不上 K8s。一台云服务器 + Docker + nginx-proxy + 自动重启,足够稳稳当当跑一年。比如用 systemd 管理容器生命周期:
# /etc/systemd/system/my-api.service
[Unit]
Description=My API Service
After=docker.service
StartLimitIntervalSec=0
[Service]
Type=oneshot
ExecStart=/usr/bin/docker run --rm --name my-api -p 8000:8000 my-api
ExecStop=/usr/bin/docker stop my-api
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target启用并开机自启:sudo systemctl enable my-api && sudo systemctl start my-api。崩溃自动重启,日志还能用 journalctl -u my-api 查,比裸跑进程省心多了。
顺手提醒几个踩过的坑
• 镜像别用 latest 标签——今天能跑,明天更新可能就崩;固定版本号更稳妥,比如 python:3.11.8-slim。
• 容器里别跑 ssh 或多个主进程,一个容器一个职责,日志打 stdout,让 Docker 统一收。
• 本地开发用 docker-compose.yml,生产环境建议生成单独的 docker-compose.prod.yml,关掉 dev 工具、开日志轮转、限制内存用量。
容器部署的核心不是炫技,而是让“在我机器上能跑”变成“在任何地方都能稳定跑”。动手写个 Dockerfile,跑通第一个 docker run,你就已经跨过那道门槛了。