Docker | 2週間で実務レベルに到達するDocker学習:環境変数と設定管理 - Day9

Docker Docker
スポンサーリンク

Day9:環境変数と設定管理 後半

テーマ:本番運用でも安全・確実に動く“環境変数管理の完成形”を理解し、環境差異を完全に吸収できるアプリを作る

後半では、前半・中盤で学んだ
環境変数・.env・Docker Compose の連携
をさらに実務レベルへ引き上げます。

ここを理解すると、あなたは
「開発・テスト・本番のすべてで同じアプリを安全に動かせるエンジニア」
になります。


本番環境では .env をどう扱うべきか

.env は“本番サーバー側で管理する”

開発では .env をローカルに置きますが、
本番では GitHub に置かず、サーバー側で管理 します。

理由は明確で、
パスワード・APIキー・DB接続情報が漏れると重大事故になるため。

本番での .env の置き場所

例:

  • サーバーの /opt/app/.env
  • Docker ホストの /var/app/.env
  • CI/CD(GitHub Actions など)のシークレット機能

本番の .env は 絶対に Git に含めない のが鉄則です。


Docker Compose で本番用の環境変数を読み込む

compose.yml に .env を直接書かない

悪い例:

environment:
  DB_PASSWORD: secret
YAML

これは パスワードがファイルに残る ため危険です。

正しい例:.env を外部に置く

services:
  api:
    env_file:
      - .env
YAML

.env(サーバー側に置く):

DB_PASSWORD=supersecret

これで compose.yml に秘密情報を残さずに済む ため安全です。


Docker Secret を使うとさらに安全になる

Docker Secret とは

パスワードや鍵を 暗号化して安全に渡す仕組み です。

例:

echo "supersecret" | docker secret create db_password -

compose(Swarm モード):

services:
  api:
    secrets:
      - db_password

secrets:
  db_password:
    external: true
YAML

アプリ側では /run/secrets/db_password として読み取れます。

重要ポイント

  • .env より安全
  • 本番運用でよく使われる
  • パスワードがファイルに残らない

初心者はまず .env で十分ですが、
本番では Secret を使うのがベストプラクティス です。


設定を“階層化”して管理する

1つの .env で全部管理しようとすると破綻する

環境が増えると .env が肥大化します。

例:

  • .env.dev
  • .env.test
  • .env.staging
  • .env.prod

これらを使い分けることで、
環境ごとに設定を完全に分離 できます。

例:開発用

APP_ENV=development
DB_HOST=localhost
DB_PASSWORD=devpass

例:本番用

APP_ENV=production
DB_HOST=prod-db.internal
DB_PASSWORD=supersecret

アプリは process.env.APP_ENV を見て挙動を変えます。


12-Factor App の“設定は環境変数に置け”という原則

世界的に有名なアプリ設計の原則

12-Factor App(Heroku が提唱)は、
設定は環境変数に置くべき と明言しています。

理由:

  • コードと設定を分離できる
  • 環境差異を吸収できる
  • セキュリティが向上する
  • デプロイが簡単になる

Docker はこの思想と非常に相性が良いです。


実務で使う“環境変数の完全版構成例”

docker-compose.yml

services:
  api:
    image: myapp
    env_file:
      - .env
    ports:
      - "3000:3000"
    depends_on:
      - db

  db:
    image: mysql:8
    env_file:
      - .env
    volumes:
      - dbdata:/var/lib/mysql

volumes:
  dbdata:
YAML

.env(開発用)

APP_ENV=development
APP_PORT=3000

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

.env(本番用)

APP_ENV=production
APP_PORT=3000

DB_HOST=prod-db.internal
DB_USER=prod
DB_PASSWORD=supersecret
DB_NAME=myapp

アプリは同じコードで動き、
設定だけが環境ごとに切り替わる という理想形です。


後半まとめ

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

  • 本番の .env は Git に含めず、サーバー側で管理する
  • Docker Compose は env_file で安全に環境変数を読み込める
  • Docker Secret を使うとさらに安全
  • .env を環境ごとに分けることで設定を階層化できる
  • 12-Factor App の原則「設定は環境変数に置け」を実践できる
  • 開発・テスト・本番の差異を完全に吸収できる
タイトルとURLをコピーしました