如何托管在同一服务器上公开端口80的两个Docker容器

时间:2015-08-05 03:19:28

标签: docker

我有两个客户端需要连接到端口80的网站。每个网站都在自己的容器中运行。我想在同一个Docker主机上运行这两个容器。

据我所知,端口80只能在主机上公开一次。有哪些解决方案具有最小的开销/管理,允许我在同一主机上简单地运行两个容器(同时仍然允许客户端到达端口80上的每个容器)?

网站1和网站2都应该在客户端上显示端口80上的Web浏览器并且具有友好的URL(即:www.web1.com,www.web2.com)

2 个答案:

答案 0 :(得分:12)

使用 nginx反向代理

  1. 在主机上安装Nginx。在Debian / Ubuntu上:apt-get install nginx。注意:我假设您已经在主机上没有apache或其他Web服务器......
  2. 对于每个站点,在目录/etc/nginx/sites-available中编写nginx站点文件 将该站点重定向到docker容器的http,该http将在其他预先安排的端口上运行(例如,2001,2002,...)。每个站点都有自己的文件,如下所示,但每个站点都有不同的预先安排的端口。外部用户将在相同IP地址但具有不同网站名称的端口80访问这些,并且从这些名称中,nginx将无形地处理必要的内部连接。
  3. 对站点文件进行符号链接,以便它们显示在目录/etc/nginx/sites-enabled中并重新启动nginx。稍后,如果您需要暂时禁用对站点的访问,则可以删除其中一个链接并重新启动nginx。
  4. 通过向docker run添加/etc/rc.local命令并将预先安排好的主机端口(localhost:2001)重定向到容器端口80,例如,在系统重新启动时启动容器。 docker run -d -p localhost:2001:80 imageA
  5. 如果容器关闭,您将从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文件的本地磁盘目录,但未使用它。而是将所有请求发送到上游。我还没有测试是否可以安全地省略rootindex行。

答案 1 :(得分:0)

使用docker,docker-compose和nginx-proxy在单个主机上托管多个网站的更合适的方法: https://blog.florianlopes.io/host-multiple-websites-on-single-host-docker/

相关问题