個人的備忘録：Dockerネットワークとは？基本概念と主要モードを自分なりに体系的にまとめてみた

## はじめに
Dockerはコンテナの管理だけでなく、コンテナ間の通信や外部ネットワークとの接続も制御できます。

:::note info
**本記事では、Dockerのネットワークの基本と主要なモードを解説します。**
:::

適切なネットワーク設定を行うことで、セキュリティやパフォーマンスを最適化できます。

## 書こうと思ったきっかけ
Dockerを使うと「**コンテナ同士が通信できない**」「**ホストとの接続方法がわからない**」といった問題に直面しがちです。

:::note warn
***特にクラウド環境では、ネットワーク設定ミスが原因で動かないことも。***
:::

本記事では、これらの課題を解決するために、Dockerネットワークの基本をわかりやすくまとめました。

## Dockerコンテナのネットワークについて

Dockerコンテナ内のネットワークは、コンテナ同士の通信やホストとの接続を管理する重要な仕組みです。以下に、基本的な概念と主要なネットワークモードを説明します。

### 1. Dockerのネットワークの基本
Dockerでは、コンテナ同士の通信やホストとの接続を管理するために、以下のようなネットワークモードが提供されています。

- **ブリッジ（Bridge）**
- **ホスト（Host）**
- **オーバーレイ（Overlay）**
- **マックブラン（Macvlan）**
- **コンテナ間（Container）**

### 2. Dockerの主要なネットワークモード

**① Bridge（ブリッジ）ネットワーク**
- **デフォルトのネットワークモード**で、スタンドアロンのコンテナに適している。
- Dockerが自動的に`docker0`という仮想ブリッジを作成し、コンテナがそこに接続する。
- **コンテナ間通信**は、ブリッジ内のコンテナ同士で可能。
- **外部からのアクセス**は`-p`オプションでポートをマッピングすることで実現。

**例:**
```bash
docker network create my_bridge
docker run -d --name container1 --network my_bridge nginx
docker run -d --name container2 --network my_bridge alpine sleep 1000
```

**② Host（ホスト）ネットワーク**
- **コンテナがホストと同じネットワークを共有**する。
- `-p`オプションを使わなくても、コンテナが直接ホストのポートを使用可能。
- ただし、**他のコンテナとの分離がないためセキュリティ面では注意が必要**。

**例:**
```bash
docker run --rm --network host nginx
```
→ Nginxがホストのネットワークで直接起動する。

**③ Overlay（オーバーレイ）ネットワーク**
- **Docker SwarmやKubernetesなどのクラスタ環境**で使用される。
- 複数のDockerホスト間で**コンテナ同士が通信できる**ように仮想ネットワークを作成する。
- **分散アーキテクチャ**に適している。

**例:**
```bash
docker network create -d overlay my_overlay
```

**④ Macvlan（マックブラン）ネットワーク**
- **コンテナに直接物理ネットワークのIPアドレスを割り当てる**。
- コンテナがホストとは別の独立したデバイスのように振る舞う。
- **LAN内の他のデバイスからもアクセス可能**。

**例:**
```bash
docker network create -d macvlan \
  --subnet=192.168.1.0/24 \
  --gateway=192.168.1.1 \
  -o parent=eth0 my_macvlan
```

**⑤ Container（コンテナ間）ネットワーク**
- **別のコンテナのネットワークスタックを共有**するモード。
- `--network container:<コンテナ名>` を指定すると、そのコンテナのネットワークに直接接続できる。

**例:**
```bash
docker run -d --name main_container nginx
docker run -d --network container:main_container alpine sleep 1000
```

### 3. コンテナ間通信の方法

**① 同じブリッジネットワーク内での通信**
`docker network create my_bridge` で独自のネットワークを作成し、そのネットワーク内のコンテナは**コンテナ名で通信可能**。

**例:**
```bash
docker network create my_bridge
docker run -d --name web --network my_bridge nginx
docker run -it --network my_bridge alpine sh
```
その後、Alpineコンテナ内で `curl web` を実行すると、Nginxのレスポンスが得られる。

**② Docker Composeを使ったネットワーク**
Docker Composeを使うと、コンテナを**自動的に同じネットワーク内**に配置できる。

**docker-compose.yml:**
```yaml
version: '3'
services:
  web:
    image: nginx
    networks:
      - my_network
  app:
    image: alpine
    command: sleep 1000
    networks:
      - my_network
networks:
  my_network:
```

**起動方法:**
```bash
docker-compose up -d
```
→ `web` から `app` に `ping app` で通信可能。

## Dockerネットワークの管理コマンドまとめ
| コマンド | 説明 |
|----------|------|
| `docker network ls` | 既存のネットワークを表示 |
| `docker network inspect <ネットワーク名>` | ネットワークの詳細を確認 |
| `docker network create <ネットワーク名>` | 新しいネットワークを作成 |
| `docker network rm <ネットワーク名>` | ネットワークを削除 |

## まとめ
- **Bridge:** デフォルトのネットワーク、コンテナ間通信に適している。
- **Host:** ホストと同じネットワークを使用し、ポート設定不要。
- **Overlay:** Swarm/Kubernetesで使われ、ホスト間通信が可能。
- **Macvlan:** コンテナに直接IPを割り当て、LAN内の他デバイスとも通信可能。
- **Container:** 別のコンテナのネットワークを共有。

Dockerのネットワークは、用途に応じて適切なものを選ぶことが重要です！