DevToolBox無料
ブログ

Docker ネットワークガイド:Bridge、Host、Overlay ネットワーク解説

14分by DevToolBox

Docker ネットワークはコンテナ化アプリケーションアーキテクチャの最も重要な側面の一つです。コンテナ間、ホストシステム、外部ネットワークとの通信方法を理解することが不可欠です。

Docker ネットワーク概要

Docker はコンテナに分離されたネットワーク環境を作成します。

# List all Docker networks
$ docker network ls

NETWORK ID     NAME      DRIVER    SCOPE
a1b2c3d4e5f6   bridge    bridge    local
f6e5d4c3b2a1   host      host      local
1a2b3c4d5e6f   none      null      local

Docker ネットワークタイプ

Bridge ネットワーク(デフォルト)

Bridge ネットワークはコンテナのデフォルトネットワークドライバーです。

# Create a user-defined bridge network
$ docker network create my-app-network

# Run containers on the custom network
$ docker run -d --name web --network my-app-network nginx:alpine
$ docker run -d --name api --network my-app-network node:20-alpine

# Containers can now reach each other by name
$ docker exec web ping api
PING api (172.18.0.3): 56 data bytes
64 bytes from 172.18.0.3: seq=0 ttl=64 time=0.089 ms

# User-defined bridge vs default bridge
# Default bridge: containers communicate only via IP addresses
# User-defined bridge: automatic DNS resolution by container name

# Create bridge with custom subnet
$ docker network create \
  --driver bridge \
  --subnet 172.20.0.0/16 \
  --gateway 172.20.0.1 \
  custom-bridge

Host ネットワーク

Host ネットワークモードはコンテナとホスト間のネットワーク分離を解除します。

# Run container with host networking
$ docker run -d --network host nginx:alpine

# No port mapping needed — container uses host ports directly
# The nginx server is accessible at localhost:80

# Check: container shares host's network interfaces
$ docker exec <container-id> ip addr
# Shows the same interfaces as the host machine

# Warning: Only one container can bind to a given host port
# Host networking is only supported on Linux (not macOS/Windows)

Overlay ネットワーク

Overlay ネットワークは複数の Docker デーモンを接続します。

# Initialize Docker Swarm (required for overlay networks)
$ docker swarm init

# Create an overlay network
$ docker network create \
  --driver overlay \
  --attachable \
  my-overlay-network

# Create a service on the overlay network
$ docker service create \
  --name web \
  --network my-overlay-network \
  --replicas 3 \
  nginx:alpine

# Create encrypted overlay network for sensitive data
$ docker network create \
  --driver overlay \
  --opt encrypted \
  secure-overlay

Macvlan ネットワーク

Macvlan はコンテナに MAC アドレスを割り当てます。

# Create a Macvlan network
$ docker network create \
  --driver macvlan \
  --subnet 192.168.1.0/24 \
  --gateway 192.168.1.1 \
  -o parent=eth0 \
  my-macvlan

# Run container with its own IP on the LAN
$ docker run -d \
  --network my-macvlan \
  --ip 192.168.1.100 \
  --name legacy-app \
  my-app:latest

# The container appears as 192.168.1.100 on the physical network

None ネットワーク

None ネットワークはすべてのネットワークを無効にします。

# Run container with no networking
$ docker run -d --network none alpine sleep 3600

# Only loopback interface is available
$ docker exec <container-id> ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536
    inet 127.0.0.1/8 scope host lo

Docker Compose ネットワーク

Docker Compose はデフォルトでアプリに単一ネットワークを設定します。

# docker-compose.yml — Default networking
# All services share a network named <project>_default
services:
  web:
    image: nginx:alpine
    ports:
      - "80:80"
  api:
    image: node:20-alpine
    # Can reach web service at http://web:80
    # Can reach db service at postgres://db:5432
  db:
    image: postgres:16
    environment:
      POSTGRES_PASSWORD: secret

Compose でのカスタムネットワーク

