是否有可能使用Docker为用户分离网站?

我pipe理服务器,用户有自己的网站,可以通过FTP访问(如托pipe公司),而不是孤立的LAMP堆栈进程的工作,我想知道是否有可能实现docker和使用每个网站的图像。

据我所知,你可以通过他们的端口暴露Docker实例,所以如果你在同一台服务器上运行两个docker实例,你将不得不公开两个不同的端口。

但有可能导出不是端口,而是服务器名称,如:

  • www.somewebsite.com:Docker实例1
  • www.otherwebsite.com:Docker实例2
  • www.etc.com:Docker实例…

而且,在同一台服务器上。

我想在服务器上只安装Apache,这会根据服务器名称将请求redirect到专用的Docker实例,但是我必须在任何Docker实例上安装Apache(也是!)和MySQL。

这是可能的,此外,这是performance有趣(或根本没有)?

感谢您的帮助。

是的,这是可能的。 你需要做的是提供几个80端口。 每个url一个。 您可以使用,例如在Docker主机服务器上运行的Apache的虚拟主机。

  1. 设置DNS CNAME。
  2. 运行docker实例并将其端口80映射到docker主机的端口12345〜12347。
  3. 在Docker主机上运行Apache服务器,并为每个URL设置一个虚拟主机,并将ProxyPass和ProxyPassReverse设置为localhost:12345,这是您的一个docker实例。

Apacheconfiguration文件将如下所示:

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

有可能的。 你可以在主服务器上使用apache(或者更好,haproxy,nginx或varnish,可能比apache更有效)redirect到每个容器的apache端口。

但是,根据你在那里运行的站点(和他们的apacheconfiguration),这可能需要比使用虚拟主机的单个中央apache更多的内存,特别是如果你有需要大量RAM的模块(即php)。

我知道这已经得到了答案,但我想进一步向你展示一个如何做到这一点的例子,以提供更完整的答案。

请在这里查看我的Docker镜像,并说明如何使用它,这将向您展示如何configuration两个站点https://hub.docker.com/r/vect0r/httpd-proxy/

正如jjhun所说的,你必须确定你的vhostconfiguration已经设置好了。 我的例子使用端口80来显示testing站点example.com和81来显示testing站点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

在我的情况下,我需要添加SSLProxyEngineProxyPreserveHostRequestHeader设置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和所谓的omn​​ibus设置的Ruby应用程序。 我认为这也可以在nginxconfiguration文件中设置。 会写下来,以防万一有人觉得这有帮助

 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的configuration,Ubuntu服务器16.04在这里https://www.howtoforge.com/community/threads/subdomain-or-subfolder-route-requests-to-running-docker-image.73845/#post-347744