DockerコンテナをApacheで管理するリバースプロキシ設定ガイド

DockerコンテナをApacheのリバースプロキシで管理することは、モダンなWebアプリケーションのデプロイにおいて重要な技術です。Apacheは柔軟なリバースプロキシ機能を持ち、複数のDockerコンテナで動作するアプリケーションを一元的に管理できます。

リバースプロキシを使うことで、コンテナ内で動作する複数のサービスを一つの公開アドレスで提供し、ロードバランシングやセキュリティ向上を実現します。さらに、Apacheのバーチャルホストを活用することで、複数のドメインやサブドメインを個別のDockerコンテナにルーティングすることが可能になります。

本記事では、DockerとApacheを組み合わせてリバースプロキシを構築する方法をステップバイステップで解説します。Docker環境のセットアップからApacheの設定、SSL証明書の導入方法までを網羅し、実際のトラブルシューティングや応用例も紹介します。

これにより、Dockerコンテナを効率的に管理し、安全かつスケーラブルなWebサービスを運用するための知識が得られます。

目次

リバースプロキシの概要と役割


リバースプロキシとは、クライアントからのリクエストを受け取り、バックエンドのサーバーやサービス(Dockerコンテナなど)に転送する仕組みです。リクエストに対して適切なレスポンスを返す役割を担います。

リバースプロキシの主な役割

  1. セキュリティの向上
     リバースプロキシが直接クライアントと通信するため、バックエンドのサーバーを外部に直接公開する必要がありません。これにより、不正アクセスのリスクを低減できます。
  2. ロードバランシング
     複数のDockerコンテナにリクエストを分散し、負荷を均等にすることでアプリケーションのパフォーマンスを向上させます。
  3. SSLの終端処理
     リバースプロキシ側でSSL通信を処理し、内部通信はHTTPで行うことでDockerコンテナ側の負荷を軽減します。
  4. URLルーティングとホスティングの統合
     異なるアプリケーションを同一ドメイン内でルーティングし、Dockerコンテナごとに異なるサービスを提供します。これにより、単一のApacheサーバーで複数のWebアプリケーションを管理可能です。

Apacheを使うメリット

  • 高い信頼性と柔軟性
     Apacheは長年の運用実績があり、多くの機能を持つ成熟したWebサーバーです。モジュール構成で必要な機能を追加でき、リバースプロキシとしての運用も簡単です。
  • 豊富なドキュメントとサポート
     Apacheはユーザーコミュニティが広く、リバースプロキシの設定例やトラブルシューティングに関する情報が豊富に揃っています。

リバースプロキシを導入することで、Dockerコンテナの管理が効率化され、セキュリティとパフォーマンスの両立が可能になります。次の章では、Docker環境の準備方法について解説します。

Docker環境の準備


Docker環境の構築は、リバースプロキシを利用してコンテナを管理するための重要なステップです。ここでは、Dockerのインストールから基本的な動作確認までの手順を説明します。

Dockerのインストール


Dockerは主要なOS(Linux、Windows、macOS)で利用可能です。以下はLinux環境でのインストール例です。

1. 必要なパッケージをインストール


