docker network コマンドの使い方完全ガイド:コンテナ間通信・ドライバー・トラブル対処法

コマンドリファレンス実務レシピ

Docker環境で複数のコンテナ(Webサーバー、データベース、キャッシュサーバーなど)を構築する際、「コンテナ同士をどのように通信させるか」「外部からの接続と内部通信をどう分けるか」といったネットワーク設計が非常に重要になります。

Dockerにはコンテナ間の通信分離や接続管理を行うためのdocker networkコマンドが用意されています。本記事では、docker networkの基本操作からネットワークドライバー(bridge, host, noneなど)の違い、コンテナ名による自動名前解決(DNS機能)の仕組み、トラブルシューティングまでを分かりやすく解説します。

1. docker network コマンドの基本と主要操作一覧

docker networkは、Docker環境におけるネットワークの作成、確認、コンテナの接続・切断、削除などを管理する基底コマンドです。

基本構文は以下の通りです。

docker network [サブコマンド] [オプション]

実務で頻繁に使用する主要なサブコマンドを一覧表にまとめました。

コマンド 説明
docker network ls 作成されているネットワークの一覧を表示する
docker network create <ネットワーク名> 新しいネットワークを作成する(規定はbridgeドライバー)
docker network inspect <ネットワーク名> ネットワークのIPアドレス範囲や接続中のコンテナ詳細を表示する(JSON形式)
docker network connect <ネットワーク名> <コンテナ名/ID> 実行中のコンテナを既存のネットワークに接続する
docker network disconnect <ネットワーク名> <コンテナ名/ID> コンテナをネットワークから切断する
docker network rm <ネットワーク名> 指定したネットワークを削除する(使用中コンテナが存在する場合はエラー)
docker network prune どのコンテナからも参照されていない未使用ネットワークを一括削除する

2. Dockerのネットワークドライバーの種類と特徴

Dockerでは用途に合わせて複数のネットワークドライバー(Network Drivers)を選択できます。docker network lsを実行すると、初期状態でも3つの標準ネットワークが確認できます。

$ docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
334a894f8a82   bridge    bridge    local
8c5349fa73a4   host      host      local
fa74dbd741c2   none      null      local

2.1 bridge(ブリッジネットワーク)

単一のホスト(Dockerホスト)上で動作するコンテナ間のデフォルトの通信方式です。ホストOS上に仮想のネットワークブリッジ(docker0など)を作成し、そこに各コンテナが仮想NICを接続する仕組みです。

【重要】デフォルト bridge と ユーザー定義 bridge の違い

