· 全部指南
Docker Compose 可读性
多服务 stack 的 compose 文件很容易在几个迭代内从几十行膨胀到难以阅读的长文档。新人入职或线上排障时,第一个问题往往是:哪个服务连哪个数据库、哪些端口真正对外暴露?可读性差的 compose 会拖慢排查。docker-compose-converter 可在 JSON 与 YAML 之间转换并统一缩进,不改变语义,但能让 PR diff 清晰很多。
典型场景:你接手一份包含十二个服务、内联环境变量和重复 volume 挂载的 compose。第一步,把文件粘贴进 docker-compose-converter 格式化。第二步,把 POSTGRES_PASSWORD 等敏感值移到 env_file 或 Docker secrets,不要写在镜像名旁边。第三步,用 env-diff 对比 .env.staging 与 .env.production,在部署前发现缺失的 REDIS_URL。常见错误包括:把含真实凭据的 .env 提交进 Git、把管理界面绑定到主机 0.0.0.0、使用无法回滚的 latest 标签。
密钥永远不要进版本库。通过 env_file、Swarm secrets 或编排平台的密钥管理器注入。本地集成测试时,wiremock-stub-generator 可模拟上游 API,让 api 服务在 CI 中不依赖不稳定的外部沙箱。
Nginx 反向代理
Nginx 处于多数容器部署的边缘,负责 TLS 终止和流量路由。手写 server 块很容易出错:少一个分号或 proxy_pass 尾部斜杠写错,就可能把一半流量导向错误服务。nginx-config-generator 可生成 server、upstream 和 SSL 片段,粘贴到 /etc/nginx/conf.d/ 或 Kubernetes ConfigMap。先明确域名、upstream 主机名(Docker 服务名或 K8s DNS)以及是否需要 WebSocket。
以 Node.js API 为例,推荐工作流如下。第一,定义 upstream 块,列出各容器 IP 或服务名,并设置 max_fails 与 fail_timeout。第二,创建监听 443 的 server 块,配置证书路径。第三,设置 proxy_set_header Host $host 和 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for,让应用日志记录真实客户端 IP。第四,若使用 WebSocket,添加 proxy_http_version 1.1、Upgrade 与 Connection "upgrade" 头。第五,nginx -t 通过后再 reload。
TLS 可在 Nginx 用 Certbot 证书或云负载均衡终止。HSTS 应在全站 HTTPS 稳定后再开启;证书过期前贸然启用 HSTS 可能把用户锁在外面。实例:proxy_pass http://api_upstream/; 带尾部斜杠会剥离 location 前缀,不带则保留完整路径——混用是 Docker 环境中最常见的 404 来源之一。
与本地工具链
本地开发应沿用生产级纪律。发布前用 semver-calculator 对齐镜像 tag:1.4.2 表 patch,1.5.0 表向后兼容功能。compose 中的镜像引用应对齐这些 tag,而非漂浮在 latest 上。同事修改环境变量后,用 env-diff 并排查看「昨天能跑」与「今天挂了」之间的差异。
通过 wiremock-stub-generator 生成的 stub 可模拟支付网关、OAuth 提供方或未在笔记本上运行的内部微服务。把 OpenAPI 片段经 openapi-formatter 整理后生成 stub,将 compose 里的 api 指向 mock URL,可在进 staging 前发现契约不一致。
安全
容器栈默认偏「开放」,除非你主动收紧。限制管理面板暴露——pgAdmin、Redis Commander 和调试端口应绑定 127.0.0.1 或置于 VPN 之后。在 Nginx 设置 client_max_body_size 防止超大上传耗尽磁盘或内存。对登录、重置密码接口用 limit_req_zone 做速率限制。
在 Towalles 本地编辑配置再粘贴到生产。nginx-config-generator 与 docker-compose-converter 在浏览器运行,草稿不必经过第三方粘贴站。生产 secret 存入 vault、定期轮换,切勿出现在可能被录屏演示的 compose 里。收尾清单:全站 HTTPS、密钥不进 Git、尽量非 root 运行容器、定期更新镜像修补 CVE。