在單一 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 獨有的。

相關內容