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


12

我管理的服务器上用户拥有自己的网站,可以通过FTP访问该服务器(例如托管公司),而不是孤立LAMP堆栈进程,我想知道是否可以实现Docker并在每个网站上使用映像。

据我了解,您可以通过其端口公开Docker实例,因此,如果您在同一服务器上运行两个Docker实例,则必须公开两个不同的端口。

但是是否可以导出端口而不是服务器名称,例如:

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

而且,在同一服务器上。

我考虑过仅在服务器上安装Apache,这将根据服务器名称将请求重定向到专用Docker实例,但是随后我将不得不在任何Docker实例上安装Apache(再次!)和MySQL。

此外,是否有可能在性能方面(或根本没有)有趣?

谢谢您的帮助。


1
从理论上讲,Apache可能会对每个Docker实例正在侦听的端口执行ProxyPass。
thanasisk 2014年

Answers:


12

对的,这是可能的。您需要做的是提供几个80端口。每个网址一个。您可以使用例如在Docker主机服务器上运行的Apache虚拟主机来执行此操作。

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

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,因此您最终不会获得指向您网站的local.hostname.ofDockerHost:12345的大量链接。这是对我有用的更多信息:digitalocean.com/community/tutorials/…–
塞巴斯蒂安·拉米雷斯

码头工人将更改保存到数据库等吗?
EminezArtus

3

有可能的。您可以在主服务器中使用apache(或更好的haproxy,nginx或varnish,它们可能比apache效率更高,仅用于重定向任务)重定向到每个容器的apache端口。

但是,取决于在此运行的站点(及其apache配置),它可能比使用带有虚拟主机的单个中央apache需要更多的内存,特别是如果您有需要大量RAM的模块(例如php)。


谢谢您的回答。实际上,我将提供的“托管”服务包括诸如Prestashop,Wordpress等之类的东西,因此,它基于PHP和重型引擎(我在这里更多地谈论Prestashop)。
西里尔N.14年

1
通过将PHP分离到自己的Docker容器中并使Apache容器使用该容器进行PHP处理,是否可以更好地模块化Dockerized虚拟主机系统?数据库是否也一样?例如,是否具有到Apache容器(包含用户网站)的主机代理流量,该容器又将所有PHP处理发送到PHP容器,而数据库对MySQL容器进行读/写操作?还是这样会减少PHP的资源消耗?PHP-FPM,SuPHP或类似产品是否可以在非Docker环境中提供相同类型的设置?
ojrask 2015年

容器中的PHP-FPM至少在文件空间方面有点冗余:code.google.com/p/sna/wiki/NginxWithPHPFPM Apache / Nginx安装需要按顺序将PHP文件复制到PHP-FPM容器中为该系统工作。挂载的共享数据容器是否可以解决此问题?
ojrask 2015年

如果您需要在容器之间共享数据(即php文件),则可以使用卷,您可以从其他容器(甚至有专用数据的容器)或实际文件系统中挂载它们。apache模块曾经是运行php代码的最快方法,只有一个仅用于php,而不是静态文件,并且具有上层来传递静态/可缓存内容(即varnish)可能是一个很好的组合。
gmuslera 2015年

3

我知道已经回答了这个问题,但是我想更进一步,并向您展示如何完成此操作的示例,以提供更完整的答案。

请在此处查看我的docker映像以及有关如何使用它的说明,这将向您展示如何配置两个站点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

在我的情况下,我需要向我的apache 2.4 vhost文件添加SSLProxyEngine OnProxyPreserveHost OnRequestHeader将Front-End-Https设置为“ On”,因为我想在docker容器上启用SSL。关于local.hostname.ofDockerHost,在我的情况下,运行docker容器的主机服务器的名称为lucas,映射到docker容器的端口443的端口为1443(因为主机中的apache已在使用端口443服务器),因此该行以这种方式结束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应用程序。我认为这也可以在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配置,Ubuntu服务器16.04的完整指南,请参见此处https://www.howtoforge.com/community/threads/subdomain-or-subfolder-route-requests-to-running-docker-image.73845/#post-347744

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.