“`bash
sudo apt update
sudo apt install apt-transport-https ca-certificates curl software-properties-common

<h4>2. Docker公式のGPGキーを追加</h4>  

bash
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg –dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

<h4>3. Dockerリポジトリを追加</h4>  

bash
echo “deb [arch=$(dpkg –print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable” | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update

<h4>4. Dockerのインストール</h4>  

bash
sudo apt install docker-ce docker-ce-cli containerd.io

<h4>5. Dockerのサービスを起動</h4>  

bash
sudo systemctl start docker
sudo systemctl enable docker

<h3>Dockerの動作確認</h3>  
以下のコマンドで、Dockerが正しくインストールされているかを確認します。  

bash
docker –version
docker run hello-world

"Hello from Docker!"と表示されれば、Dockerが正常に動作しています。  

<h3>Docker Composeのインストール</h3>  
複数のコンテナを連携して管理するにはDocker Composeが必要です。以下の手順でインストールします。  

bash
sudo curl -L “https://github.com/docker/compose/releases/download/$(curl -s https://api.github.com/repos/docker/compose/releases/latest | grep tag_name | cut -d ‘”‘ -f 4)/docker-compose-$(uname -s)-$(uname -m)” -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose –version

<h3>まとめ</h3>  
これでDocker環境の準備が整いました。次に、Apacheのインストールとリバースプロキシモジュールの設定について解説します。
<h2>Apacheのインストールと設定</h2>  
ApacheをDocker環境のリバースプロキシとして利用するためには、Apacheのインストールと必要なモジュールの有効化が不可欠です。ここでは、Apacheの基本インストール手順から、リバースプロキシを動作させるための設定方法を解説します。  

<h3>Apacheのインストール</h3>  
まず、Apacheをインストールし、サービスを起動します。以下はUbuntu環境での例です。  

<h4>1. Apacheのインストール</h4>  

bash
sudo apt update
sudo apt install apache2

<h4>2. Apacheの自動起動設定</h4>  

bash
sudo systemctl start apache2
sudo systemctl enable apache2

インストール後、ブラウザでサーバーのIPアドレスにアクセスし、「Apache2 Ubuntu Default Page」が表示されれば、Apacheが正常に動作しています。  

<h3>リバースプロキシモジュールの有効化</h3>  
リバースプロキシとして動作させるには、必要なモジュールを有効化する必要があります。  

<h4>1. モジュールを有効にする</h4>  

bash
sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod headers

<h4>2. 設定を反映させる</h4>  

bash
sudo systemctl restart apache2

<h3>バーチャルホストの作成</h3>  
バーチャルホストを使い、特定のドメインやパスへのリクエストをDockerコンテナにリダイレクトします。  

<h4>1. 設定ファイルを作成</h4>  

bash
sudo nano /etc/apache2/sites-available/docker-proxy.conf

<h4>2. バーチャルホストの設定例</h4>  

apache

ServerName example.com

ProxyPreserveHost On  
ProxyPass / http://localhost:8080/  
ProxyPassReverse / http://localhost:8080/  

<Location />  
    Order allow,deny  
    Allow from all  
</Location>  
この設定により、`http://example.com`へのアクセスが、`http://localhost:8080`で稼働しているDockerコンテナに転送されます。  

<h4>3. バーチャルホストを有効化</h4>  

bash
sudo a2ensite docker-proxy.conf
sudo systemctl reload apache2

<h3>動作確認</h3>  
Dockerコンテナを起動し、ブラウザで`http://example.com`にアクセスして正しく表示されるか確認します。  

<h3>まとめ</h3>  
これでApacheをDocker環境でリバースプロキシとして動作させる準備が整いました。次はDockerコンテナの構築と起動方法について解説します。
<h2>Dockerコンテナの構築と起動</h2>  
リバースプロキシを機能させるには、バックエンドで動作するDockerコンテナが必要です。ここでは、簡単なWebアプリケーションをDockerコンテナ化し、起動する手順を解説します。  

<h3>Dockerfileの作成</h3>  
Dockerfileを使って、シンプルなWebサーバーを構築します。例として、PythonのFlaskを利用したWebアプリケーションを作成します。  

<h4>1. プロジェクトディレクトリを作成</h4>  

bash
mkdir ~/docker-webapp
cd ~/docker-webapp

<h4>2. Dockerfileの作成</h4>  

bash
nano Dockerfile

<h4>3. Dockerfileの内容</h4>  

dockerfile

ベースイメージ

FROM python:3.9-slim

必要なパッケージをインストール

RUN pip install flask

アプリケーションコードをコピー

COPY app.py /app/app.py

作業ディレクトリを設定

WORKDIR /app

アプリケーションの実行

CMD [“python”, “app.py”]

<h3>Webアプリケーションコードの作成</h3>  
次に、Flaskアプリケーションのコードを記述します。  

<h4>1. アプリケーションコードの作成</h4>  

bash
nano app.py

<h4>2. app.pyの内容</h4>  

python
from flask import Flask
app = Flask(name)

@app.route(‘/’)
def hello():
return “Hello from Docker Container!”

if name == “main“:
app.run(host=’0.0.0.0′, port=8080)

<h3>Dockerイメージのビルド</h3>  
Dockerfileとアプリケーションコードが準備できたら、Dockerイメージをビルドします。  

bash
docker build -t flask-webapp .

<h3>Dockerコンテナの起動</h3>  
ビルドしたイメージからコンテナを起動します。  

bash
docker run -d -p 8080:8080 flask-webapp

この設定により、`http://localhost:8080`でアプリケーションが動作します。  

<h3>コンテナの自動再起動設定</h3>  
Dockerコンテナが停止した場合に自動で再起動するように設定します。  

bash
docker run -d -p 8080:8080 –restart always flask-webapp

<h3>動作確認</h3>  
ブラウザで`http://localhost:8080`にアクセスし、「Hello from Docker Container!」と表示されれば、Dockerコンテナが正しく動作しています。  

