小王刚写完一个 Python Web 服务,想快速在公司测试环境跑起来,又不想反复装依赖、配 Nginx、改端口——他试了下 docker run -p 8000:8000 my-web-app,刷新浏览器,页面就出来了。这不是玄学,是容器技术部署方法落地最真实的日常。
为什么不用虚拟机,偏选容器?
虚拟机要装一整套操作系统,启动慢、占资源;容器只打包应用和它直接需要的库,像把厨房连同菜谱、调料、锅具一起打包带走——到哪都能开火炒菜。部署快、复现准、迁移稳,特别适合开发、测试、CI/CD 这类需要频繁启停和环境一致性的场景。
最常用的部署三步法
第一步:写好 Dockerfile
不是凭空造镜像,得有“配方”。比如一个 Flask 应用:
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "app:app"]
保存为 Dockerfile,同一目录下运行 docker build -t my-flask-app .,镜像就建好了。
第二步:本地验证跑通
别急着上服务器,先用容器跑一遍:
docker run -d --name web-test -p 8000:8000 my-flask-app
访问 http://localhost:8000,能打开就说明镜像没问题。加 -d 是后台运行,--name 方便后续管理。
第三步:推到仓库,部署到目标机器
比如用阿里云 ACR 或自建 Harbor,打标签再推送:
docker tag my-flask-app registry.cn-hangzhou.aliyuncs.com/my-team/my-flask-app:v1.2
docker push registry.cn-hangzhou.aliyuncs.com/my-team/my-flask-app:v1.2
然后登录生产服务器,拉下来直接跑:
docker pull registry.cn-hangzhou.aliyuncs.com/my-team/my-flask-app:v1.2
docker run -d --restart=always -p 80:8000 \
--name prod-web \
registry.cn-hangzhou.aliyuncs.com/my-team/my-flask-app:v1.2
--restart=always 保证宕机后自动恢复,这是线上部署的刚需。
进阶一点:用 docker-compose 管理多容器
你的服务如果还带 Redis 和 PostgreSQL,手动起三个容器太累。写个 docker-compose.yml:
version: '3.8'
services:
web:
image: registry.cn-hangzhou.aliyuncs.com/my-team/my-flask-app:v1.2
ports: ["80:8000"]
depends_on: [redis, db]
redis:
image: redis:7-alpine
db:
image: postgres:15
environment:
POSTGRES_PASSWORD: example
一条命令:docker-compose up -d,三个服务全拉起,网络自动打通,连 IP 都不用记。
别跳过的细节
· 日志别丢:默认 docker logs -f container-name 就能看到 stdout,但线上建议挂载日志卷或对接 ELK;
· 数据持久化:数据库容器一定要用 volumes 把 /var/lib/postgresql/data 映射出来,不然重启就丢库;
· 安全不将就:别用 root 用户跑应用,Dockerfile 里加上 user 1001,非必要不开放 2375 端口。
容器部署不是银弹,但它让“在我机器上能跑”这句话,第一次变得可信。你不需要懂全部底层原理,只要掌握这三步 + 两个配置文件,就能把服务稳稳当当送上服务器。