创新方案
生产环境部署 Docker Compose…
把开发用的 docker-compose 配置升级为可上生产的环境:安全加固、资源限制、健康检查、日志监控、备份与高可用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
生产环境部署 Docker Compos通用
解决思路
- 使用生产就绪的基础模板:为 nginx、api、worker、database、cache、backup 等服务定义 restart: unless-stopped、healthcheck、logging、deploy.resources 等配置。
- 安全加固:对容器设置 read_only: true,用 tmpfs 挂载 /tmp、/var/cache/nginx、/var/run 等可写目录。
- 安全加固:使用 cap_drop: [ALL] 丢弃所有能力,再按需 cap_add 必要能力(如 nginx 的 NET_BIND_SERVICE,postgres 的 CHOWN、DAC_OVERRIDE、FOWNER、SETGID、SETUID)。
- 安全加固:设置 security_opt: no-new-privileges:true,并加载 seccomp 配置文件(如 ./security/seccomp-profile.json)。
- 安全加固:指定非 root 用户运行,如 user: "nginx:nginx"、user: "1000:1000"、user: "postgres:postgres"。
- 安全加固:使用 Docker secrets 管理敏感数据,通过 secrets 挂载到 /run/secrets/,并设置 mode: 0400;数据库用 POSTGRES_PASSWORD_FILE 读取密码文件。
- 安全加固:把后端网络标记为 internal: true,前端网络设置 com.docker.network.bridge.enable_icc: "false",隔离服务间通信。
- 资源限制:在 deploy.resources.limits 中设置 cpus、memory、pids 上限,在 reservations 中设置 cpus、memory 下限。
- 资源限制:通过 ulimits 设置 nofile 和 nproc 的 soft/hard 值;为数据库设置 shm_size: '256mb';为 Redis 设置 sysctls.net.core.somaxconn: 1024。
- 高可用:为无状态服务设置 deploy.replicas(如 api 5 个、worker 3 个),前置 nginx 负载均衡器。
- 高可用:配置 update_config(parallelism、delay、order: start-first、failure_action: rollback)和 rollback_config 实现零停机滚动更新与回滚。
- 高可用:配置 restart_policy(condition: on-failure、delay、max_attempts、window);用 INSTANCE_ID: "{{.Task.Slot}}" 区分实例。
- 高可用:为数据库配置只读副本 database-replica,通过 POSTGRES_PRIMARY_HOST 指向主库,并用 replica-setup.sh 初始化。
- 健康检查:为每个服务配置 healthcheck,包含 test、interval、timeout、retries、start_period;nginx 用 wget --spider 检查 /health,api 用 node healthcheck.js,postgres 用 pg_isready,redis 用 redis-cli ping,rabbitmq 用 rabbitmq-diagnostics ping。
- 健康检查:用 depends_on 配合 condition: service_healthy 保证依赖服务就绪后再启动(如 api 依赖 database 和 cache)。
- 日志:为服务配置 logging.driver(json-file、syslog 或 fluentd)及 options,如 max-size、max-file、compress、labels、tag。
- 日志:集中式日志用 syslog 指向 tcp://logserver:514,或用 fluentd 指向 localhost:24224 并设置 fluentd-async-connect、fluentd-retry-wait、fluentd-max-retries。
- 监控:部署 Prometheus(配置 retention.time=30d、web.enable-lifecycle、挂载 prometheus.yml 和 alerts)、Grafana(用 GF_SECURITY_ADMIN_PASSWORD__FILE 读取密码、GF_INSTALL_PLUGINS 安装插件、挂载 provisioning 和 dashboards)。
- 监控:部署 node-exporter(挂载 /:/host:ro,rslave 并设置 path.rootfs 等参数)、cadvisor(privileged: true、挂载 /var/lib/docker 等)、Loki 与 promtail 收集日志。
- 备份:用 prodrigestivill/postgres-backup-local 配置 SCHEDULE: "@daily"、BACKUP_KEEP_DAYS: 7、BACKUP_KEEP_WEEKS: 4、BACKUP_KEEP_MONTHS: 6,挂载 ./backups 并依赖 database 健康。
- 备份:用 futurice/docker-volume-backup 配置 BACKUP_CRON_EXPRESSION、BACKUP_FILENAME、BACKUP_RETENTION_DAYS,并上传到 S3(AWS_S3_BUCKET_NAME、AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY_FILE)。
- 环境配置:用 ${VAR:-default} 形式参数化镜像版本、端口、日志级别等;通过 env_file 加载 .env.${ENVIRONMENT:-production} 和 .env.secrets。
- 数据库调优:通过 command 传入 postgres 参数,如 max_connections=200、shared_buffers=256MB、effective_cache_size=1GB、maintenance_work_mem=64MB、checkpoint_completion_target=0.9、wal_buffers=16MB、default_statistics_target=100、random_page_cost=1.1、effective_io_concurrency=200、work_mem=1MB、min_wal_size=1GB、max_wal_size=4GB。
- Redis 调优:通过 command 启用 appendonly yes、appendfsync everysec、maxmemory、maxmemory-policy allkeys-lru、requirepass。
- 卷管理:为 postgres-data 使用 driver_opts 绑定到宿主机目录(type: none、o: bind、device: /data/postgres),并为日志、缓存等创建独立卷。
- 最佳实践:固定镜像版本(如 nginx:1.25-alpine、postgres:15-alpine、redis:7-alpine),避免使用 latest。
- 最佳实践:只暴露必要端口,数据库和缓存不发布到宿主机;用内部网络隔离后端服务。
- 最佳实践:定期更新基础镜像、测试备份恢复流程、记录生产配置与部署流程文档。
适用边界 · 注意事项
- 单机开发或本地测试环境,不需要安全加固、资源限制、监控与备份等生产级配置。
- 无法使用 Docker secrets 或外部密钥管理、只能把密钥放在环境变量中的受限环境。
- 不需要高可用、滚动更新或水平扩展的小型内部应用,过度配置会增加复杂度。