生产环境部署docker容器必须配置安全、稳定、可观测、可维护四大要素:强制资源限制(--memory、--cpus)、只读根文件系统(--read-only)、健康检查(healthcheck)、日志轮转(--log-opt)、配置与数据持久化挂载、固定版本镜像、密钥外部管理及alpine精简基础镜像。

基础运行参数必须加
裸用 docker run nginx 在生产中等于埋雷。至少补全这些:
- --restart=unless-stopped:宿主机重启后自动拉起容器,避免服务中断
- --memory=512m --cpus=0.5:限制资源,防止单个容器吃光服务器(Web 服务建议从 512MB 内存起步)
-
--read-only:根文件系统设为只读,阻断恶意写入(需配合
--tmpfs或-v挂载可写路径) - --pids-limit=100:限制进程数,防 fork 炸弹类攻击
健康检查不能少
容器“running”不等于服务可用。比如数据库容器启动了,但初始化还没完,应用连上去就失败。
正确做法是用 HEALTHCHECK 验证业务层面是否就绪:
- Nginx/HTTP 服务:
curl -f http://localhost/health || exit 1 - PostgreSQL:
pg_isready -U user -d dbname - 配在 Dockerfile 里,或
docker-compose.yml的healthcheck字段中 - 务必设
interval、timeout、retries,避免误判
日志和存储要持久化
默认日志存在 /var/lib/docker/ 下,不轮转会撑爆磁盘;配置文件硬编码进镜像,升级就丢配置。
-
日志:加
--log-opt max-size=100m --log-opt max-file=3,自动切割保留 -
配置文件:用
-v /host/conf/nginx.conf:/etc/nginx/nginx.conf:ro挂载,不打包进镜像 -
数据目录:如 MySQL 的
/var/lib/mysql、Redis 的/data,必须挂载到宿主机或命名卷
镜像和密钥要管住
两个高频翻车点:用 latest 镜像导致行为突变;把密码明文写进 docker-compose.yml 提交到 Git。
-
镜像标签:固定版本,例如
nginx:1.27-alpine,不用latest -
密钥管理:用
docker secrets(Swarm)或env_file+.env.prod(Compose),且该文件不进 Git -
基础镜像选型:优先
alpine系列(小、轻、攻击面小),避免ubuntu:latest这类大而全的镜像











