単一の Ubuntu サーバー上で Docker の複数のコンテナに一意のパブリック ホスト名を付与する

単一の Ubuntu サーバー上で Docker の複数のコンテナに一意のパブリック ホスト名を付与する

Kubernetes の手間をかけずに、単一のマシン上で異なるホスト名を提供するために複数の Docker コンテナをセットアップしたいと考えています。

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.comnostalgic_shockleybeta.xyzhigh_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が、それでもコンテナーにアクセスできませんでした。

また、ドメイン管理パネルで、このホストの IP アドレスのa レコードを設定するだけでよいのでしょうかalpha.xyz.com?beta.xyz.com

答え1

どうやら、あなたは間違った方向に進んでいるようです。内部 Docker ネットワークは、ホストの外部ネットワークには表示されません。ホストはトラフィックをルーティングする必要があります。

通常は外部からの接続を許可したいでしょう何らかのサービスに(つまり、ほとんどの場合、TCP ポート) を Docker コンテナ内に配置します。

HTTP について話していて、両方のコンテナにポート 80 (または 443) が必要な場合、両方に転送できないため、外部インターフェイスからポートをルーティングするほど簡単ではありません。したがって、私が推奨する解決策は、ホスト マシン上の Apache で、2 つの異なる DNS 名に対して 2 つの vhost を使用して名前ベースの仮想ホスティングを実行し、トラフィックをそれぞれの Docker コンテナに転送することです。

ところで、外部ネットワークから Docker コンテナにマップするポートが異なる場合は、iptables ベースの転送やホスト ポート マッピングなど、より単純な (ネットワークベースの) 方法が機能します。

答え2

また、ドメイン管理パネルで、alpha.xyz.com と beta.xyz.com の a レコードをこのホストの IP アドレスに設定するだけでよいのでしょうか?

ドメイン管理パネルは、皮切りに。Docker もコンテナ自体も何もないところからサブドメインを作成することはできません。まず DNS サービス プロバイダー内でサブドメインを作成する必要があります。

これが完了すると、Docker ホストは Docker が提供するあらゆる機能 (iptables TCP/UDP ポート転送など) を使用してパケットを適切なコンテナーにルーティングできるようになります。または、リバース プロキシを使用して HTTP 要求をルーティングすることもできます。

これを機能させるためにコンテナのホスト名を変更する必要はありません。


(技術的には、DNS はプロトコル内での動的登録をサポートしていますが、ほとんどのサービス プロバイダーはそれをまったくサポートしていないか、標準の DNS 機能ではなくカスタム API の使用を要求しています。

それに加えて、マシンには DNS プロバイダーで認証する方法が必要ですが、そのための優れた汎用システムはありません。結果として、このような自動サブドメイン作成は、実際には Active Directory にほぼ限定されています。

関連情報