このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。
【Docker基礎】複数のApacheコンテナを作成する

複数のApacheコンテナを作成する
ここでは、Dockerを使用して複数のApache(httpd)コンテナを作成・起動し、それぞれ異なるホストポートでアクセスする方法を学びます。複数のWebサーバを並行して運用する際のポート設定の重要性と、その具体的な手順について詳しく解説します。

Apacheとは
Apache(正式名称:Apache HTTP Server)は、オープンソースのWebサーバソフトウェアであり、多くのWebサイトで利用されています。Apacheが動作しているサーバにファイルを配置することで、インターネット上からアクセス可能なWebサイトとして公開することができます。
複数のコンテナを並行して運用する理由
現実の運用環境では、負荷分散や異なるアプリケーションのテストなど、複数のWebサーバを並行して稼働させる必要があります。その際、各コンテナが同じポート番号を使用すると、ホストマシンでポート競合が発生し、通信が正常に行えなくなります。これを避けるために、ホスト側のポート番号をコンテナごとに異なる番号に設定する必要があります。

ポート番号の競合を避けるための設定
ホストマシンの同一ポート番号を複数のコンテナに割り当てることはできません。これは、どのコンテナ宛ての通信かが識別できなくなり、通信が正常にルーティングされないためです。例えば、以下のようにホスト側のポート番号をずらして設定します。
- コンテナ1:ホストのポート8000 → コンテナのポート80
- コンテナ2:ホストのポート8001 → コンテナのポート80

この設定により、ホストのポート8000にアクセスするとコンテナ1に、ポート8001にアクセスするとコンテナ2に通信がルーティングされます。
もし、どうしても両方のコンテナをホストのポート80で接続したい場合は、リバースプロキシを利用して、サーバ名やURLパスに基づいて適切なコンテナに振り分ける構成を行います。
ポート設定の記述例
コンテナ名 | ホストポート | コンテナポート | 説明 |
---|---|---|---|
Apache1 | 8000 | 80 | ホストの8000番ポートをコンテナ1の80番ポートにマッピング |
Apache2 | 8001 | 80 | ホストの8001番ポートをコンテナ2の80番ポートにマッピング |
複数のApacheコンテナの作成から削除までの実践
以下の手順に従って、複数のApacheコンテナを作成・起動し、それぞれの稼働状況を確認、停止、削除する方法を実践します。
Step1:「run」コマンドを実行する
まず、Apacheの公式イメージ(httpd
)を使用して「Apache1」と「Apache2」という名前のコンテナを作成・起動します。既にhttpd
イメージがローカルに存在するため、コンテナの作成は迅速に行われます。
コマンドの実行
PowerShellまたはターミナルに以下のコマンドを入力します。
docker run --name Apache1 -d -p 8000:80 httpd
docker run --name Apache2 -d -p 8001:80 httpd
コマンドの解説
docker run
: 新しいコンテナを作成して起動します。--name Apache1
/--name Apache2
: コンテナに「Apache1」および「Apache2」という名前を付けます。-d
: コンテナをバックグラウンド(デタッチドモード)で実行します。-p 8000:80
/-p 8001:80
: ホストのポート8000をコンテナ1のポート80に、ポート8001をコンテナ2のポート80にマッピングします。httpd
: 使用するイメージ名(Apacheの公式イメージ)。
実行結果
PS C:\Users\joeac> docker run --name Apache1 -d -p 8000:80 httpd
a9dd819ad6594c3c62c1e3545382b5dfa00e73905e796be9b22210c607f0ec88
PS C:\Users\joeac> docker run --name Apache2 -d -p 8001:80 httpd
debea5012db049aa1ec08c6bb72ec5f96572b5a04bbd4987ebcbb575be4a7ab0
注意点
- コンテナID(例:
a9dd819ad659...
,debea5012db0...
)は環境によって異なります。 - 初回実行時にイメージがローカルに存在しない場合は、イメージのダウンロードが開始されますが、今回は既に存在するため即座にコンテナが起動します。
Step2:「ps」コマンドでコンテナの稼働を確認する
作成・起動した「Apache1」と「Apache2」コンテナが正しく稼働しているか確認します。
コマンドの実行
docker ps
実行結果
PS C:\Users\joeac> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
debea5012db0 httpd "httpd-foreground" 2 minutes ago Up 2 minutes 0.0.0.0:8001->80/tcp Apache2
a9dd819ad659 httpd "httpd-foreground" 3 minutes ago Up 3 minutes 0.0.0.0:8000->80/tcp Apache1
確認ポイント
NAMES
列に「Apache1」と「Apache2」が表示されていること。STATUS
が「Up」であること。PORTS
に0.0.0.0:8000->80/tcp
および0.0.0.0:8001->80/tcp
と表示され、ホストのポート8000および8001がそれぞれコンテナのポート80にマッピングされていること。
Step3:ブラウザでApacheコンテナが動作していることを確認する
ブラウザを開き、以下のURLにアクセスして、それぞれのコンテナが正常に動作していることを確認します。
- コンテナ1(Apache1)へのアクセス:
http://localhost:8000/
- コンテナ2(Apache2)へのアクセス:
http://localhost:8001/
注意点
- プロトコルは
http
を使用します(https
ではありません)。 - 正常に動作していれば、Apacheのデフォルトページが表示されます。
図: ブラウザでの確認


