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

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

我管理的服务器上用户有自己的网站,可以通过 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

是的,这是可能的。您需要做的是提供几个 80 端口。每个 URL 一个。您可以使用在 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>

答案2

这是可能的。您可以在主服务器中使用 apache(或者更好的是,haproxy、nginx 或 varnish,它们可能比 apache 更有效地执行重定向任务),以重定向到每个容器的 apache 端口。

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

答案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"]

希望这有助于进一步解释这个过程。如果对此有任何疑问,请随时向我提问,我很乐意提供帮助。

问候,

答案4

就我而言,我需要添加SSLProxyEngine 开启ProxyPreserveHost 开启RequestHeader 设置 Front-End-Https “On”到我的 apache 2.4 vhost 文件,因为我想在 docker 容器上启用 SSL。关于本地.主机名.ofDockerHost在我的例子中,运行 Docker 容器的主机服务器的名称是卢卡斯,并且映射到docker容器的443端口是1443(因为端口 443 已被主机服务器中的 apache 使用),所以该行最终变成这样https://卢卡斯: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​​ 应用程序。我认为这也可以在 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

相关内容