在单个 Ubuntu 服务器上为 Docker 多个容器提供唯一的公共主机名

在单个 Ubuntu 服务器上为 Docker 多个容器提供唯一的公共主机名

我希望设置多个 Docker 容器来在一台机器上提供不同的主机名,而无需 Kubernetes 的麻烦。

CONTAINER ID        IMAGE               COMMAND             STATUS              NAMES
673394ef1d4c        busybox             "top"               Up 45 seconds       nostalgic_shockley
d85756f57265        busybox             "top"               Up 51 seconds       high_albattani

假设我有一些域xyz.com;我想要alpha.xyz.com路由到nostalgic_shockleybeta.xyz路由到high_albattani

我查看了一下/etc/hostname,它有一些本地主机名。

root@saag:/home/root# cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.4 LTS (Bionic Beaver)"
...
root@saag:/home/root# cat /etc/hostname
saag
...
root@saag:/home/root# cat /etc/hosts
127.0.0.1 localhost

# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts

我甚至尝试将主机名分配给各个 Docker IP 地址,/etc/hostname但仍然无法访问容器。

alpha.xyz.com另外,在我的域管理面板中...我是否应该简单地为该beta.xyz.com主机的 IP 地址设置 a 记录?

答案1

不知怎的,我觉得你走错了路。内部 Docker 网络未在主机的外部网络上显示。主机必须路由流量。

通常你会希望允许来自外界的连接对某些服务(即大多数情况下是 tcp 端口)在 docker 容器内。

如果您谈论的是 HTTP,并且希望两个容器都使用端口 80(或 443),那么将端口从外部接口路由到它们就不那么简单了,因为您无法将其转发到两个容器。因此,我首选的解决方案是在主机上使用 Apache 进行基于名称的虚拟托管,为两个不同的 DNS 名称设置两个虚拟主机,并将流量转发到各自的 Docker 容器。

顺便说一句:如果您需要将不同的端口从外部网络映射到 Docker 容器,则可以使用一些更简单(基于网络)的方法,例如一些基于 iptables 的转发或主机端口映射。

答案2

另外,在我的域名管理面板中...我是否应该简单地将 alpha.xyz.com 和 beta.xyz.com 的 a 记录设置为该主机的 IP 地址?

域名管理面板是你应该从...开始。Docker 和容器本身都无法无中生有地创建子域;必须首先在 DNS 服务提供商内创建子域。

完成后,Docker 主机可以使用 Docker 提供的任何设施(我假设是 iptables TCP/UDP 端口转发)将数据包路由到正确的容器 - 或者您可以使用反向代理路由 HTTP 请求。

您不需要更改容器主机名即可实现此功能。


(从技术上讲,DNS 确实支持协议内的动态注册,但大多数服务提供商要么根本不支持它,要么要求使用其自定义 API 而不是标准 DNS 设施。

除此之外,机器还需要有一种方式来与 DNS 提供商进行身份验证,而目前还没有很好的通用系统。因此,实际上这种自动子域创建几乎是 Active Directory 所独有的。)

相关内容