<h3>まとめ</h3>  
これでDockerコンテナを構築し、Webアプリケーションが起動しました。次はApacheのバーチャルホスト設定を行い、リバースプロキシ経由でコンテナにアクセスする方法を解説します。
<h2>Apacheのバーチャルホスト設定</h2>  
Apacheでリバースプロキシを構築する際に、バーチャルホストを設定することで、特定のドメインやサブドメインに対してDockerコンテナを割り当てることができます。このセクションでは、Apacheのバーチャルホストを使ったDockerコンテナへのルーティング方法を解説します。  

<h3>バーチャルホストの概要</h3>  
バーチャルホストを利用すると、一台のサーバーで複数のドメインやサブドメインを管理し、それぞれのリクエストを異なるDockerコンテナにルーティングできます。  
例として、`app.example.com`が`localhost:8080`で稼働するDockerコンテナにルーティングされる設定を作成します。  

<h3>バーチャルホストの設定手順</h3>  

<h4>1. Apacheの設定ファイルを作成</h4>  
新しいバーチャルホストの設定ファイルを作成します。  

bash
sudo nano /etc/apache2/sites-available/app.example.com.conf

<h4>2. 設定ファイルの記述</h4>  
以下の設定で、`app.example.com`へのアクセスをDockerコンテナが稼働している`localhost:8080`に転送します。  

apache

ServerName app.example.com

ProxyPreserveHost On  
ProxyPass / http://localhost:8080/  
ProxyPassReverse / http://localhost:8080/  

<Location />  
    Require all granted  
</Location>  

ErrorLog ${APACHE_LOG_DIR}/app_error.log  
CustomLog ${APACHE_LOG_DIR}/app_access.log combined  
<h4>3. バーチャルホストの有効化</h4>  
作成した設定ファイルを有効化します。  

bash
sudo a2ensite app.example.com.conf
sudo systemctl reload apache2

<h3>ホストファイルの編集(テスト用)</h3>  
ローカル環境でドメインをテストする場合は、`/etc/hosts`ファイルにエントリを追加します。  

bash
sudo nano /etc/hosts

以下を追加します。  


127.0.0.1 app.example.com

<h3>動作確認</h3>  
ブラウザで`http://app.example.com`にアクセスし、DockerコンテナのWebアプリケーションが表示されるか確認します。  

<h3>複数のバーチャルホストを設定する場合</h3>  
複数のDockerコンテナを異なるサブドメインで運用する場合は、同様の手順で複数のバーチャルホスト設定を追加できます。  
例えば、`api.example.com`を別のコンテナ(`localhost:5000`)にルーティングする設定例は以下の通りです。  

apache

ServerName api.example.com

ProxyPass / http://localhost:5000/  
ProxyPassReverse / http://localhost:5000/  
<h3>まとめ</h3>  
バーチャルホストを使うことで、Dockerコンテナごとに異なるドメインやサブドメインを割り当てることができます。次は、ApacheとDockerコンテナを連携させる具体的なプロキシ設定について解説します。
<h2>ApacheとDockerの連携設定</h2>  
ApacheのリバースプロキシをDockerコンテナと連携させることで、外部からのリクエストを適切にDockerコンテナにルーティングできます。このセクションでは、Apacheが複数のDockerコンテナと連携する設定方法を解説します。  

<h3>リバースプロキシの基本設定</h3>  
ApacheがDockerコンテナにトラフィックを転送するためには、`ProxyPass`と`ProxyPassReverse`ディレクティブを使用します。  

<h4>1. Dockerコンテナが稼働していることを確認</h4>  

bash
docker ps

出力例:  


CONTAINER ID IMAGE PORTS NAMES
f3b1a7d8a9c2 flask-webapp 0.0.0.0:8080->8080/tcp flask_app

この例では`flask_app`というコンテナが`localhost:8080`で稼働しています。  

<h4>2. Apacheの設定ファイルを編集</h4>  
既存のバーチャルホスト設定にプロキシの設定を追加します。  

bash
sudo nano /etc/apache2/sites-available/app.example.com.conf

<h4>3. 連携用のプロキシ設定</h4>  
以下の設定で、Apacheが`localhost:8080`のDockerコンテナにリクエストを転送します。  

apache

ServerName app.example.com

ProxyPreserveHost On  
ProxyPass / http://localhost:8080/  
ProxyPassReverse / http://localhost:8080/  

<Location />  
    Require all granted  
</Location>  
<h3>複数コンテナとの連携</h3>  
複数のDockerコンテナを運用する場合は、異なるURLパスやサブドメインを使用して個々のコンテナにルーティングします。  

<h4>1. 複数のコンテナが稼働している場合</h4>  

bash
docker ps

出力例:  


