如何在同一台服务器上托pipe两个暴露端口80的Docker容器
我有2个网站,客户端需要连接到端口80.每个网站运行在自己的容器。 我想在同一个Docker主机上运行这两个容器。
我知道端口80只能在主机上暴露一次。 有什么解决scheme有最小的开销/pipe理,这将允许我简单地运行在同一个主机上的两个容器(虽然仍然允许客户端到达每个容器在端口80)?
网站1和网站2都应该出现在客户端80上的networking浏览器,并且具有友好的URL(即:www.web1.com,www.web2.com)
使用nginx反向代理 :
- 在主机上安装Nginx 。 在Debian / Ubuntu上:
apt-get install nginx
。 注意:我假设你没有Apache或主机上的其他Web服务器已经… - 对于每个站点,在
/etc/nginx/sites-available
目录中写入一个nginx站点文件,将该站点redirect到将在其他一些预先安排的端口(例如2001,2002,…)上运行的docker容器的http。 每个站点都有自己的文件,如下所示,但每个站点都有不同的预先安排的端口。 外部用户将在同一个IP地址的80端口上访问这些端口,但使用不同的网站名称,并且从这些名称中,nginx将不可见地处理必要的内部连接。 - 符号链接站点文件,以便它们显示在
/etc/nginx/sites-enabled
然后重新启动nginx
。 稍后,如果您需要暂时禁用对网站的访问,则可以删除其中一个链接并重新启动nginx。 - 通过将
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文件的本地磁盘目录,但未使用该目录。 相反,所有请求都被发送到上游。 我还没有testingroot
和index
行是否可以安全省略。
使用docker,docker-compose和nginx-proxy在单个主机上托pipe多个网站的更合适的方法: https : //blog.florianlopes.io/host-multiple-websites-on-single-host-docker/
- 如何使用pip从需求文件安装pkg,无需重新安装
- 如何使用Jenkins Pipeline插件启用SCM轮询
- 无法在Amazon EC2上通过Java运行mysql命令行。 只在本地工作的Docker应用程序
- 重新启动与在Docker上构build容器
- docker集装箱之间的通信故障
- bluemix容器组中的intermediate_ip_address和private_ip_address之间的区别
- 请求URL中没有主机 – docker组成up -d
- 如何configurationdocker容器在启动时运行/ usr / sbin / sshd
- 泊坞窗构buildapt-get更新失败与自定义networking