gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 21:22:15 26 4
gpt4 key购买 nike

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

我了解 80 端口只能在 Host 上暴露一次。有哪些解决方案具有最小的开销/管理,可以让我简单地在同一主机上运行两个容器(同时仍然允许客户端访问端口 80 上的每个容器)?

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

最佳答案

使用 nginx 反向代理:

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

关于docker - 如何在同一台服务器上托管两个暴露端口 80 的 Docker 容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31822862/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com