Dockerを使用してユーザーのWebサイトを分離することは可能ですか?


12

FTP(ホスティング会社のような)でアクセスできる独自のWebサイトがユーザーにあるサーバーを管理し、LAMPスタックプロセスの分離に取り組む代わりに、Dockerを実装してWebサイトごとに画像を使用できるかどうか疑問に思っていました。

私の理解では、ポートを介してDockerインスタンスを公開できるため、同じサーバーで2つのdockerインスタンスを実行する場合、2つの異なるポートを公開する必要があります。

しかし、ポートではなくサーバー名をエクスポートすることは可能ですか?

  • www.somewebsite.com:Dockerインスタンス1
  • www.otherwebsite.com:Dockerインスタンス2
  • www.etc.com:Dockerインスタンス...

そして、同じサーバーで。

サーバー名に基づいてリクエストを専用のDockerインスタンスにリダイレクトするApacheのみをサーバーにインストールすることを考えましたが、その後、DockerインスタンスにApache(再び!)とMySQLをインストールする必要があります。

これは可能ですか、さらに、これはパフォーマンスの面で興味深いですか(まったくそうではありませんか)?

ご協力ありがとうございました。


1
理論的には可能ですが、Apacheは各Dockerインスタンスがリッスンしているポートに対してProxyPassを実行します。
タナシスク14

回答:


12

はい、可能です。必要なのは、80個のポートをいくつか提供することです。各URLに1つ。これは、たとえばDockerホストサーバーで実行されているApacheの仮想ホストを使用して実行できます。

  1. DNS CNAMEを設定します。
  2. Dockerインスタンスを実行し、ポート80をdockerホストの12345〜12347などのポートにマッピングします。
  3. DockerホストでApacheサーバーを実行し、各URLに仮想ホストを設定し、ProxyPassとProxyPassReverseをDockerインスタンスの1つであるlocalhost:12345に設定します。

Apache構成ファイルは次のようになります。

<VirtualHost *:80>
ServerName www.somewebsite.com
  <Proxy *>
    Allow from localhost
  </Proxy>
  ProxyPass        / http://local.hostname.ofDockerHost:12345/
  ProxyPassReverse / http://local.hostname.ofDockerHost:12345/
</VirtualHost>

4
ありがとう!これは大いに役立ちました。また、があるProxyPreserveHost Onので、Webサイト内のlocal.hostname.ofDockerHost:12345への多くのリンクで終わることはありません。私に役立つ情報は次のとおり
セバスチャンラミレス

dockerはデータベースなどへの変更を保存しますか?
-EminezArtus

3

可能です。メインサーバーでapache(またはより良いのはhaproxy、nginxまたはvarnish、それだけのリダイレクトタスクに対してapacheより効率的かもしれません)を使用して、各コンテナのapacheポートにリダイレクトできます。

ただし、そこで実行するサイト(およびそのApache構成)によっては、特に大量のRAMを必要とするモジュール(PHPなど)がある場合、仮想ホストで単一の中央Apacheを使用するよりもはるかに多くのメモリが必要になる場合があります。


ご回答ありがとうございます。実際、私が提供する「ホスティング」サービスには、Prestashop、Wordpressなどが含まれます。そのため、PHPとヘビーエンジンに多く基づいています(ここでPrestashopについて詳しく説明しています)。
シリルN. 14年

1
Docker化された仮想ホスティングシステムは、PHPを独自のDockerコンテナーに分離し、ApacheコンテナーがそのコンテナーをPHP処理に使用することで、よりモジュール化されますか?データベースにも同じことが当てはまりますか?たとえば、Apacheコンテナー(ユーザーWebサイトを含む)へのホストプロキシトラフィックがあり、すべてのPHP処理がPHPコンテナーに送信され、データベースの読み取り/書き込みがMySQLコンテナーに送信されますか?または、PHPはこの方法でリソースをあまり必要としませんか?PHP-FPM、SuPHPなどは、非Docker環境で同じ種類のセットアップを提供しますか?
オジュラスク

コンテナ内のPHP-FPMは、少なくともファイル空間的には冗長なコードになります:code.google.com/p/sna/wiki/NginxWithPHPFPM Apache / Nginxインストールでは、PHPファイルをPHP-FPMコンテナに順番にコピーする必要がありますこのシステムが機能するために。マウントされた共有データコンテナはこの問題を解決しますか?
オジュラスク

