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

Dockerコンテナ通信完全ガイド:bridge、hostネットワークとDNS解決の実践

「WebコンテナからDBコンテナに接続できない… IP直打ちは動くのに…」

Dockerを始めたばかりの人が必ずぶつかる壁、それが**コンテナ間の通信(Networking)**です。
localhostが使えないことはわかった。でも、コンテナ名で指定しても繋がらない。なぜ?

答えは簡単です。デフォルトのネットワークを使っているからです。

この記事では、Dockerネットワークの仕組みを解き明かし、コンテナ同士が「名前」で呼び合える正しい設定方法を解説します。古い--linkコマンドはもう忘れましょう。

なぜデフォルトのbridgeネットワークはダメなのか?

Dockerをインストールすると、自動的にbridgeというネットワークが作られます。何も指定せずにコンテナを起動すると、全員ここに入ります。

docker run -d --name my-db mysql
docker run -d --name my-app node-app

しかし、このデフォルトbridgeネットワークには致命的な欠点があります:DNS名前解決機能がありません

つまり、my-appの中からping my-dbとしても、「unknown host」になります。IPアドレス(例:172.17.0.2)なら繋がりますが、IPアドレスはコンテナを再起動するたびに変わる可能性があります。これでは使えません。

正解:カスタムBridgeネットワークを使う

解決策は非常にシンプル。「自分でネットワークを作る」だけです。

ユーザーが作成したカスタムbridgeネットワークには、自動DNS解決機能が備わっています。これを使えば、コンテナ名がそのままホスト名として使えます。

手順1:ネットワークを作成する

docker network create my-net

手順2:コンテナをネットワークに参加させる

# データベース
docker run -d --name db --network my-net mysql

# アプリケーション
docker run -d --name app --network my-net node-app

手順3:名前で通信する

これで、appコンテナの中からdbという名前でデータベースにアクセスできます。

# アプリケーションコンテナ内
ping db
# PING db (172.18.0.2): 56 data bytes
# 64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.04 ms

魔法のようですが、これがDockerの標準的な使い方です。

Docker Composeなら自動でやってくれる

dockerコマンドを直接叩く場合は手動作成が必要ですが、Docker Composeを使うと、このベストプラクティスがデフォルトで適用されます。

version: '3.8'

services:
  web:
    image: nginx
  db:
    image: postgres

docker-compose upを実行すると、Dockerは自動的にプロジェクト名_defaultというネットワークを作成し、全てのサービスをそこに参加させます。

そのため、webコンテナからはdbというホスト名でデータベースにアクセスできます。何も設定しなくても、最初からDNSが効いているのです。これがComposeが推奨される理由の一つです。

その他のネットワークモード

Bridge以外にも、知っておくべきネットワークモードがあります。

Hostネットワーク (--network host)

コンテナのネットワーク隔離を解除し、ホストマシンのネットワークインターフェースを直接共有します。

  • メリット:ポートマッピング不要(-p 8080:80とか要らない)、ネットワークオーバーヘッドがない(最速)。
  • デメリット:ポートの競合が起きやすい。セキュリティ隔離が弱い。
  • 用途:ネットワーク性能がクリティカルな場合や、大量のポートを使う場合。

注意:MacとWindowsのDocker Desktopでは、Hostネットワークモードは期待通りに動作しません(仮想マシン層があるため)。Linux専用と考えてください。

Noneネットワーク (--network none)

ネットワークインターフェースを一切持ちません(localhostのみ)。

  • 用途:セキュリティが最優先される、通信を必要としないバッチ処理コンテナなど。

コンテナ間通信のベストプラクティス

  1. デフォルトbridgeは使わない:必ずdocker network createで作ったカスタムネットワークを使う。
  2. IPアドレスは使わない:IPは揮発性です。常にコンテナ名(ホスト名)を使う。
  3. 古い--link機能は使わない:これはDeprecated(非推奨)機能です。
  4. Docker Composeを使う:ネットワーク管理が自動化され、ミスが減ります。

結論

コンテナ間通信のトラブルは、ほとんどの場合「名前解決ができない」ことが原因です。
そしてその原因は「デフォルトのbridgeネットワークを使っている」ことです。

今日からは、必ずdocker network createを使うか、Docker Composeを使って、快適な「名前で呼び合える」環境を作りましょう。

Dockerカスタムネットワーク構築フロー

コンテナ名での名前解決を実現するためのカスタムネットワーク作成と接続手順

⏱️ Estimated time: 5 min

  1. 1

    Step1: ネットワークを作成する

    コマンド:docker network create <ネットワーク名>
    例:docker network create app-net

    解説:
    • デフォルトのbridgeネットワークではなく、カスタムネットワークを作成します。
    • カスタムネットワークには自動DNS解決機能があります。
  2. 2

    Step2: コンテナ起動時にネットワークを指定する

    コマンド:docker run --network <ネットワーク名> ...
    例:
    docker run -d --name mysql-db --network app-net mysql
    docker run -d --name my-web --network app-net nginx

    解説:
    • 作成したネットワークに参加させます。
    • --nameで付けたコンテナ名が、DNS名(ホスト名)になります。
  3. 3

    Step3: 接続確認

    コマンド:docker exec -it <Webコンテナ名> ping <DBコンテナ名>
    例:docker exec -it my-web ping mysql-db

    解説:
    • コンテナ名でpingが通ることを確認します。
    • アプリケーションの設定ファイルでも、DBホスト名としてコンテナ名(mysql-db)を指定できます。

FAQ

なぜコンテナ名でpingしてもunknown hostになるのですか?
デフォルトのbridgeネットワークを使用しているからです。デフォルトのネットワークではDNS名前解決機能が無効になっています。

解決策:docker network createで新しいネットワークを作るか、Docker Composeを使用してください。
--linkオプションは使ってはいけませんか?
はい、非推奨(Deprecated)です。
かつてはコンテナを接続するための主要な方法でしたが、現在はカスタムネットワーク機能に置き換えられました。将来のバージョンで削除される可能性があるため、使用すべきではありません。
Docker Composeの場合はどうすればいいですか?
何もしなくて大丈夫です。
Docker Composeはデフォルトでプロジェクトごとのカスタムネットワークを自動作成します。サービス名(services:の下に書いた名前)がそのままホスト名として使えます。
特別な設定なしで we-app から db にアクセスできます。
ホストマシンのlocalhostに接続したい場合は?
コンテナ内のlocalhostはコンテナ自身を指すため、ホストには繋がりません。
host.docker.internal という特別なホスト名を使用してください(Mac/Windows)。Linuxの場合は--add-host設定が必要です。詳しくは「Dockerコンテナからホストへのアクセス」の記事を参照してください。

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

コメント

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

関連記事