ネットワークを管理する - docker network
コンテナのネットワーク管理。bridge / host / none / user-defined の 4 種類を理解し、user-defined bridge でコンテナ名による名前解決を使うのが基本。
概念図
構文
docker network COMMAND
# COMMAND: create, ls, inspect, connect, disconnect, rm, prune実例
user-defined bridge ネットワークを作成
docker network create app-net作成したネットワークにコンテナを接続して起動
docker run -d --name db --network app-net postgres:16接続コンテナと IP を詳細表示
docker network inspect app-netネットワークドライバの種類
Docker には標準で 4 つのネットワークドライバがある。
bridge はデフォルトで、ホスト内で隔離された仮想ネットワークを作る。
host はコンテナがホストのネットワークスタックを共有し、ポートマッピングを省略できる代わりに隔離が失われる。
none はネットワーク未接続で、バッチジョブなど外部通信不要な用途向け。
4 つ目の user-defined bridge は docker network create で作るカスタム bridge。
デフォルト bridge との決定的な違いは、コンテナ同士をコンテナ名で名前解決できる点。
--link オプション(非推奨)を使わなくても、http://db:5432 のようなアクセスが成立する。
Compose もこの仕組みを内部で使っている。
docker network ls
docker network create app-net
docker network inspect app-netコンテナ間通信(user-defined bridge)
同じ user-defined bridge にいるコンテナは、相手のコンテナ名を DNS 名として使える。
たとえば app-net に db(Postgres)と api(アプリ)を接続すれば、api から postgres://db:5432/mydb で接続できる。
IP は起動ごとに変わるので、名前解決に頼るのが正解。
コンテナ内の /etc/resolv.conf は Docker 組み込みの DNS サーバ(127.0.0.11)を指しており、そこが同一ネットワーク内のコンテナ名を解決する。
外部ドメインは通常どおり上流 DNS に問い合わせる。
--network-alias で別名を付けたり、1 つのコンテナを複数のネットワークに同時接続(docker network connect)してゲートウェイ役にもできる。
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-apihost ネットワークの注意点
--network host を指定するとコンテナがホストの NIC を直接使う。
-p によるポート転送が不要で、パフォーマンスも最大になる。
高スループットなネットワーク処理や、ローカルブロードキャスト / マルチキャストが必要な用途(mDNS、Prometheus node-exporter など)で使う。
一方で、コンテナのポートがホストに直接晒されるので、同じポートを使う複数コンテナを共存できない、ホストの他サービスと衝突する、セキュリティ境界がなくなる、といった代償がある。
Docker Desktop(Mac / Windows)では host モードは Linux VM 内の挙動であり、macOS / Windows ホストから 127.0.0.1 では見えない。
クロスプラットフォーム開発では罠になりやすい。
関連トピック
docker run- イメージから新しいコンテナを起動するコマンド。`-d` でバックグラウンド化、`-p` でポート公開、`-v` でボリュームマウント、`--name` で名前付けなど、日常的に使うオプションを押さえておく。 docker volume / bind mount- データ永続化の基本。Docker が管理する volume と、ホスト側の任意パスを使う bind mount の違い、`:ro` / `:z` / `:Z` オプション、パーミッション問題の対処を整理する。 docker ps / docker logs- 実行中コンテナの一覧表示とログ確認のコマンド。`docker ps -a` で停止済みも含めて表示、`docker logs -f` で追跡、`--since` / `--tail` で範囲を絞る。 