コンテナ間でデータ(PHPファイル)を共有する必要がある場合は、ボリュームを使用する方法があります。他のコンテナ(データ専用のコンテナも含む)または実際のファイルシステムからマウントできます。以前は、apacheモジュールはphpコードを実行する最速の方法であり、静的ファイルではなくphp専用であり、静的/キャッシュ可能なコンテンツ(ワニス)を配信するための上位層を持っていることは良い組み合わせです。
-gmuslera

3

これはすでに回答済みですが、さらに一歩進んで、より完全な回答を提供するために、これをどのように行うことができるかの例を示したいと思います。

使用方法については、こちらのドッカーの画像をご覧ください。2つのサイトhttps://hub.docker.com/r/vect0r/httpd-proxy/を構成する方法を示します

jihunが言ったように、vhostの設定を確認する必要があります。私の例では、ポート80を使用してテストサイトexample.comを表示し、81を使用してテストサイトexample2.comを表示しています。また、次のように、コンテンツを指定し、Dockerfileで必要なポートを公開する必要があることに注意することも重要です。

FROM centos:latest
Maintainer vect0r
LABEL Vendor="CentOS"

RUN yum -y update && yum clean all
RUN yum -y install httpd && yum clean all

EXPOSE 80 81

#Simple startup script to aviod some issues observed with container restart
ADD run-httpd.sh /run-httpd.sh
RUN chmod -v +x /run-httpd.sh

#Copy config file across
COPY ./httpd.conf /etc/httpd/conf/httpd.conf
COPY ./example.com /var/www/example.com
COPY ./example2.com /var/www/example2.com
COPY ./sites-available /etc/httpd/sites-available
COPY ./sites-enabled /etc/httpd/sites-enabled

CMD ["/run-httpd.sh"]

これがプロセスをもう少し説明するのに役立つことを願っています。これについての質問がありましたら、お気軽にお問い合わせください。

よろしく、

V


また、この画像の作成に使用するファイルをgithubにアップロードしました。github.com/V3ckt0r/docker-httpd-proxy
Vect0r

1

私の場合、DockerコンテナでSSLを有効にしたかったため、SSLProxyEngine OnProxyPreserveHost Onおよび RequestHeaderを apache 2.4 vhostファイルにFront-End-Https "On"に設定する必要がありました。local.hostname.ofDockerHostについて、私の場合、ドッカーコンテナを実行しているホストサーバーの名前はlucasであり、ドッカーコンテナのポート443にマッピングされたポートは1443でした(ポート443はすでにホストのApacheによって使用されていたため)サーバー)、その行はこのようになりましたhttps:// lucas:1443 /

これが最終的なセットアップであり、正常に機能しています!

<VirtualHost *:443> # Change to *:80 if no https required
    ServerName www.somewebsite.com
    <Proxy *>
        Allow from localhost
    </Proxy>
    SSLProxyEngine On # Comment this out if no https required
    RequestHeader set Front-End-Https "On" # Comment this out if no https required
    ProxyPreserveHost    On
    ProxyPass        / http://local.hostname.ofDockerHost:12345/
    ProxyPassReverse / http://local.hostname.ofDockerHost:12345/
</VirtualHost>

最後に、DockerコンテナでプロキシSSLヘッダーを設定する必要がありました。私の場合、コンテナーはnginxと、rubyアプリをセットアップするためのomn​​ibusと呼ばれるものを実行していました。これはnginxの設定ファイルでも設定できると思います。誰かがこれが役立つと思う場合に備えて、それを書き留めます

nginx['redirect_http_to_https'] = true
nginx['proxy_set_headers'] = {
    "Host" => "$http_host",
    "X-Real-IP" => "$remote_addr",
    "X-Forwarded-For" => "$proxy_add_x_forwarded_for",
    "X-Forwarded-Proto" => "https",
    "X-Forwarded-Ssl" => "on"
}
nginx['real_ip_trusted_addresses'] = ['10.0.0.77'] # IP for lucas host
nginx['real_ip_header'] = 'X-Real-IP'
nginx['real_ip_recursive'] = 'on'

Apache、ISP Config、Ubuntuサーバー16.04の完全なガイドはこちらhttps://www.howtoforge.com/community/threads/subdomain-or-subfolder-route-requests-to-running-docker-image.73845/#post-347744

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.