web-dev-qa-db-ja.com

1つの同じDockerコンテナー上の複数の仮想ホスト

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の問題なのか、私にはわかりません。

(これは、同じドメインで異なるポートを使用して複数のアプリをホストする方法とは異なる質問です。私の場合、仮想ホストをすべて同じアプリ/ポート/コンテナー内に配置したいのですが。)

7

これはApache構成の問題であることがわかりました。

次のように、ドメイン名付きの仮想ホストを明示的に有効にする必要がありました。

NameVirtualHost *:80

この答えは役に立ちました。

Dockerはその問題とは何の関係もありませんでした。

3

fab/centosはパブリックDockerハブに存在しないため、問題が発生している理由がわかりません。

私の推奨は、一歩下がって、簡単な例で機能させることです。

docker search Apacheeboraas/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ファイルに戻します。

2
creack

Httpd設定でNameVirtualHostをオンにします。

ファイル:/etc/httpd/conf/httpd.conf

NameVirtualHost *:80 
NameVirtualHost *:443
0