按主机名端口重定向到 docker 容器

bod*_*ser 7 dns port redirect hostname docker

我想设置从一台服务器为多个站点提供服务:

1. http://www.example.org => node.js-www (running on port (50000)
2. http://files.example.org => node.js-files (running on port 50001)
Run Code Online (Sandbox Code Playgroud)

直到现在我才发现docker在使用静态ip时进行端口重定向。

实际上可以使用 docker 通过主机名进行端口重定向吗?

我使用免费的亚马逊 EC2 实例。

谢谢博

编辑:我想让多个节点应用程序在同一端口上运行,但提供不同的主机名。

Sla*_*ser 5

GitHub 上有一个很棒的 docker 项目,名为jwilder 的nginx-proxy。这允许您创建一个通过仅将端口 80/443 映射到主机而不是其他容器来执行反向代理的 docker 容器。然后,您所要做的就是为您创建的每个新 Web 容器提供一个新的环境变量VIRTUAL_HOST=some.domain.com

一个例子:

  1. 创建一个新的 nginx-proxy 容器

    docker run -d -p 80:80 --net shared_hosting -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy
    
    Run Code Online (Sandbox Code Playgroud)
  2. 为每个网站创建一个容器。例如:

    docker run -d -p 80 --net shared_hosting -e VIRTUAL_HOST=hello1.domain.com tutum/hello-world
    docker run -d -p 80 --net shared_hosting -e VIRTUAL_HOST=drupal.domain.com drupal
    
    Run Code Online (Sandbox Code Playgroud)
  3. 您需要确保您拥有的主机在 DNS 中配置为指向运行 docker 容器的服务器。在此示例中,我将添加到文件中/etc/hosts

    echo "127.0.0.1 hello1.domain.com drupal.domain.com" >> /etc/hosts
    
    Run Code Online (Sandbox Code Playgroud)
  4. 导航到http://hello1.domain.com,然后访问http://drupal.domain.com,您会发现它们都使用端口 80,但给您提供了不同的页面。

关于此服务的重要说明。正如您所注意到的,我添加了--net参数,这是因为您想要成为共享托管一部分的所有容器(代理和网站)必须位于同一虚拟网络上(这可以由参数或命令--net定义--networkdocker run,特别是当您使用docker-compose创建docker时,因为docker-compose创建了自己的虚拟网络,从而使一个容器无法被另一个容器访问,因此请确保在文件中明确定义网络docker-compose.yml

希望能帮助到你。


Evg*_*kiy 4

据我所知,docker 没有内置这样的功能,也不应该内置这样的功能。为了完成你想要做的事情,你可能需要某种反向代理,所以node.js或nginx就可以了。Bouncy 可能是一个不错的选择:https ://www.npmjs.com/package/bouncy