web-dev-qa-db-ja.com

Docker Swarm内の別のコンテナーのIPを適切に解決するにはどうすればよいですか? (DNS)

Docker Swarmでサービスをデプロイするために遊んでいます。コンテナーを別のノードのコンテナーに一貫して接続させるのに問題があります。

GlusterFSプールを構築しているとしましょう。各コンテナーでターミナルを開き、glusterデーモンをプールに追加する必要があります。プール内の他のコンテナーを参照するにはどうすればよいですか?現在IPアドレスを使用していますが、コンテナーが停止して再作成された場合はどうなりますか?私の知る限り、新しいコンテナが同じIPアドレスを持つことは保証されていません。組み込みDNSサーバーを使用して他のコンテナーを参照することもできますが、コンテナー名とコンテナーIDをIPアドレスに解決することしかできないようで、コンテナーが停止して再作成されると、両方とも変更されるため、意味がありません。

他のコンテナのhostnamesをIPアドレスに解決できないのですか?私はそうすることを想定しましたが、そうではありません。

私の難問に対する解決策はありますか? (私はすべて間違ってサービスを使用しようとしていると感じ、この場合は各ノードで手動でコンテナーを作成する必要があると感じます。)

7
Hubro

正確な状況に応じて、さまざまなソリューションを使用する必要があります。

サービス内のホスト名解決

問題:同じサービスserviceXの複数のコンテナ(/レプリカ)があります。例:

  • コンテナa1b3d130275a、ホスト名serviceX.1.nq4rjbae
  • コンテナ65040b1cada6、ホスト名serviceX.2.m9wl1f1r
  • コンテナ944704427b9e、ホスト名serviceX.3.3d08baql

次に、2番目のコンテナ(serviceX.2.m9wl1f1r)と3番目のコンテナ(serviceX.3.3d08baql)のホスト名を、コンテナ1(serviceX.1.nq4rjbae)内から取得します。

Dockerはtasks.$serviceNameに対してDNSクエリを使用して、 コンテナディスカバリ と呼ばれるソリューションを提供します。例:

nslookup tasks.serviceX
[...]
Name:      tasks.serviceX
Address 1: 10.0.0.205 a1b3d130275a  (<- resolved locally by /etc/hosts)
Address 2: 10.0.0.206 serviceX.2.m9wl1f1r
Address 3: 10.0.0.207 serviceX.3.3d08baql

serviceX.{1,2,3}を解決可能にして、予測可能なホスト名を作成することについても議論されています。しかし、現時点では、これらのどれも実装されていないため、このソリューションは実行時にのみ機能します。

注:テンプレート機能(docker service create ... --hostname {{.Service.Name}}.{{.Task.Slot}}など)を使用してホスト名を設定すると、ホスト名がローカルで予測可能になりますが、他のコンテナでは解決できません。

サービス間ホスト名解決

問題:異なるサービスserviceXserviceYの複数のコンテナーがあります。ただし、サービスごとにコンテナは1つだけです。例:

  • コンテナa1b3d130275a、ホスト名serviceX.1.nq4rjbae
  • コンテナ65040b1cada6、ホスト名serviceY.2.m9wl1f1r

また、1つのサービス(serviceX)から別のサービス(serviceY)のコンテナーに接続したり、逆の場合も同様です。 --nameパラメータを使用するだけです。

docker service create --name=serviceX serviceX
docker service create --name=serviceY serviceY

そして、コンテナa1b3d130275aはホスト名serviceXで解決でき、コンテナ65040b1cada6はホスト名serviceYで解決できると確信できます。

参照:

7
Murmel