1つの同じDockerコンテナーとポートで2つの異なるドメインを実行しようとしています。
DockerコンテナはCentOSを実行します。 docker-compose.yml
は次のようになります:
web:
image: fab/centos
ports:
- "80:80"
volumes:
- ./src/httpd.conf:/etc/httpd/conf/httpd.conf
- ./src:/var/www/html
- ./src/hosts:/etc/hosts
environment:
- VIRTUAL_Host=dummy.dev,tests.dev
また、ホストコンピューター(OS X)の/etc/hosts
内で両方の.devドメイン名を宣言しました。
仮想ホストを構成してから久しぶりです。私の理解では、それらを宣言する必要があるだけであり、Apacheは要求されたHTTPホストに応じて適切なファイルを自動的に提供します。
これはhttpd.conf
の最後に追加したものです。
<VirtualHost *:80> # first Host = default Host
DocumentRoot /var/www/html/default
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /var/www/html/dummy
ServerName dummy.dev
ServerAdmin [email protected]
ErrorLog logs/dummy.dev-error_log
CustomLog logs/dummy.dev-access_log common
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /var/www/html/tests
ServerName tests.dev
ServerAdmin [email protected]
ErrorLog logs/tests.dev-error_log
CustomLog logs/tests.dev-access_log common
</VirtualHost>
ただし、実際には、dummy.devまたはtests.devにアクセスすると、実際に/var/www/html/default
が提供されます。これは、Apacheがどのホストが呼び出されているかを認識しなかったかのようです(ただし、PHPの$_SERVER
のダンプには、期待されるHTTP_Host
値が表示されます。つまり、127.0 .0.1、dummy.devまたはtests.dev(アクセスするURLに応じて異なります)。
私は何を取りこぼしたか?
これがApacheの問題なのかDockerの問題なのか、私にはわかりません。
(これは、同じドメインで異なるポートを使用して複数のアプリをホストする方法とは異なる質問です。私の場合、仮想ホストをすべて同じアプリ/ポート/コンテナー内に配置したいのですが。)
これはApache構成の問題であることがわかりました。
次のように、ドメイン名付きの仮想ホストを明示的に有効にする必要がありました。
NameVirtualHost *:80
Dockerはその問題とは何の関係もありませんでした。
fab/centos
はパブリックDockerハブに存在しないため、問題が発生している理由がわかりません。
私の推奨は、一歩下がって、簡単な例で機能させることです。
docker search Apache
はeboraas/Apache
を最もスター付きの画像として生成するので、例としてそれを使用します。
テストディレクトリで、サンプルを使用します。
ファイル:httpd.conf
<VirtualHost *:80> # first Host = default Host
DocumentRoot /var/www/html/default
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /var/www/html/dummy
ServerName dummy.dev
ServerAdmin [email protected]
ErrorLog logs/dummy.dev-error_log
CustomLog logs/dummy.dev-access_log common
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /var/www/html/tests
ServerName tests.dev
ServerAdmin [email protected]
ErrorLog logs/tests.dev-error_log
CustomLog logs/tests.dev-access_log common
</VirtualHost>
次に、vhost Webサイトとログディレクトリを作成します。
mkdir -p logs; for i in default tests dummy; do mkdir -p $i; echo "hello $i" > $i/index.html; done
最後に、Dockerを実行します。
docker run -it -v $(pwd):/var/www/html -v $(pwd)/httpd.conf:/etc/Apache2/sites-available/000-default.conf -v $(pwd)/logs:/etc/Apache2/logs -p 9090:80 --rm --name Apache_c eboraas/Apache
Httpd.confを変更する代わりにsite-available
を使用することを除いて、基本的にdocker-compose.ymlで使用したのと同じボリュームを使用することに注意してください。
テストするには、/ etc/hostsに適切なDocker IPを指し示すtest.devとdummy.devがあることを確認してテストします。
$> curl dummy.dev:9090
hello dummy
$> curl tests.dev:9090
hello tests
この時点から、最初に使用しているdocker Apacheイメージを試し、次にカスタムの/ etc/hostsファイルを試し、次にdocker-composeファイルに戻します。
Httpd設定でNameVirtualHostをオンにします。
ファイル:/etc/httpd/conf/httpd.conf
NameVirtualHost *:80
NameVirtualHost *:443