CONTAINER ID IMAGE PORTS NAMES
f3b1a7d8a9c2 flask-webapp 0.0.0.0:8080->8080/tcp flask_app
e4c3b9f7d8e3 node-webapp 0.0.0.0:5000->5000/tcp node_app

<h4>2. Apacheの設定ファイルで複数のコンテナをルーティング</h4>  

apache

ServerName app.example.com

ProxyPreserveHost On  
ProxyPass /flask/ http://localhost:8080/  
ProxyPassReverse /flask/ http://localhost:8080/  

ProxyPass /node/ http://localhost:5000/  
ProxyPassReverse /node/ http://localhost:5000/  

<Location />  
    Require all granted  
</Location>  
この設定により、`http://app.example.com/flask/`がFlaskアプリケーションに、`http://app.example.com/node/`がNode.jsアプリケーションにルーティングされます。  

<h3>Dockerコンテナの自動起動と連携</h3>  
サーバー再起動時にもDockerコンテナが自動で起動するように設定します。  

bash
docker update –restart always flask_app
docker update –restart always node_app

<h3>セキュリティ設定</h3>  
Dockerコンテナへの直接アクセスを防ぎ、Apache経由のみでアクセス可能にするために、Dockerコンテナの公開ポートを`localhost`のみに制限します。  

bash
docker run -d -p 127.0.0.1:8080:8080 flask-webapp
docker run -d -p 127.0.0.1:5000:5000 node-webapp

<h3>動作確認</h3>  
ブラウザで`http://app.example.com/flask/`および`http://app.example.com/node/`にアクセスし、各コンテナが正しく表示されることを確認します。  

<h3>まとめ</h3>  
ApacheとDockerコンテナを連携させることで、複数のコンテナを柔軟に管理し、トラフィックを適切にルーティングできます。次は、SSL証明書を導入して通信を暗号化する方法を解説します。
<h2>SSL証明書の設定</h2>  
DockerコンテナをApacheのリバースプロキシで管理する際、SSL証明書を導入することで通信を暗号化し、セキュリティを強化できます。このセクションでは、Let's Encryptを使用してSSL証明書を取得し、Apacheに適用する方法を解説します。  

<h3>Let's Encryptの概要</h3>  
Let's Encryptは無料でSSL/TLS証明書を提供する認証局です。自動化された証明書の発行と更新が可能で、広く利用されています。  

<h3>Certbotのインストール</h3>  
ApacheでLet's Encryptを利用するために、Certbotというツールをインストールします。  

<h4>1. Certbotのインストール</h4>  

bash
sudo apt update
sudo apt install certbot python3-certbot-apache

<h4>2. Certbotの動作確認</h4>  

bash
certbot –version

バージョンが表示されれば、Certbotが正常にインストールされています。  

<h3>SSL証明書の取得</h3>  
以下のコマンドでSSL証明書を取得します。  

bash
sudo certbot –apache -d app.example.com

- `-d`の後に証明書を適用するドメインを指定します。  
- Certbotが自動でApacheの設定を変更し、HTTPS通信が可能になります。  

<h4>動作確認</h4>  
証明書の取得が完了したら、ブラウザで`https://app.example.com`にアクセスし、SSL通信が有効であることを確認します。  

<h3>バーチャルホストのSSL設定</h3>  
Certbotは自動でSSL用のバーチャルホストファイルを生成しますが、手動で設定する場合は以下のように記述します。  

bash
sudo nano /etc/apache2/sites-available/app.example.com-le-ssl.conf

apache

ServerName app.example.com

ProxyPreserveHost On  
ProxyPass / http://localhost:8080/  
ProxyPassReverse / http://localhost:8080/  

SSLEngine on  
SSLCertificateFile /etc/letsencrypt/live/app.example.com/fullchain.pem  
SSLCertificateKeyFile /etc/letsencrypt/live/app.example.com/privkey.pem  

<Location />  
    Require all granted  
</Location>  

ErrorLog ${APACHE_LOG_DIR}/app_ssl_error.log  
CustomLog ${APACHE_LOG_DIR}/app_ssl_access.log combined  
<h3>自動更新の設定</h3>  
Let's Encryptの証明書は90日間有効です。自動で更新するようにcronジョブを設定します。  

bash
sudo crontab -e

以下を追加:  


0 3 * * * /usr/bin/certbot renew –quiet

これにより、毎日午前3時に証明書が自動で更新されます。  

<h3>HTTPからHTTPSへのリダイレクト</h3>  
HTTPでアクセスされた場合、自動的にHTTPSにリダイレクトさせます。  

apache
ServerName app.example.com Redirect permanent / https://app.example.com/

