Dockerのネットワークとはコンテナ間通信とポート公開の基本
Dockerのネットワークとは、コンテナ同士や外部と通信するための仕組みです。ブリッジ・ホストなどの種類、ユーザー定義ネットワークでの名前解決、ポート公開の考え方と、設定ミスを防ぐ注意点を整理します。
公的機関・公式資料などの一次情報と照合して作成しています。このサイトについて
Dockerのネットワークとは
Docker のコンテナは、既定でネットワークが有効です。Docker の公式ドキュメントによれば、コンテナには、IP アドレスつきのネットワークインターフェース、ゲートウェイ、ルーティングの表、DNS のサービスなどが用意されます。そのため、コンテナ同士で通信したり、外部のインターネットに接続したりできます。
複数のコンテナを組み合わせて動かすとき(たとえば、Webアプリとデータベース)は、この通信の仕組みの理解が欠かせません。つながらない原因の多くは、ネットワークの設定の誤解にあります。
基本(種類と動き)
公式ドキュメントでは、Linux 上で、次のような主な種類(ドライバー)が説明されています。
| 種類 | 内容 |
|---|---|
| bridge | 既定のネットワーク。ホストと隔離された、独立のネットワークをつくる |
| host | コンテナとホストの間の隔離を取り除き、ホストのネットワークをそのまま使う |
| none | ネットワークを完全に切り離す |
| overlay | 複数の Docker のホストをまたいで、つなぐ |
| ipvlan | 外部の VLAN に接続する |
| macvlan | コンテナを、ネットワーク上の独立した機器のように見せる |
Docker が起動すると、既定の bridge ネットワークが作られ、コンテナは、指定しなければ、そこに接続されます。外部のインターネットへは、特別な設定なしで、接続できると説明されています。
ポートの公開については、既定では、コンテナのポートは、ホストの外からアクセスできません。外から届くようにするには、-p のオプションでポートを公開します。たとえば、-p 8080:80 は、ホストの8080番を、コンテナの80番につなぐ指定です。
ユーザー定義のネットワークを作ると、コンテナ同士を、IP アドレスではなく、名前で呼べるようになります。docker network create で作り、コンテナを接続します。公式ドキュメントによれば、ユーザー定義のネットワーク上のコンテナは、Docker の内蔵の DNS で、名前から相手を見つけられます。
Dockerのネットワークの具体例
Web アプリ(web)とデータベース(db)をつなぐ場合です。
| 方法 | 結果 |
|---|---|
| 既定の bridge に両方を接続 | IP アドレスでの通信になり、再起動で変わる場合があり、扱いにくい |
| ユーザー定義のネットワークを作って両方を接続 | web から、db という名前で接続できる |
ポートを公開する対象の考え方も重要です。
| コンテナ | ポートの公開 | 理由 |
|---|---|---|
| Web アプリ | 公開する(-p) | 利用者がブラウザから接続する |
| データベース | 公開しない | 外部から直接アクセスさせない。同じネットワークの web からだけ使う |
データベースのポートを不用意に公開すると、外部から接続を試される危険が増えます。コンテナ間の通信だけで足りるものは、ポートを公開しないのが基本です。
Docker Compose を使うと、同じ設定ファイルに書いたサービスは、自動で同じネットワークに入り、サービス名で互いを呼べます。個別にネットワークを作る手間を減らせます。
Dockerのネットワークの実践ステップ
- どのコンテナが、誰(外部、他のコンテナ)と通信するかを書き出す。
- 外部から接続させるコンテナだけ、ポートを公開する。
- 通信させたいコンテナ同士は、同じユーザー定義のネットワークに接続する。
- 接続先は、IP アドレスではなく、名前で指定する。
- つながらないときは、ネットワークの接続状況と、ポートの指定を確認する。
- 複数のコンテナなら、Compose の利用を検討する。
Dockerのネットワークの注意点
- ポートを公開すると、ホストの外から届く可能性があります。必要なものだけを公開します。
- host ネットワークは、隔離を取り除くため、安全面の影響を理解して使います。
- 既定の bridge では、名前での通信が使えない場合があります。ユーザー定義のネットワークを使います。
- ホストのOSや、Docker Desktop の環境によって、挙動が異なる場合があります。公式ドキュメントで、使っている環境の説明を確認してください。
- ネットワークの仕様は更新されます。最新の公式ドキュメントを確認します。
Dockerのネットワークでよくあるミス
- -p の左右(ホストとコンテナ)を取り違える。
- コンテナの中から、localhost で別のコンテナに接続しようとする。
- データベースのポートを、外部に公開してしまう。
- 既定の bridge で名前の接続を試して、つながらない。
Dockerのネットワークのチェックリスト
- 通信の関係を、書き出したか。
- 外部に公開するポートは、必要最小限か。
- コンテナ同士は、同じユーザー定義のネットワークにいるか。
- 接続先を、名前で指定しているか。
- 使っている環境での挙動を、公式で確認したか。
DockerのネットワークのFAQ(よくある質問)
Q. コンテナの中から localhost と書くと、どこにつながりますか。
A. そのコンテナ自身です。別のコンテナに接続するには、同じネットワークの、相手のコンテナの名前を指定します。
Q. ポートを公開しなくても、コンテナ同士は通信できますか。
A. 同じネットワークにいれば、通信できます。公開が必要なのは、ホストの外から接続させたい場合です。
Q. ネットワークの種類は、どれを使えばよいですか。
A. 多くの場合は、bridge(ユーザー定義)で足ります。他の種類は、特別な要件があるときに検討します。
筆者の見解(Dockerのネットワーク)
Docker のネットワークで、最初に身につけるべきは、公開するポートを最小限にするという習慣だと考えます。コンテナを動かすことに気を取られると、とりあえず公開して動かす、という運用に流れ、気づかないうちに、データベースが外部に開いてしまう事故につながるためです。私見では、通信の関係を一度、簡単な図に書き出してから、公開するポートを決めると、設定の誤りがかなり減ります。
Dockerのネットワークの関連項目
出典(一次情報)
本記事は一般的な情報の提供を目的としています。SaaS・ツールの機能・料金・無料枠・仕様は頻繁に更新されるため、最新の内容は各社の公式ページでご確認ください。契約・法務・セキュリティに関する判断は、専門家や社内の担当部門にご相談ください。「筆者の見解」は一つの考え方です。