【Docker】同一NWに2つのUbuntuコンテナを自動起動

## はじめに

Dockerでは、`Dockerfile`や`docker-compose`を使う事で、コンテナの環境構築を自動化できます。今回は、通信業界の現場でよく使う、「同じネットワーク内に2つのUbuntuコンテナを配置する環境構築」を、`Dockerfile`や`docker-compose`を使用して自動化してみます。

---

## 動作環境

- **OS**: macOS（M1チップ搭載）
- **Docker**: Docker Desktop for Mac (M1版)

---

## 全体の流れ

本記事では、次のステップで進めます。

1. **Dockerfileの作成**  
   Ubuntuベースのコンテナを作成するための`Dockerfile`を作成します。

2. **docker-compose.ymlの作成**  
   複数のコンテナを同時に作成するための`docker-compose.yml`を作成します。

3. **Ubuntuコンテナの起動**  
   `docker-compose`を使って、2台のUbuntuコンテナを同時に起動します。

4. **コンテナ同士の通信接続確認**  
   作成した2台のコンテナが相互に通信できるかを確認します。

---

## Dockerfileの作成

まずは、ベースとなる`Dockerfile`を作成します。このファイルには、コンテナをビルドする際に実行するコマンドや必要なパッケージを記載します。ファイル名は`Dockerfile`という名前でOKです。

```Dockerfile
# M1 MacのみFROMの記述が必要
FROM --platform=linux/amd64 ubuntu:latest

# RUNコマンドは、コンテナ作成時に自動で実行するコマンドを指定
RUN apt update -y
RUN apt install -y sudo make curl vim iperf3 iproute2 iputils-ping

# fogeというユーザを作成、fogefogeというPWを設定
RUN useradd -m -s /bin/bash foge
RUN echo "foge:fogefoge" | chpasswd

# sudoでroot権限のコマンドを実行できるように指定
RUN gpasswd -a foge sudo

# コンテナを指定したユーザで実行（rootユーザ以外で実行したい）
USER foge

# ワークディレクトリを設定
WORKDIR /home/foge
```

### 解説

1. **`FROM --platform=linux/amd64 ubuntu:latest`**  
   M1 Mac（ARMアーキテクチャ）を使っている場合、`--platform=linux/amd64`オプションを付けて、x86アーキテクチャ用のUbuntuを指定します。これにより、異なるアーキテクチャ間でも問題なくコンテナを作成できます。

2. **`RUN`コマンド**  
   必要なパッケージ（`sudo`, `make`, `curl`など）をインストールしています。

3. **`useradd` と `chpasswd`**  
   新しいユーザー（`foge`）を作成し、パスワードを設定します。

4. **`USER foge`**  
   コンテナ内で実行するユーザーを`foge`に指定しています。これにより、root権限を持つことなく、セキュアにコンテナを実行できます。

---

## docker-compose.ymlの作成

次に、同じディレクトリに`docker-compose.yml`を作成して、2台のコンテナを同時に立ち上げます。

```yaml
version: '3.8'

services:
  ubuntu1:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: ubuntu1
    networks:
      - mynetwork
    tty: true

  ubuntu2:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: ubuntu2
    networks:
      - mynetwork
    tty: true

networks:
  mynetwork:
    driver: bridge
```

### 解説

- **`version: '3.8'`**  
  Docker Composeのバージョンを指定しています。

- **`services`**  
  `services`セクションでは、2つのコンテナ（`ubuntu1`と`ubuntu2`）を定義します。それぞれ、同じ`Dockerfile`からビルドされ、同じネットワーク（`mynetwork`）を共有します。

- **`build`**  
  `build`セクションで、現在のディレクトリ（`context: .`）から`Dockerfile`を参照してコンテナをビルドします。

- **`networks`**  
  両方のコンテナが同じネットワーク（`mynetwork`）を使用するため、コンテナ間で通信が可能です。

- **`tty: true`**  
  インタラクティブな端末を有効にします。これにより、コンテナ内でコマンドライン操作が可能になります。

---

## Ubuntuコンテナの起動

ここまで準備が整ったら、`docker-compose`を使ってコンテナをビルドして起動します。

```bash
docker-compose up --build
```

このコマンドで、`docker-compose.yml`に定義された2つのコンテナがビルドされ、起動します。`--build`オプションを付けることで、`Dockerfile`を基にして新たにイメージが作成されます。

コンテナが起動すると、次のように表示されます。C-cでコマンドを停止すると、docker-composeが停止し、起動した2つのコンテナも停止します。今回は、C-cで停止せず、コンテナ同士の通信接続確認に進みます。

```bash
[+] Running 2/2
 ⠿ Container ubuntu2  Created                                                                                           0.0s
 ⠿ Container ubuntu1  Created                                                                                           0.0s
Attaching to ubuntu1, ubuntu2
ubuntu2  | To run a command as administrator (user "root"), use "sudo <command>".
ubuntu2  | See "man sudo_root" for details.
ubuntu2  | 
ubuntu1  | To run a command as administrator (user "root"), use "sudo <command>".
ubuntu1  | See "man sudo_root" for details.
ubuntu1  | 
...
```

---

## コンテナ同士の通信接続確認

2台のコンテナが同じネットワークに接続されているので、コンテナ間で通信を確認できます。

#### 1. `ubuntu1`コンテナにアクセス

新しいターミナルを開き、以下のコマンドで`ubuntu1`コンテナにアクセスします。

```bash
docker exec -it ubuntu1 bash
```

#### 2. `ubuntu2`コンテナにアクセス

新しいターミナルを開き、以下のコマンドで`ubuntu2`コンテナにアクセスします。

```bash
docker exec -it ubuntu2 bash
```

#### 3. pingテスト 

   まず、それぞれのコンテナでIPアドレスを確認します。

   ```bash
   # IPアドレスを確認
   ip a   
   ```

   `ubuntu1`コンテナ内で、`ubuntu2`コンテナにpingを送ります。

   ```bash
   # コンテナ名を指定してpingを送る
   ping ubuntu2

   # IPアドレスを指定してpingを送る
   ping <コンテナのIPアドレス>
   ```

2台のコンテナが同じネットワーク内で通信できるはずです。

---

## おわりに

今回は、Docker Composeを使って2台のUbuntuコンテナを同時に作成し、コンテナ同士で通信できる環境を構築する方法を解説しました。Docker Composeを使うことで、複数のコンテナを簡単に管理でき、開発環境を素早く立ち上げることができます。

次は、この環境をさらにカスタマイズして、実際のアプリケーションやサービスのセットアップを試してみてください。

## 参考

Dockerの基本的な操作については、次の記事を参照してください。

https://qiita.com/k-keita/items/9f0d3110085ef6277a48