
我希望設定多個 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 獨有的。