如何在同一台服务器上托pipe两个暴露端口80的Docker容器

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

我知道端口80只能在主机上暴露一次。 有什么解决scheme有最小的开销/pipe理,这将允许我简单地运行在同一个主机上的两个容器(虽然仍然允许客户端到达每个容器在端口80)?

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

使用nginx反向代理

  1. 在主机上安装Nginx 。 在Debian / Ubuntu上: apt-get install nginx 。 注意:我假设你没有Apache或主机上的其他Web服务器已经…
  2. 对于每个站点,在/etc/nginx/sites-available目录中写入一个nginx站点文件,将该站点redirect到将在其他一些预先安排的端口(例如2001,2002,…)上运行的docker容器的http。 每个站点都有自己的文件,如下所示,但每个站点都有不同的预先安排的端口。 外部用户将在同一个IP地址的80端口上访问这些端口,但使用不同的网站名称,并且从这些名称中,nginx将不可见地处理必要的内部连接。
  3. 符号链接站点文件,以便它们显示在/etc/nginx/sites-enabled然后重新启动nginx 。 稍后,如果您需要暂时禁用对网站的访问,则可以删除其中一个链接并重新启动nginx。
  4. 通过将docker run命令添加到/etc/rc.local ,并将预先安排的主机端口(localhost:2001)redirect到容器端口80,例如docker run -d -p localhost:2001:80 imageA ,启动系统重新启动容器

如果一个容器closures,你会从nginx得到一个网关错误。 这可以定制显示一个自定义的HTML页面。 为了更健壮,最好pipe理supervisord的容器或其他一些重新生成死进程的进程pipe理器。

下面是一个redirect到端口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; } } 

在此示例中,尽pipe为站点A设置了用于HTML文件的本地磁盘目录,但未使用该目录。 相反,所有请求都被发送到上游。 我还没有testingrootindex行是否可以安全省略。

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