# docker-compose.yml — Custom networks for isolation
services:
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
      - "443:443"
    networks:
      - frontend

  api:
    build: ./api
    networks:
      - frontend
      - backend
    depends_on:
      - db
      - redis

  db:
    image: postgres:16
    volumes:
      - pg-data:/var/lib/postgresql/data
    networks:
      - backend

  redis:
    image: redis:7-alpine
    networks:
      - backend

  admin:
    image: adminer
    ports:
      - "8080:8080"
    networks:
      - backend

networks:
  frontend:
    driver: bridge
  backend:
    driver: bridge
    internal: true  # No external access

volumes:
  pg-data:

ネットワーク分離パターン

複数のネットワークでサービスを分離できます。

# Three-tier architecture with network isolation
#
#  Internet
#     |
#  [nginx]     <-- frontend network
#     |
#   [api]      <-- frontend + backend network
#     |
#   [db]       <-- backend network (internal)
#
# nginx can reach api, but NOT db
# api can reach both nginx and db
# db is completely isolated from external access

DNS とサービスディスカバリ

Docker はユーザー定義ネットワークに組み込み DNS 解決を提供します。

DNS 解決ルール

# DNS resolution in user-defined networks
# 1. Container name → IP address
$ docker exec web nslookup api
Server:    127.0.0.11
Address:   127.0.0.11#53
Name:      api
Address:   172.18.0.3

# 2. Service name in Compose → all container IPs (round-robin)
$ docker exec web nslookup api
# Returns IPs of all 'api' service replicas

# 3. Network aliases
$ docker run -d \
  --network my-network \
  --network-alias database \
  --network-alias db \
  --name postgres-primary \
  postgres:16

# Container is reachable as: postgres-primary, database, or db

# 4. Check DNS configuration inside a container
$ docker exec web cat /etc/resolv.conf
nameserver 127.0.0.11
options ndots:0

ネットワーク間のコンテナ接続

実行中のコンテナを複数のネットワークに接続できます。

# Connect a running container to an additional network
$ docker network connect backend api-container

# Connect with a specific IP address
$ docker network connect --ip 172.20.0.10 backend api-container

# Disconnect from a network
$ docker network disconnect frontend api-container

# A container connected to multiple networks can route between them
# This is useful for "gateway" containers

ネットワーク検査

Docker はネットワーク設定を検査するコマンドを提供します。

# List all networks
$ docker network ls

# Inspect a network (shows connected containers, config)
$ docker network inspect my-app-network

# Find which networks a container is connected to
$ docker inspect --format='{{json .NetworkSettings.Networks}}' my-container

# Check container IP address
$ docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' my-container

# Check port mappings
$ docker port my-container

# Test connectivity between containers
$ docker exec web ping -c 3 api
$ docker exec web wget -qO- http://api:3000/health

# Debug with a temporary network tools container
$ docker run --rm -it --network my-app-network \
  nicolaka/netshoot bash

Docker ネットワークのトラブルシューティング

コンテナ間の通信不可

同じネットワーク上にあるか確認してください。

# Check if containers are on the same network
$ docker network inspect bridge --format='{{range .Containers}}{{.Name}} {{end}}'

# Solution: Use a user-defined network
$ docker network create app-net
$ docker run -d --name web --network app-net nginx
$ docker run -d --name api --network app-net node:20-alpine

# Now name resolution works
$ docker exec web ping api  # Works!

ポート競合

競合するポートを確認してください。

# Error: port is already allocated
# Find what is using the port
$ lsof -i :8080
$ ss -tlnp | grep 8080

# Solution 1: Map to a different host port
$ docker run -d -p 8081:80 nginx

# Solution 2: Stop the conflicting service
$ sudo systemctl stop apache2

DNS 解決の失敗

カスタム DNS サーバーを指定できます。

# Specify custom DNS servers
$ docker run -d --dns 8.8.8.8 --dns 8.8.4.4 my-app

# Or in docker-compose.yml
services:
  web:
    image: nginx
    dns:
      - 8.8.8.8
      - 8.8.4.4

ネットワークパフォーマンスの問題

パフォーマンス重視のサービスには host ネットワークを検討してください。

# Check MTU settings
$ docker network inspect bridge | grep -i mtu

# Set custom MTU for a network
$ docker network create --opt com.docker.network.driver.mtu=1400 my-network

