SSL証明書・Go言語開発・Linuxサーバー構築・セキュリティ
執筆:株式会社エスロジカル(Webシステム受託開発・インフラ構築・運用改善)
Docker Compose は開発環境だけでなく、小〜中規模の本番環境にも十分活用できます。
Kubernetes の前段として使うことも多く、「まず Compose で動かして、必要になったら Kubernetes へ」
という段階的なアプローチが実務では効果的です。
本記事では、開発環境と本番環境の違いを踏まえた Docker Compose 本番設計のポイントを解説します。
| 項目 | 開発環境 | 本番環境 |
|---|---|---|
| コードのマウント | ホストのソースをコンテナにバインドマウント(ホットリロード) | イメージにコードを COPY(イミュータブル) |
| DB パスワード | 環境変数に直書きでも可 | Docker Secrets または安全な手段で渡す |
| SSL/TLS | なし / mkcert でローカル証明書 | 本番証明書が必須 |
| リスタートポリシー | なし(手動再起動) | restart: unless-stopped または on-failure |
| リソース制限 | 不要 | CPU・メモリ上限を設定(暴走防止) |
| ログ | コンソール出力をそのまま確認 | ログドライバー設定・ローテーション必須 |
image: myapp:latest ではなく image: myapp:v1.2.3 のようにバージョンを固定し、意図しない更新を防ぐ。compose.yaml(共通)と compose.prod.yaml(本番上書き)に分割し、docker compose -f compose.yaml -f compose.prod.yaml up で起動する。restart: unless-stopped を設定し、サーバー再起動後に自動で起動するようにする。本番での安全なシークレット管理方法:
Docker Compose 構成で HTTPS を提供する場合、Nginx コンテナで SSL ターミネーションを行うのが一般的です。
volumes: - /etc/ssl/myapp:/etc/nginx/ssl:ro)。Docker の healthcheck を設定することで、コンテナが起動していてもアプリが正常でない状態を検知できます。 また、依存サービス(DB)の起動完了を待ってアプリを起動するために使えます。
mysqladmin ping または pg_isready を healthcheck に設定する。/health エンドポイントを用意し、curl -f http://localhost:8080/health を healthcheck にする。depends_on: db: condition: service_healthy で DB ヘルスチェック完了を待ってアプリを起動する。max-size: "50m"・max-file: "5" でローテーションを設定する。設定なしではログがディスクを圧迫します。deploy.resources.limits でリソース上限を設定する。read_only: true にし、不正な書き込みを防ぐ。cap_drop: [ALL] で不要な Linux ケーパビリティを削除する。USER appuser を指定し、root での実行を避ける。| 条件 | 推奨 |
|---|---|
| 単一サーバーで動かしている | Docker Compose で十分 |
| 複数サーバーへのスケールが必要 | Kubernetes または Docker Swarm を検討 |
| ローリングアップデートが必要 | Kubernetes を検討(Compose でも工夫次第で可能) |
| 運用チームが小さい(1〜3人) | Kubernetes のオーバーヘッドは大きい。Compose の方が現実的 |
| クラウドのマネージド Kubernetes(EKS / AKS)を使える | インフラ管理の負荷を軽減できる場合は Kubernetes も選択肢に |