我有 2 个网站,客户端需要在端口 80 上连接到。每个网站都在自己的容器中运行。我想在同一台 Docker 主机上运行这两个容器。
据我所知,80端口只能在主机上暴露一次。存在哪些具有最小开销/管理的解决方案,允许我在同一主机上简单地运行两个容器(同时仍然允许客户端访问端口 80 上的每个容器)?
网站 1 和网站 2 都应该在端口 80 上向客户端 Web 浏览器显示,并且具有友好的 URL(即:www.web1.com、www.web2.com)
Use an nginx 反向代理:
- install Nginx http://nginx.org/en/在主机上。在 Debian/Ubuntu 上:
apt-get install nginx
。注意:我假设你的主机上还没有 apache 或其他一些 Web 服务器......
- 对于每个站点,在目录中写入一个 nginx 站点文件
/etc/nginx/sites-available
将该站点重定向到 docker 容器的 http,该容器将在其他一些预先安排的端口上运行(例如,2001、2002,...)。每个站点都有自己的文件,如下所示,但每个站点都有不同的预先安排的端口。外部用户将通过相同 IP 地址但具有不同网站名称的 80 端口访问这些内容,并且 nginx 将通过这些名称无形地处理必要的内部连接。
- 符号链接站点文件,以便它们显示在目录中
/etc/nginx/sites-enabled
并重新启动nginx
。稍后,如果您需要暂时禁用对某个站点的访问,您可以删除这些链接之一并重新启动 nginx。
- 通过添加在系统重新启动时启动容器
docker run
命令到/etc/rc.local
,并将预先安排的主机端口(localhost:2001)重定向到容器端口80,例如docker run -d -p localhost:2001:80 imageA
如果容器关闭,您将从 nginx 收到网关错误。可以对其进行自定义以显示自定义 HTML 页面。为了更加稳健,最好在以下位置管理容器:supervisord
或其他一些重生死进程的进程管理器。
以下是重定向到端口 2001 的 nginx 站点文件示例:
upstream dockerA {
server localhost:2001;
}
server {
listen 192.168.1.8:80; // REPLACE WITH HOST NUMERIC IP ADDRESS
root /var/web/siteAstaticfiles;
index index.html;
server_name www.siteA.com;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://dockerA;
}
}
本例中,虽然为站点A设置了HTML文件的本地磁盘目录,但并未使用。相反,所有请求都会发送到上游。我没有测试过是否root
and index
可以安全地省略行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)