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
Dockerfile2. 不要なポートを公開しない
React → 3000
API → 4000
DB → 外部公開しない(絶対に)
db:
ports: [] # 外部公開しない
YAML3. 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 を自分で書ける
