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.txt2. サービスでの利用
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 Secrets | Docker標準。シンプル。Swarmで暗号化。 | Docker環境のみで完結したい場合。 |
| Kubernetes Secrets | k8s標準。Base64エンコード(暗号化ではない点に注意)。 | Kubernetes環境の場合。 |
| HashiCorp Vault | 超高機能。動的シークレット、期限付きトークンなど。 | 大規模、マルチクラウド、最高レベルのセキュリティが必要な場合。 |
| AWS SSM / Secrets Manager | AWS統合。ECS/EKS使うならこれ。 | AWS環境の場合。 |
まとめ
セキュリティ事故は「まあいいか」から生まれます。
- 脱・環境変数:パスワードを
-eで渡すのはやめる。 - ファイル渡し(Docker Secrets) への移行:
/run/secrets/を読む実装に変える。 - 公式イメージの
_FILE対応 を活用する。
この3ステップで、あなたのコンテナ環境は格段に堅牢になります。
Docker Secrets導入フロー
SwarmモードまたはComposeでの安全なパスワード管理
⏱️ Estimated time: 15 min
- 1
Step1: ステップ1:シークレットファイルの準備
パスワードやAPIキーを記述したテキストファイルを作成します。このファイルは.gitignoreに追加し、リポジトリにはコミットしないようにします。 - 2
Step2: ステップ2:Compose定義の修正
docker-compose.ymlのトップレベルに secrets: 定義を追加し、各サービスで secrets: リストを使って読み込みます。 - 3
Step3: ステップ3:環境変数の変更
MYSQL_ROOT_PASSWORD の代わりに MYSQL_ROOT_PASSWORD_FILE を使い、値として /run/secrets/シークレット名 を指定します。 - 4
Step4: ステップ4:アプリ側の対応
自作アプリの場合、環境変数から値を読むのではなく、指定されたパスのファイルを読み込んで値をトリミングして使うロジックに変更します。
FAQ
環境変数(ENV)はなぜ危険なのですか?
Docker SecretsとKubernetes Secretsの違いは?
_FILE で指定できる環境変数はどのイメージでも使えますか?
2 min read · 公開日: 2025年12月18日 · 更新日: 2026年1月22日
関連記事
Next.js ファイルアップロード完全ガイド:S3/Qiniu Cloud 署名付き URL 直接アップロード実践

Next.js ファイルアップロード完全ガイド:S3/Qiniu Cloud 署名付き URL 直接アップロード実践
Next.js Eコマース実践:カートと Stripe 決済の完全実装ガイド

Next.js Eコマース実践:カートと Stripe 決済の完全実装ガイド
Next.js ユニットテスト実践:Jest + React Testing Library 完全設定ガイド


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