<h3>動作確認</h3>  
1. `http://app.example.com`にアクセスして、自動的に`https://app.example.com`にリダイレクトされることを確認します。  
2. 証明書の有効期限は以下のコマンドで確認できます。  

bash
sudo certbot certificates

<h3>まとめ</h3>  
SSL証明書を適用することで、Dockerコンテナで動作するアプリケーションをより安全に運用できます。次は、トラブルシューティングとデバッグ方法について解説します。
<h2>トラブルシューティングとデバッグ</h2>  
DockerコンテナとApacheのリバースプロキシを連携させる際には、設定ミスや接続エラーが発生することがあります。このセクションでは、よくある問題とその解決方法を解説します。  

<h3>Apacheのログ確認</h3>  
リバースプロキシの問題を特定する際、まずはApacheのエラーログとアクセスログを確認します。  

bash
sudo tail -f /var/log/apache2/error.log
sudo tail -f /var/log/apache2/access.log

ログには設定ミスやコンテナとの通信エラーが記録されており、問題の特定が容易になります。  

<h3>Dockerコンテナのログ確認</h3>  
Dockerコンテナが正しく動作しているか確認するために、コンテナのログを確認します。  

bash
docker logs flask_app

特に`connection refused`や`timeout`といったエラーが出ている場合は、コンテナが正しく起動していない可能性があります。  

<h3>よくある問題と解決方法</h3>  

<h4>1. ApacheがDockerコンテナに接続できない</h4>  
**原因**: Dockerコンテナが起動していない、またはポートが開いていない。  
**解決策**:  

bash
docker ps

コンテナが稼働しているか確認し、稼働していない場合は以下のコマンドで再起動します。  

bash
docker start flask_app

ポートが開いているか確認:  

bash
sudo netstat -tuln | grep 8080

もしポートがリッスンされていない場合は、Dockerコンテナの起動時にポートを指定し直します。  

bash
docker run -d -p 8080:8080 flask-webapp

<h4>2. リバースプロキシで502 Bad Gatewayエラーが発生</h4>  
**原因**: Dockerコンテナが応答していない、またはコンテナ内のアプリケーションがクラッシュしている。  
**解決策**:  

bash
docker restart flask_app

または、コンテナの内部で直接アプリケーションが動作しているか確認します。  

bash
docker exec -it flask_app bash
curl http://localhost:8080

アプリケーションが応答しない場合は、アプリケーションコードのエラーログを確認します。  

<h4>3. 404エラーが発生する</h4>  
**原因**: Apacheのバーチャルホスト設定が間違っている、またはリバースプロキシのパスが不正。  
**解決策**: 設定ファイルを確認し、`ProxyPass`と`ProxyPassReverse`のパスが正しいか確認します。  

bash
sudo nano /etc/apache2/sites-available/app.example.com.conf

```apache  
ProxyPass / http://localhost:8080/  
ProxyPassReverse / http://localhost:8080/  


設定ファイルを修正したら、Apacheを再起動します。

“`bash
sudo systemctl reload apache2

<h4>4. SSL証明書の更新が失敗する</h4>  
**原因**: CertbotがドメインのDNS設定を正しく認識できていない。  
**解決策**: DNS設定を確認し、`Aレコード`が正しく設定されていることを確認します。  

また、以下のコマンドで強制的に証明書を更新します。  

bash
sudo certbot renew –force-renewal

<h3>デバッグツールの活用</h3>  
- **curlコマンド**でApacheとDockerの通信を確認:  

bash
curl -I http://localhost:8080

- **Dockerコンテナ内で通信テスト**:  

bash
docker exec -it flask_app bash
curl http://localhost:8080
“`

まとめ


トラブルシューティングは、ApacheとDockerのログを活用しながら原因を特定することが重要です。エラーを一つずつ確認し、確実に解決していくことで安定したリバースプロキシ環境を構築できます。次は、記事のまとめとして本記事の要点を振り返ります。

まとめ


本記事では、DockerコンテナをApacheのリバースプロキシで管理する方法について、ステップバイステップで解説しました。

Docker環境のセットアップから始まり、Apacheのインストールと設定、バーチャルホストの構築、SSL証明書の導入、そしてトラブルシューティングに至るまで、リバースプロキシを活用するための実践的な知識を紹介しました。

Apacheをリバースプロキシとして利用することで、複数のDockerコンテナを一元的に管理し、セキュリティやスケーラビリティを向上させることが可能です。また、Let’s Encryptを用いたSSLの導入により、安全な通信環境を簡単に構築できます。

今後、Docker環境で新しいアプリケーションをデプロイする際は、本記事の内容を参考にして、Apacheを効果的に活用してみてください。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次