Dockerには、最初から用意されている「デフォルトbridge」と、ユーザーがdocker network createで手動作成する「ユーザー定義(カスタム)bridge」の2種類があり、重要な違いがあります。

  • デフォルト bridge (bridge): コンテナ起動時にネットワークを指定しない場合に使われます。IPアドレスでの通信は可能ですが、コンテナ名によるDNS名前解決機能が利用できません
  • ユーザー定義 bridge (docker network create my-net): 組み込みDNSサーバーが有効化され、コンテナ名(例: http://db-server:5432)で相互に名前解決して通信できます。実務開発ではこちらを利用するのがベストプラクティスです。

2.2 host(ホストネットワーク)

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

  • ネットワークオーバーヘッドがなくなるため通信パフォーマンスが最高になります。
  • コンテナ内で起動したポート(例: 8080)が、ホストマシンの8080ポートとして直接公開されます。
  • 注意点として、同じホスト上で同じポートを使うコンテナを複数起動しようとするとポート衝突エラーになります。また、Linuxでのみフル機能がサポートされます。

2.3 none(ネットワーク完全隔離)

コンテナにループバック(127.0.0.1)以外のネットワークインターフェースを与えず、完全な隔離状態にします。

  • 外部や他コンテナとの通信を一切遮断したいバッチ処理やセキュリティ試験用コンテナなどで利用されます。

2.4 overlay / macvlan(高度なネットワーク)

  • overlay: 複数のDockerホスト間に跨がる暗号化ネットワークを構築します。Docker SwarmやKubernetes等のマルチホスト環境で使用されます。
  • macvlan: コンテナに実際の物理ネットワーク上のMACアドレスを割り当て、直接既存の物理LANに参加させるドライバーです。

3. 【実践】docker networkを使ったコンテナ間通信の構築手順

実際にカスタムネットワークを作成し、2つのコンテナ間でコンテナ名を使って名前解決・通信を行う手順を紹介します。

ステップ1: ユーザー定義ネットワークを作成する

docker network createコマンドで、app-netという名前のカスタムbridgeネットワークを作成します。

$ docker network create app-net
e9452d6a7890abcdef1234567890123456789012345678901234567890abcdef

ステップ2: ネットワークを指定してコンテナを起動する

--network app-netオプションを付けて、2つのコンテナ(db-containerweb-container)を起動します。

# データベースコンテナの起動例
$ docker run -d --name db-container --network app-net alpine sleep 3600

# Webアプリケーションコンテナの起動例
$ docker run -d --name web-container --network app-net alpine sleep 3600

ステップ3: コンテナ名で名前解決・通信ができるか確認する

web-containerの内部に入り、pingコマンドを使ってdb-containerへ通信できるか確認します。

$ docker exec -it web-container ping -c 3 db-container
PING db-container (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.082 ms
64 bytes from 172.18.0.2: seq=1 ttl=64 time=0.065 ms
64 bytes from 172.18.0.2: seq=2 ttl=64 time=0.061 ms

--- db-container ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss

IPアドレスではなく「db-container」というコンテナ名だけで正常に通信が成立していることが確認できます。

ステップ4: 既存コンテナのネットワーク接続・切断

すでに起動しているコンテナを途中でネットワークに接続・切断したい場合は、connect / disconnectを使用します。

# 既存コンテナをapp-netに追加接続
$ docker network connect app-net my-existing-container

# app-netから切断
$ docker network disconnect app-net my-existing-container

4. ポートマッピング(-p)と docker network の役割の違い

Docker初心者の方が混同しやすいのが「ポートマッピング(-p 8080:80)」と「docker network」の使い分けです。

項目 ポートマッピング (-p / --publish) docker network (内部ネットワーク)
目的 ホストPC外部やブラウザからコンテナへアクセスする コンテナ同士が内部で安全に高速通信する
通信経路 外部クライアント → ホストポート → コンテナポート コンテナA → (仮想ブリッジ/DNS) → コンテナB
セキュリティ 外部に公開されるため適切な firewall/認証が必要 外部非公開(Dockerホスト内部に閉じた通信)が可能

例えば、データベース(PostgreSQLやMySQL)は外部インターネットにポートを直接晒さず、docker network内でのみWebサーバーコンテナからのアクセスを許可する構成が安全です。

5. Docker Compose でのネットワーク定義方法

docker-compose.ymlを使用する場合、ネットワークの作成とコンテナへの割当は自動的・宣言的に行えます。

version: '3.8'

services:
  web:
    image: nginx:alpine
    ports:
      - "8080:80"
    networks:
      - frontend-net
      - backend-net

  db:
    image: postgres:15-alpine
    environment:
      POSTGRES_PASSWORD: secretpassword
    networks:
      - backend-net

networks:
  frontend-net:
    driver: bridge
  backend-net:
    driver: bridge

上記のように設定すると、webサービスはfrontend-netbackend-netの両方に所属し、dbサービスはbackend-netにのみ所属するため、外部アクセス用Webサーバーと隔離された内部データベースを簡単に構築できます。

6. よくあるトラブルと対処法

6.1 コンテナ同士で名前解決やPingが届かない

【原因】 デフォルトの bridge ネットワークでコンテナを起動していませんか?

【対処法】 デフォルト bridge ではDNS名前解決機能が機能しません。docker network create my-net でカスタムネットワークを作成し、--network my-net を指定してコンテナを再起動するか、docker network connect my-net <container> で追加接続してください。

6.2 ネットワーク削除時エラー: network has active endpoints

【原因】 ネットワーク内にまだ稼働中・停止中のコンテナが接続されています。

【対処法】 docker network inspect <net-name> で接続中のコンテナを確認し、docker network disconnect -f <net-name> <container> またはコンテナ本体を削除(docker rm -f)してからネットワークを削除(docker network rm)します。

6.3 未使用のネットワークが一括削除できない

定期的な開発作業で溜まった不要なネットワークを一括クリーンアップするには、docker network prune コマンドを実行します。

$ docker network prune
WARNING! This will remove all custom networks not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Networks:
test-net-1
test-net-2

7. よくある質問(FAQ)

Q1. デフォルトの bridge ネットワークでコンテナ名指定の通信が失敗するのはなぜですか?

デフォルトの bridge ネットワークは互換性維持のために残されており、自動DNSサーバー機能が無効化されています。コンテナ名での通信を行うには、必ず docker network create でユーザー定義のカスタムネットワークを作成して利用してください。

Q2. コンテナに複数のネットワークを同時に割り当てることは可能ですか?

はい、可能です。docker network connect コマンドを複数回実行するか、Docker Composeの networks: リストに複数ネットワークを指定することで、1つのコンテナに複数のNICを持たせることができます。

Q3. docker network inspect コマンドで確認すべき重要情報は何ですか?

"Subnet"(IPネットワーク範囲)、"Gateway"(ルーターIPアドレス)、および "Containers" 内にリスティングされている接続中コンテナごとの個別の "IPv4Address""MacAddress" です。

8. まとめと関連記事

docker networkコマンドを活用することで、コンテナ間の通信分離や安全な名前解決、マルチコンテナ構成の設計が容易になります。

基本となるポイントを復習しておきましょう。

  • コンテナ同士で通信する場合は docker network create でカスタムネットワークを作成する
  • --network オプションでコンテナを接続すれば、コンテナ名で自動名前解決ができる
  • ホスト外部への公開にはポートマッピング(-p)、内部通信には docker network を使い分ける

関連するおすすめ記事

Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント