Dock Stay
ネットワークを管理する - docker network の使い方・オプション・サンプル

ネットワークを管理する - docker network

コンテナのネットワーク管理。bridge / host / none / user-defined の 4 種類を理解し、user-defined bridge でコンテナ名による名前解決を使うのが基本。

概念図

docker network diagram

構文

bash
docker network COMMAND
# COMMAND: create, ls, inspect, connect, disconnect, rm, prune

実例

user-defined bridge ネットワークを作成

bash
docker network create app-net

作成したネットワークにコンテナを接続して起動

bash
docker run -d --name db --network app-net postgres:16

接続コンテナと IP を詳細表示

bash
docker network inspect app-net

ネットワークドライバの種類

Docker には標準で 4 つのネットワークドライバがある。

bridge はデフォルトで、ホスト内で隔離された仮想ネットワークを作る。

host はコンテナがホストのネットワークスタックを共有し、ポートマッピングを省略できる代わりに隔離が失われる。

none はネットワーク未接続で、バッチジョブなど外部通信不要な用途向け。

4 つ目の user-defined bridgedocker network create で作るカスタム bridge。

デフォルト bridge との決定的な違いは、コンテナ同士をコンテナ名で名前解決できる点。

--link オプション(非推奨)を使わなくても、http://db:5432 のようなアクセスが成立する。

Compose もこの仕組みを内部で使っている。

bash
docker network ls
docker network create app-net
docker network inspect app-net

コンテナ間通信(user-defined bridge)

同じ user-defined bridge にいるコンテナは、相手のコンテナ名を DNS 名として使える。

たとえば app-netdb(Postgres)と api(アプリ)を接続すれば、api から postgres://db:5432/mydb で接続できる。

IP は起動ごとに変わるので、名前解決に頼るのが正解。

コンテナ内の /etc/resolv.conf は Docker 組み込みの DNS サーバ(127.0.0.11)を指しており、そこが同一ネットワーク内のコンテナ名を解決する。

外部ドメインは通常どおり上流 DNS に問い合わせる。

--network-alias で別名を付けたり、1 つのコンテナを複数のネットワークに同時接続(docker network connect)してゲートウェイ役にもできる。

bash
docker network create app-net
docker run -d --name db --network app-net -e POSTGRES_PASSWORD=x postgres:16
docker run -d --name api --network app-net -e DB_URL=postgres://postgres:x@db:5432/postgres my-api

host ネットワークの注意点

--network host を指定するとコンテナがホストの NIC を直接使う。

-p によるポート転送が不要で、パフォーマンスも最大になる。

高スループットなネットワーク処理や、ローカルブロードキャスト / マルチキャストが必要な用途(mDNS、Prometheus node-exporter など)で使う。

一方で、コンテナのポートがホストに直接晒されるので、同じポートを使う複数コンテナを共存できない、ホストの他サービスと衝突する、セキュリティ境界がなくなる、といった代償がある。

Docker Desktop(Mac / Windows)では host モードは Linux VM 内の挙動であり、macOS / Windows ホストから 127.0.0.1 では見えない。

クロスプラットフォーム開発では罠になりやすい。

関連トピック