web-dev-qa-db-ja.com

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

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

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

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

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

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

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

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

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

12
Cyril N.

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

  1. DNS CNAMEを設定します。
  2. Dockerインスタンスを実行し、ポート80をdocker Hostのポート12345〜12347などにマッピングします。
  3. Docker Hostで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>
12
Jihun

可能です。各コンテナのApacheポートにリダイレクトするために、メインサーバーでApache(または、より適切にはhaproxy、nginx、またはvarnishを使用すると、リダイレクトタスクだけでApacheよりも効率的です)を使用できます。

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

3
gmuslera

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

使用方法の説明が付いた私のdockerイメージをここで参照してください。これにより、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

3
Vect0r

私の場合、SSLProxyEngine OnProxyPreserveHost OnおよびRequestHeader set Front-End-Https "On"をApache 2.4 vhostファイルに設定しました。これは、DockerコンテナでSSLを有効にしたかったためです。 local.hostname.ofDockerHostについて、私の場合、Dockerコンテナーを実行しているホストサーバーの名前はlucasでした、およびDockerコンテナーのポート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とomnibusと呼ばれるものを実行して、Rubyアプリを設定しました。これはできると思います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

1
razor7