# Use host networking for maximum performance
$ docker run --network host my-performance-app

ネットワークセキュリティのベストプラクティス

以下のベストプラクティスに従ってください:

  • ユーザー定義 bridge ネットワークを使用。
  • 内部ネットワークで外部アクセスを制限。
  • 必要なポートのみ公開。
  • 暗号化 overlay ネットワークを使用。
  • ネットワークポリシーでトラフィックを制御。
  • 定期的にネットワーク設定を監査。
# Bind to localhost only (not accessible from outside)
$ docker run -d -p 127.0.0.1:5432:5432 postgres:16

# Create internal network (no outbound internet)
$ docker network create --internal isolated-net

# In docker-compose.yml
networks:
  database:
    internal: true  # Containers cannot reach the internet

高度なネットワークトピック

カスタム IPAM 設定

カスタム IP アドレス管理を設定できます。

# Custom IPAM configuration
$ docker network create \
  --driver bridge \
  --subnet 10.10.0.0/16 \
  --ip-range 10.10.1.0/24 \
  --gateway 10.10.0.1 \
  --aux-address "dns=10.10.0.2" \
  custom-ipam-net

# In docker-compose.yml
networks:
  app-net:
    driver: bridge
    ipam:
      config:
        - subnet: 172.28.0.0/16
          ip_range: 172.28.5.0/24
          gateway: 172.28.0.1

IPv6 サポート

Docker は IPv6 をサポートしています。

# Enable IPv6 in Docker daemon (/etc/docker/daemon.json)
{
  "ipv6": true,
  "fixed-cidr-v6": "2001:db8:1::/64"
}

# Create a dual-stack network
$ docker network create \
  --ipv6 \
  --subnet 172.20.0.0/16 \
  --subnet 2001:db8:2::/64 \
  dual-stack-net

組み込みロードバランシング

Docker Swarm はサービスに組み込みロードバランシングを提供します。

# Docker Swarm built-in load balancing
$ docker service create \
  --name web \
  --replicas 5 \
  --publish published=80,target=80 \
  --network my-overlay \
  nginx:alpine

# Requests to port 80 on ANY swarm node
# are load-balanced across all 5 replicas
# using ingress routing mesh

# Scale the service
$ docker service scale web=10

ネットワークドライバー比較

ドライバー使用例分離パフォーマンスマルチホスト
BridgeSingle-host containersHighGoodNo
HostPerformance-critical appsNoneBestNo
OverlayMulti-host / SwarmHighGoodYes
MacvlanLegacy / physical networkHighGoodNo
NoneMaximum isolationCompleteN/ANo

結論

Docker ネットワークはコンテナを扱う開発者にとって基本スキルです。これらの概念をマスターすれば、堅牢でスケーラブルなコンテナ化アプリケーションを構築できます。

FAQ

Docker の bridge と host ネットワークの違いは?

Bridge は分離されたネットワーク名前空間を作成し、ポートマッピングを提供します。Host はホストネットワークスタックを直接共有します。

overlay ネットワークはいつ使うべき?

異なる Docker ホスト上のコンテナが通信する必要がある場合に使用します。

異なるネットワーク上のコンテナは通信できる?

デフォルトではできません。docker network connect で複数ネットワークに接続できます。

Docker DNS 解決のトラブルシューティング方法は?

ユーザー定義ネットワーク上にあることを確認し、コンテナ内で nslookup を実行してください。

𝕏 Twitterin LinkedIn
この記事は役に立ちましたか?

最新情報を受け取る

毎週の開発ヒントと新ツール情報。

スパムなし。いつでも解除可能。

Try These Related Tools

{ }JSON Formatter

Related Articles

Docker Composeチュートリアル:基本から本番対応スタックまで

Docker Compose完全チュートリアル:docker-compose.yml構文、サービス、ネットワーク、ボリューム、環境変数、ヘルスチェック、Node.js/Python/WordPressの実例。

Dockerベストプラクティス:本番コンテナのための20のヒント

Docker必須のベストプラクティス20選:マルチステージビルド、セキュリティ強化、イメージ最適化、CI/CD自動化。

Docker vs Kubernetes

DockerとKubernetesの比較ガイド。