Docker Swarmでサービスをデプロイするために遊んでいます。コンテナーを別のノードのコンテナーに一貫して接続させるのに問題があります。
GlusterFSプールを構築しているとしましょう。各コンテナーでターミナルを開き、glusterデーモンをプールに追加する必要があります。プール内の他のコンテナーを参照するにはどうすればよいですか?現在IPアドレスを使用していますが、コンテナーが停止して再作成された場合はどうなりますか?私の知る限り、新しいコンテナが同じIPアドレスを持つことは保証されていません。組み込みDNSサーバーを使用して他のコンテナーを参照することもできますが、コンテナー名とコンテナーIDをIPアドレスに解決することしかできないようで、コンテナーが停止して再作成されると、両方とも変更されるため、意味がありません。
他のコンテナのhostnamesをIPアドレスに解決できないのですか?私はそうすることを想定しましたが、そうではありません。
私の難問に対する解決策はありますか? (私はすべて間違ってサービスを使用しようとしていると感じ、この場合は各ノードで手動でコンテナーを作成する必要があると感じます。)
正確な状況に応じて、さまざまなソリューションを使用する必要があります。
サービス内のホスト名解決
問題:同じサービス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}}
など)を使用してホスト名を設定すると、ホスト名がローカルで予測可能になりますが、他のコンテナでは解決できません。
サービス間ホスト名解決
問題:異なるサービスserviceX
、serviceY
の複数のコンテナーがあります。ただし、サービスごとにコンテナは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
で解決できると確信できます。
参照: