このページで解説している内容は、以下の 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パスに基づいて適切なコンテナに振り分ける構成を行います。

ポート設定の記述例

コンテナ名ホストポートコンテナポート説明
Apache1800080ホストの8000番ポートをコンテナ1の80番ポートにマッピング
Apache2800180ホストの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」であること。
  • PORTS0.0.0.0:8000->80/tcpおよび0.0.0.0:8001->80/tcpと表示され、ホストのポート8000および8001がそれぞれコンテナのポート80にマッピングされていること。

Step3:ブラウザでApacheコンテナが動作していることを確認する

 ブラウザを開き、以下のURLにアクセスして、それぞれのコンテナが正常に動作していることを確認します。

  1. コンテナ1(Apache1)へのアクセス: http://localhost:8000/
  2. コンテナ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の理解を深めていきましょう。