言語を切り替える
テーマを切り替える

Docker Secrets完全ガイド:コンテナのパスワード管理、まだ環境変数でやってるの?

そのパスワード、全員に見えてますよ

ENV DB_PASSWORD=secret123

Dockerfileにこう書いてあるのを見て、背筋が凍ったことはありませんか?
Gitに上げれば世界中にパスワード公開です。

「じゃあ起動時に -e DB_PASSWORD=secret123 って渡せばいいんでしょ?」
これも実は危険です。docker inspect コマンドで誰でも見れてしまうし、ログにも残りやすいからです。

本番環境では、パスワードやAPIキーなどの機密情報(Secrets)を安全に管理する仕組みが必須です。
この記事では、Docker標準のセキュリティ機能である Docker Secrets について解説します。

Docker Secrets とは?

Docker Swarm(Dockerのオーケストレーション機能)に統合された機密情報管理システムです。

  • 暗号化保存: マネージャーノードのRaftログ内で暗号化されて保存されます。
  • 必要な時だけ復号: サービスを実行するノードにだけ送られ、/run/secrets/ というメモリ上のファイルシステム(tmpfs)にファイルとしてマウントされます。
  • ディスクに残らない: コンテナを停止すれば消えます。

コンテナ内のアプリからは、普通のファイルを読み込むのと同じ感覚で /run/secrets/db_password を読めばパスワードが手に入ります。

実践:Docker Secretsの使い方(Swarmモード)

Secrets機能は本来、Swarmモード(docker swarm initした状態)で真価を発揮します。

1. Secretの作成

# 標準入力から作成
echo "supersecretpassword" | docker secret create my_db_pass -

# ファイルから作成
docker secret create my_api_key ./api_key.txt

2. サービスでの利用

MySQLサービスを作るときに、このSecretを渡します。

docker service create \
  --name mysql \
  --secret my_db_pass \
  -e MYSQL_ROOT_PASSWORD_FILE=/run/secrets/my_db_pass \
  mysql:8.0

ここで注目すべきは環境変数 MYSQL_ROOT_PASSWORD_FILE です。
多くの公式イメージ(MySQL, Postgres, WordPressなど)は、_FILE というサフィックスのついた環境変数をサポートしており、そこにパスワードファイルのパスを指定できます。
これにより、環境変数に生パスワードを書くことなく認証情報を渡せます。

Docker Composeでの擬似Secrets(非Swarm環境)

「Swarmなんて使ってない、ただの docker-compose だよ」という方も多いでしょう。
安心してください。ComposeでもSecrets”風”の使い方ができます。暗号化などの高度な機能はありませんが、「パスワードを環境変数から隠蔽する」という目的は達せられます。

ファイル構成

.
├── docker-compose.yml
└── secrets/
    └── db_password.txt  (中身: supersecretpassword)

secrets/ フォルダは必ず .gitignore に入れてください!

docker-compose.yml

version: '3.8'

services:
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db_root_password
    secrets:
      - db_root_password

secrets:
  db_root_password:
    file: ./secrets/db_password.txt

これで docker-compose up すると、コンテナ内の /run/secrets/db_root_password にホスト側の db_password.txt の中身がマウントされます。アプリケーション側は、SwarmかComposeかを気にせず「/run/secrets/ を読む」という実装で統一できます。

他のツールとの比較

ツール特徴適したケース
Docker SecretsDocker標準。シンプル。Swarmで暗号化。Docker環境のみで完結したい場合。
Kubernetes Secretsk8s標準。Base64エンコード(暗号化ではない点に注意)。Kubernetes環境の場合。
HashiCorp Vault超高機能。動的シークレット、期限付きトークンなど。大規模、マルチクラウド、最高レベルのセキュリティが必要な場合。
AWS SSM / Secrets ManagerAWS統合。ECS/EKS使うならこれ。AWS環境の場合。

まとめ

セキュリティ事故は「まあいいか」から生まれます。

  1. 脱・環境変数:パスワードを -e で渡すのはやめる。
  2. ファイル渡し(Docker Secrets) への移行:/run/secrets/ を読む実装に変える。
  3. 公式イメージの _FILE 対応 を活用する。

この3ステップで、あなたのコンテナ環境は格段に堅牢になります。

Docker Secrets導入フロー

SwarmモードまたはComposeでの安全なパスワード管理

⏱️ Estimated time: 15 min

  1. 1

    Step1: ステップ1:シークレットファイルの準備

    パスワードやAPIキーを記述したテキストファイルを作成します。このファイルは.gitignoreに追加し、リポジトリにはコミットしないようにします。
  2. 2

    Step2: ステップ2:Compose定義の修正

    docker-compose.ymlのトップレベルに secrets: 定義を追加し、各サービスで secrets: リストを使って読み込みます。
  3. 3

    Step3: ステップ3:環境変数の変更

    MYSQL_ROOT_PASSWORD の代わりに MYSQL_ROOT_PASSWORD_FILE を使い、値として /run/secrets/シークレット名 を指定します。
  4. 4

    Step4: ステップ4:アプリ側の対応

    自作アプリの場合、環境変数から値を読むのではなく、指定されたパスのファイルを読み込んで値をトリミングして使うロジックに変更します。

FAQ

環境変数(ENV)はなぜ危険なのですか?
`docker inspect` コマンドで誰でも閲覧できるほか、コンテナのログやエラーレポートシステムに環境変数一覧が含まれてしまい、意図せず漏洩するリスクが高いためです。
Docker SecretsとKubernetes Secretsの違いは?
Docker Secrets(Swarm時)はRaftログ内で暗号化され、転送中も暗号化されます。Kubernetes Secretsはデフォルトでは単なるBase64エンコードであり、Etcdの暗号化設定を有効にしない限り、平文と同等の強度しかありません。
_FILE で指定できる環境変数はどのイメージでも使えますか?
いいえ、イメージの開発者が実装している必要があります。MySQL、PostgreSQL、WordPressなどの有名公式イメージは対応していますが、それ以外を使う場合はドキュメントを確認するか、エントリポイントスクリプトを確認する必要があります。

2 min read · 公開日: 2025年12月18日 · 更新日: 2026年1月22日

コメント

GitHubアカウントでログインしてコメントできます

関連記事