はじめに
Dockerでは、Dockerfile
やdocker-compose
を使う事で、コンテナの環境構築を自動化できます。今回は、通信業界の現場でよく使う、「同じネットワーク内に2つのUbuntuコンテナを配置する環境構築」を、Dockerfile
やdocker-compose
を使用して自動化してみます。
動作環境
- OS: macOS(M1チップ搭載)
- Docker: Docker Desktop for Mac (M1版)
全体の流れ
本記事では、次のステップで進めます。
-
Dockerfileの作成
Ubuntuベースのコンテナを作成するためのDockerfile
を作成します。 -
docker-compose.ymlの作成
複数のコンテナを同時に作成するためのdocker-compose.yml
を作成します。 -
Ubuntuコンテナの起動
docker-compose
を使って、2台のUbuntuコンテナを同時に起動します。 -
コンテナ同士の通信接続確認
作成した2台のコンテナが相互に通信できるかを確認します。
Dockerfileの作成
まずは、ベースとなるDockerfile
を作成します。このファイルには、コンテナをビルドする際に実行するコマンドや必要なパッケージを記載します。ファイル名はDockerfile
という名前でOKです。
# 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
解説
-
FROM --platform=linux/amd64 ubuntu:latest
M1 Mac(ARMアーキテクチャ)を使っている場合、--platform=linux/amd64
オプションを付けて、x86アーキテクチャ用のUbuntuを指定します。これにより、異なるアーキテクチャ間でも問題なくコンテナを作成できます。 -
RUN
コマンド
必要なパッケージ(sudo
,make
,curl
など)をインストールしています。 -
useradd
とchpasswd
新しいユーザー(foge
)を作成し、パスワードを設定します。 -
USER foge
コンテナ内で実行するユーザーをfoge
に指定しています。これにより、root権限を持つことなく、セキュアにコンテナを実行できます。
docker-compose.ymlの作成
次に、同じディレクトリにdocker-compose.yml
を作成して、2台のコンテナを同時に立ち上げます。
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
を使ってコンテナをビルドして起動します。
docker-compose up --build
このコマンドで、docker-compose.yml
に定義された2つのコンテナがビルドされ、起動します。--build
オプションを付けることで、Dockerfile
を基にして新たにイメージが作成されます。
コンテナが起動すると、次のように表示されます。C-cでコマンドを停止すると、docker-composeが停止し、起動した2つのコンテナも停止します。今回は、C-cで停止せず、コンテナ同士の通信接続確認に進みます。
[+] 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
コンテナにアクセスします。
docker exec -it ubuntu1 bash
2. ubuntu2
コンテナにアクセス
新しいターミナルを開き、以下のコマンドでubuntu2
コンテナにアクセスします。
docker exec -it ubuntu2 bash
3. pingテスト
まず、それぞれのコンテナでIPアドレスを確認します。
# IPアドレスを確認
ip a
ubuntu1
コンテナ内で、ubuntu2
コンテナにpingを送ります。
# コンテナ名を指定してpingを送る
ping ubuntu2
# IPアドレスを指定してpingを送る
ping <コンテナのIPアドレス>
2台のコンテナが同じネットワーク内で通信できるはずです。
おわりに
今回は、Docker Composeを使って2台のUbuntuコンテナを同時に作成し、コンテナ同士で通信できる環境を構築する方法を解説しました。Docker Composeを使うことで、複数のコンテナを簡単に管理でき、開発環境を素早く立ち上げることができます。
次は、この環境をさらにカスタマイズして、実際のアプリケーションやサービスのセットアップを試してみてください。
参考
Dockerの基本的な操作については、次の記事を参照してください。