我管理的服务器上用户有自己的网站,可以通过 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 虚拟主机来执行此操作。
- 设置 DNS CNAME。
- 运行docker实例并将其端口80映射到docker主机的端口12345~12347。
- 在 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