我希望设置多个 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_shockley
并beta.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 所独有的。)