個人的備忘録：Dockerのネットワークがつながらない場合に、Docker Composeで簡単に統一する方法

## はじめに

Docker を利用する際、複数のコンテナ間で通信を行うには適切なネットワーク設定が必要です。

:::note info
**ネットワークの設定が不十分だと、コンテナ同士が接続できずエラーが発生することがあります。**
:::

本記事では、Docker Compose を使ってコンテナのネットワークを統一する方法を解説します。***適切な設定を行うことで、よりスムーズなコンテナ間通信を実現できます。***

## 書こうと思った理由
Docker を使う中で、コンテナ間の通信がうまくいかない経験をしたことがあります。

:::note warn
***特に `docker-compose.yml` でネットワークを適切に設定しないと、コンテナが相互に接続できない問題が発生しがちです。***
:::

この問題を解決するために、ネットワークの統一方法を整理し、分かりやすく解説したいと思いました。**同じ問題で悩む方の助けになれば幸いです。**

## Docker のネットワークを統一する方法

Docker を使用する際、複数のコンテナ間で通信を行う必要があります。しかし、適切にネットワークを設定しないと、コンテナ同士が接続できず、エラーが発生することがあります。

### ネットワークの問題点

以下の `docker-compose.yml` を例に、ネットワークの問題を確認します。

```yaml
version: '3.9'
services:
  app:
    build:
      context: .
      dockerfile: Dockerfile.dev
    volumes:
      - .:/usr/src/app
    ports:
      - '1323:1323'
    tty: true
    depends_on:
      - dev-mysql

  dev-mysql:
    image: mysql:8.0
    ports:
      - '3308:3306'
    container_name: dev-mysql
    platform: linux/x86_64
    env_file:
      - .env
    networks:
      - app-network
    healthcheck:
      test: mysqladmin ping -h 127.0.0.1 -u$$MYSQL_USER -p$$MYSQL_PASSWORD
      interval: 10s
      timeout: 10s
      retries: 3
      start_period: 30s
    volumes:
      - mysql-data:/var/lib/mysql

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    depends_on:
      - dev-mysql
    environment:
      PMA_HOST: dev-mysql
      PMA_PORT: 3306
    env_file:
      - .env
    ports:
      - '4000:80'
    networks:
      - app-network
    volumes:
      - ./phpmyadmin/sessions:/sessions

volumes:
  mysql-data:
    driver: local

networks:
  app-network:
    driver: bridge
```

この設定には問題があります。それは、`app` サービスに `networks: app-network` の指定がないため、`dev-mysql` に接続できない可能性があることです。

## ネットワークを統一する修正方法

以下のように `app` に `networks: app-network` を追加することで、コンテナ間の通信を統一できます。

```yaml
version: '3.9'
services:
  app:
    build:
      context: .
      dockerfile: Dockerfile.dev
    volumes:
      - .:/usr/src/app
    ports:
      - '1323:1323'
    tty: true
    depends_on:
      - dev-mysql
    networks:
      - app-network  # ネットワークを追加

  dev-mysql:
    image: mysql:8.0
    ports:
      - '3308:3306'
    container_name: dev-mysql
    platform: linux/x86_64
    env_file:
      - .env
    networks:
      - app-network
    healthcheck:
      test: mysqladmin ping -h 127.0.0.1 -u$$MYSQL_USER -p$$MYSQL_PASSWORD
      interval: 10s
      timeout: 10s
      retries: 3
      start_period: 30s
    volumes:
      - mysql-data:/var/lib/mysql

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    depends_on:
      - dev-mysql
    environment:
      PMA_HOST: dev-mysql
      PMA_PORT: 3306
    env_file:
      - .env
    ports:
      - '4000:80'
    networks:
      - app-network
    volumes:
      - ./phpmyadmin/sessions:/sessions

volumes:
  mysql-data:
    driver: local

networks:
  app-network:
    driver: bridge
```

## ネットワークの確認方法

ネットワークが正しく作成されたかを確認するには、以下のコマンドを使用します。

```bash
docker network ls
```

`networks` で設定した内容が一覧に表示されていることを確認してください。

**実際のコマンド画面**

![Screenshot 2025-02-13 at 11.42.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/1d5b26e1-ab01-4a9f-8d59-95b8ae9d71ab.png)


また、ネットワークの詳細を確認するには、以下のコマンドを使用します。

```bash
docker network inspect ＜特定のネットワークの ID＞
```

**実際のコマンド画面**

![Screenshot 2025-02-13 at 11.45.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/6123bcdd-6707-4eaa-a72e-e63b04945929.png)


コンテナが `＜特定のネットワークの ID＞` に接続されていることを確認しましょう。

## ここまでの簡単なまとめ

- **ネットワークを統一するために、全コンテナに `networks: app-network` を指定**
- **`docker network inspect app-network` で接続状況を確認**
- **`ping dev-mysql` や `nc -zv dev-mysql 3306` で接続テスト**

## おまけ：接続テストコマンド紹介

`app` から `dev-mysql` に接続できるかを確認するために、以下のコマンドを実行します。

```bash
docker exec -it <appコンテナID> sh
```

その後、コンテナ内で以下を実行します。

```sh
ping dev-mysql
```

もしくは、ポートが開いているかを確認するために以下を実行します。

```sh
nc -zv dev-mysql 3306
```

成功すれば、ネットワークが正しく設定されています。


## まとめ

Docker でコンテナ間通信を行うには、統一されたネットワークを設定することが重要です。

:::note info
**`docker-compose.yml` で各コンテナに `networks: app-network` を指定することで、確実に接続できるようになります。**
:::

また、`docker network inspect` を使って設定を確認し、`ping` や `nc` で接続テストを行いましょう。適切なネットワーク管理で、安定したコンテナ環境を構築できます！