Step4:「stop」コマンドでコンテナを停止する
作成・起動した「Apache1」と「Apache2」コンテナの動作を停止します。
コマンドの実行
docker stop Apache1
docker stop Apache2
実行結果
PS C:\Users\joeac> docker stop Apache1
Apache1
PS C:\Users\joeac> docker stop Apache2
Apache2
解説
docker stop
コマンドにより、指定したコンテナ名のコンテナが停止されます。- 実行結果として、停止されたコンテナ名が表示されます。
Step5:「rm」コマンドで「Apache1」と「Apache2」コンテナを削除する
不要になった「Apache1」と「Apache2」コンテナを削除します。
コマンドの実行
docker rm Apache1
docker rm Apache2
実行結果
PS C:\Users\joeac> docker rm Apache1
Apache1
PS C:\Users\joeac> docker rm Apache2
Apache2
解説
docker rm
コマンドにより、指定したコンテナ名のコンテナが削除されます。- 実行結果として、削除されたコンテナ名が表示されます。
注意点
- コンテナを削除する前に、必ずコンテナが停止されていることを確認してください。稼働中のコンテナは削除できません。
- コンテナを削除すると、そのコンテナ内のデータは失われます。必要なデータがある場合は、事前にバックアップを取ってください。
Step6:「ps -a」コマンドでコンテナの削除を確認する
コンテナが正しく削除されたか確認します。
コマンドの実行
docker ps -a
実行結果
PS C:\Users\joeac> docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1024ef450a12 hello-world "/hello" 46 hours ago Exited (0) 2 hours ago frosty_sinoussi
確認ポイント
- 「Apache1」と「Apache2」が一覧に表示されていないこと。
- 他のコンテナ(例:
hello-world
)が存在する場合でも、「Apache1」と「Apache2」が削除されていることを確認します。
まとめ
ここでは、Dockerを使用して複数のApacheコンテナを作成・起動し、異なるホストポートでアクセスする方法を学びました。以下のポイントを押さえておきましょう。
- ポートマッピングの重要性: 複数のコンテナを同時に運用する際、ホスト側のポート番号をコンテナごとに異なる番号に設定することで、通信の競合を避け、正確なルーティングを実現します。
- コマンドの理解:
docker run
コマンドにおける各オプション(--name
、-d
、-p
)の役割を理解し、適切に使用することが重要です。 - コンテナの確認:
docker ps
およびdocker ps -a
コマンドを活用して、コンテナの稼働状況や存在を確認します。 - コンテナの停止と削除:
docker stop
およびdocker rm
コマンドを使用して、不要になったコンテナを安全に停止・削除します。
複数のコンテナを管理する際は、ポート番号の設定やコンテナ名の管理が重要となります。これらの手順を何度か繰り返して実践することで、効率的なコンテナ運用が可能になります。また、リバースプロキシの設定方法についても学び、より高度なネットワーク構成を理解することで、柔軟なシステム設計が可能となります。
次のコンテンツでは、様々なイメージとコンテナについてさらに詳しく紹介していきます。引き続き、Dockerの理解を深めていきましょう。