Docker | 2週間で実務レベルに到達するDocker学習:実務課題(重要) - Day13

Docker Docker
スポンサーリンク

Day13:実務課題(後半)

テーマ:本番レベルの Compose 構成に仕上げる ― 安定性・再現性・セキュリティを強化する

後半では、前半・中盤で作った
React(frontend)+API(backend)+MySQL(db)
の Compose 構成を、実務で使えるレベルにまで引き上げます。

ここで扱うのは、現場で必ず必要になる以下のポイントです。

  • healthcheck(サービスの生存確認)
  • envファイルによる環境変数管理
  • ボリュームの最適化
  • セキュリティと本番運用の注意点
  • 再現性の高いディレクトリ構成

これらを理解すると、あなたは
「実務構成を再現できるエンジニア」
に到達します。


Healthcheck を使って「サービスが本当に動いているか」を確認する

depends_on の弱点

中盤で学んだ depends_on起動順序 しか保証しません。
しかし、MySQL は起動してから 実際に接続可能になるまで数秒かかる ことがあります。

そのため、API が DB に接続しようとして失敗することがある。

healthcheck を追加して“本当に起動したか”を確認する

db:
  image: mysql:8
  environment:
    MYSQL_ROOT_PASSWORD: password
    MYSQL_DATABASE: myapp
    MYSQL_USER: user
    MYSQL_PASSWORD: password
  healthcheck:
    test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
    interval: 5s
    timeout: 5s
    retries: 10
YAML

これで何が変わるか

  • MySQL が「本当に接続可能」になるまで API が待てる
  • 起動時の接続エラーが激減する
  • 本番環境でも安定して動く

実務では healthcheck は必須 です。


環境変数を env ファイルで管理する(実務の基本)

Compose に直接書くのは NG

中盤ではこう書きました。

environment:
  DB_HOST: db
  DB_USER: user
  DB_PASSWORD: password
YAML

しかし、実務では パスワードを Compose に直書きするのは危険 です。

.env ファイルに切り出す

DB_HOST=db
DB_USER=user
DB_PASSWORD=password
DB_NAME=myapp

Compose 側ではこう書く

environment:
  DB_HOST: ${DB_HOST}
  DB_USER: ${DB_USER}
  DB_PASSWORD: ${DB_PASSWORD}
  DB_NAME: ${DB_NAME}
YAML

メリット

  • パスワードを Git に含めない
  • 開発・本番で env ファイルを切り替えるだけで動く
  • セキュリティと再現性が向上

実務では env ファイル管理は必須スキル です。


ボリュームの最適化 ― DB だけでなく API や frontend も考える

DB の永続化は必須

volumes:
  - db-data:/var/lib/mysql
YAML

これは前半・中盤で説明した通り。

しかし API や frontend はどうする?

結論:
API や frontend は基本的に永続化しない。

理由:

  • ソースコードは Git で管理する
  • コンテナは使い捨て
  • 永続化するとキャッシュが壊れることがある

永続化するのは DB だけ が基本です。


セキュリティ強化 ― 本番で絶対にやるべきこと

1. root で動かさない

API コンテナは root で動かすべきではありません。

RUN useradd -m appuser
USER appuser
Dockerfile

2. 不要なポートを公開しない

React → 3000
API → 4000
DB → 外部公開しない(絶対に)

db:
  ports: []   # 外部公開しない
YAML

3. env ファイルを Git に含めない

.gitignore に追加する。

.env

再現性の高いディレクトリ構成を作る

実務でよく使われる構成

project/
  frontend/
    Dockerfile
    src/...
  api/
    Dockerfile
    src/...
  docker-compose.yml
  .env

なぜこの構成が良いのか

  • どのサービスがどのフォルダか一目で分かる
  • Dockerfile がサービスごとに独立している
  • CI/CD に載せやすい
  • チーム開発で迷わない

本番レベルの Compose(完成形)

version: "3.9"

services:
  frontend:
    build: ./frontend
    ports:
      - "3000:3000"
    environment:
      REACT_APP_API_URL: http://api:4000
    depends_on:
      - api

  api:
    build: ./api
    ports:
      - "4000:4000"
    environment:
      DB_HOST: ${DB_HOST}
      DB_USER: ${DB_USER}
      DB_PASSWORD: ${DB_PASSWORD}
      DB_NAME: ${DB_NAME}
    depends_on:
      - db

  db:
    image: mysql:8
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
      MYSQL_DATABASE: ${DB_NAME}
      MYSQL_USER: ${DB_USER}
      MYSQL_PASSWORD: ${DB_PASSWORD}
    volumes:
      - db-data:/var/lib/mysql
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 5s
      timeout: 5s
      retries: 10

volumes:
  db-data:
YAML

後半まとめ

あなたがここまで理解できていれば、Day13 のゴールは完全達成です。

  • healthcheck でサービスの安定性を確保できる
  • env ファイルで安全に環境変数を管理できる
  • 永続化は DB のみに行う理由を説明できる
  • root を使わないなど本番のセキュリティを理解している
  • 再現性の高いディレクトリ構成を作れる
  • 実務レベルの Compose を自分で書ける

タイトルとURLをコピーしました