最終更新
リンドくん
たなべ先生、Dockerでアプリを動かすとき、データベースのパスワードとかってどう管理すればいいんですか?コードに直接書いちゃダメですよね...
たなべ
素晴らしい質問だね!その疑問を持つこと自体が、セキュリティ意識が高い証拠だよ。
実は、Dockerには環境変数やシークレットという仕組みがあって、パスワードやAPIキーといった機密情報を安全に管理できるんだ。今日はその方法をしっかり学んでいこうか。
プログラミングを学び、アプリケーションをDockerで動かし始めると、必ずぶつかる壁があります。
それが「機密情報をどう管理するか」という問題です。
データベースのパスワード、APIキー、各種トークンなど、アプリケーションには様々な機密情報が必要になります。
これらをコードに直接書き込んでしまうと、GitHubなどにうっかり公開してしまったり、チーム内で共有する際にセキュリティリスクが生じたりします。
この記事では、Dockerにおける環境変数とシークレットの管理方法について、初心者の方でも実践できるよう、基礎から丁寧に解説していきます。
HackATAは、エンジニアを目指す方のためのプログラミング学習コーチングサービスです。 経験豊富な現役エンジニアがあなたの学習をサポートします。
✓ 質問し放題
✓ β版公開中(2025年内の特別割引)
リンドくん
そもそも、なぜ環境変数を使う必要があるんですか?普通に設定ファイルに書けばいいんじゃ...
たなべ
それがね、実は大きな問題があるんだ。
例えば、開発環境と本番環境で違うデータベースを使いたい場合、どうする?設定ファイルをいちいち書き換えるの?それって面倒だし、間違いの元だよね。
環境変数を使用することで、以下のような重要なメリットが得られます。
これらの理由から、現代のアプリケーション開発では環境変数の使用が標準的なプラクティスとなっています。
特にDockerを使ったコンテナ環境では、環境変数は必須のスキルと言えるでしょう。
最もシンプルな環境変数の設定方法は、docker run
コマンドに-e
オプションを使うことです。
この方法は手軽ですが、コマンドラインに機密情報が残ってしまうため、本番環境での使用は推奨されません。練習やテスト目的での使用に留めましょう。
DockerfileではENV
命令を使って環境変数を定義できます。
ここで重要なのは、機密情報をDockerfileに書いてはいけないということです。
Dockerfileはイメージに含まれるため、イメージを配布すると機密情報も一緒に配布されてしまいます。
Dockerfileで設定するのは、以下のような公開しても問題ない設定値やデフォルト値のみにしましょう。
より実践的な方法として、.env
ファイルを使った環境変数の管理があります。
まず、プロジェクトのルートディレクトリに.env
ファイルを作成します。
そして、docker run
コマンドで--env-file
オプションを使って読み込みます。
重要な注意点: .env
ファイルには機密情報が含まれるため、必ず.gitignore
に追加して、Gitリポジトリに含めないようにしましょう。
代わりに、.env.example
というサンプルファイルを用意しておくと、チームメンバーが参考にできて便利です。
リンドくん
複数のコンテナを使うときは、どう管理すればいいんですか?
たなべ
そういうときこそDocker Composeの出番だよ!複数のコンテナの環境変数を一元管理できて、とても便利なんだ。
Docker Composeを使うと、複数のコンテナの環境変数を効率的に管理できます。
この例では、以下の3つの方法で環境変数を設定しています。
NODE_ENV=production
のように値を直接書く.env
ファイルから環境変数を読み込む${DB_NAME}
のように.envファイルの変数を参照する開発環境と本番環境で設定を切り替えたい場合、複数の.env
ファイルを用意します。
そして、docker-compose.yml
で環境に応じたファイルを指定します。
起動時に環境を指定できます。
リンドくん
環境変数だと、まだ少し不安な気がします...もっと安全な方法はないんですか?
たなべ
セキュリティ意識が高いね!
本番環境ではさらに安全なDocker Secretsという仕組みがあるんだ。
Docker Secretsは、Docker Swarmモードで使用できる、機密情報を安全に管理するための仕組みです。以下のような特徴があります。
まず、シークレットを作成します。
次に、docker-compose.yml
でシークレットを使用します。
アプリケーション側では、シークレットファイルを読み込むコードを書きます。
この方法により、機密情報がコンテナのログや環境変数一覧に表示されることを防げます。
Docker Secretsは本来Docker Swarmモード用の機能ですが、docker-composeでも簡易的に使用できます。
この場合、./secrets/db_password.txt
ファイルを作成し、パスワードを記述しておきます。このファイルも.gitignore
に追加することを忘れないでください。
機密情報を含むファイルは必ず.gitignore
に追加しましょう。
チームメンバーが参考にできるよう、サンプルファイルを用意しておきましょう。
READMEファイルにセットアップ手順も記載しておくと親切です。
.env.example
をコピーして.env
ファイルを作成.env
ファイルを編集して、実際の値を設定アプリケーション起動時に、必要な環境変数が設定されているか確認するコードを書きましょう。
コンテナに必要最小限の権限のみを与えることで、セキュリティリスクを減らせます。
本番環境では、パスワードやAPIキーを定期的に更新することをおすすめします。自動化できる場合は、CI/CDパイプラインに組み込むのも良いでしょう。
リンドくん
環境変数を設定したのに、アプリで読み込めないことがあるんですが...
たなべ
それ、初心者がよくハマるポイントだね!いくつか確認すべきことがあるから、一緒に見ていこう。
症状: .env
ファイルを変更したのに、コンテナ内で反映されない
解決法
環境変数はコンテナ起動時に読み込まれるため、変更後は必ずコンテナを再起動する必要があります。
症状: パスワードにスペースや特殊文字が含まれていて、正しく読み込めない
解決法
.env
ファイルでは、基本的に引用符は不要です。値にスペースが含まれていても、そのまま書けば正しく読み込まれます。
症状: ${変数名}
の形式で書いたのに、展開されない
解決法
また、展開したい変数が.env
ファイルに存在することを確認しましょう。
症状: webコンテナの環境変数をdbコンテナで使いたいが、うまくいかない
解決法
各コンテナは独立した環境変数を持っています。共有するには、明示的に設定する必要があります。
または、環境変数を外部から両方のコンテナに渡す設計にします。
リンドくん
環境変数とシークレット管理、だいぶ理解できました!でも、結局どれを使えばいいんでしょうか?
たなべ
基本的には.envファイルで環境変数を管理して、特に重要な機密情報はDocker Secretsを使うという使い分けがおすすめだよ。
そして何より、決してコードに機密情報を書かないことが最も大切なんだ。
この記事では、Dockerにおける環境変数とシークレットの管理方法について解説してきました。重要なポイントをおさらいしましょう。
環境変数を使うべき理由
基本的な管理方法
.env
ファイルで環境変数を管理.gitignore
に.env
を追加して、Gitリポジトリから除外.env.example
をサンプルとして用意より安全な管理方法
Dockerでの環境変数管理は、最初は少し複雑に感じるかもしれません。
しかし、これらのプラクティスを身につけることで、セキュアで保守性の高いアプリケーションを構築できるようになります。
特に、チーム開発や本番環境へのデプロイを考えると、適切な環境変数管理は避けて通れないスキルです。今日学んだ内容を、ぜひご自身のプロジェクトで実践してみてください。