ホスト間でDockerサービスをリンクする方法は?


115

Docker 使用すると、複数のコンテナのサーバーがリンクとサービスディスカバリを介して相互に接続できます。ただし、このサービスの発見はホストローカルであることがわかります。別のマシンでホストされている他のサービスを使用するサービスを実装したいと思います。

CoreOSのような、Dockerでこの問題を解決するためのいくつかのアプローチがありましたjumpers、本質的に他のマシンにプロキシするホストローカルサービス、およびこのユースケースをサポートしようとしたと思われるDockerデプロイメントを管理するための多数のgithubプロジェクト。

開発のペースを考えると、現在のベストプラクティスを理解することは困難です。したがって、私の質問は本質的に:

  1. Dockerのホスト間でリンクするための現在の主な方法は(もしあれば)
  2. この機能をDockerシステムで直接サポートする計画はありますか?

回答:


58

更新

Dockerは最近、Dockerオーケストレーション用のSwarmと呼ばれる新しいツールを発表しました。

群れ使用すると、複数のdockerデーモンを「結合」できます。最初にswarmを作成し、1台のマシンでswarm managerを起動し、swarmの識別子を使用してdockerデーモンにswarm managerを「結合」させます。Dockerクライアントは、通常のDockerサーバーであるかのようにSwarm Managerに接続します。

Swarmで開始されたコンテナは、定義されている制約を満たすフリーノードに自動的に割り当てられます。次の例はブログ投稿からの抜粋です。

$ docker run -d -P -e constraint:storage=ssd mysql

サポートされている制約の1つは、"node"コンテナーを特定のホスト名に固定できることです。スウォームは、ノード間のリンクも解決します。

私のテストでは、スウォームという印象を受けましたはまだ固定された場所にあるボリュームでうまく機能していない(または、少なくともそれらをリンクするプロセスは直感的ではない)ので、これは覚えておくべきことです。

Swarmは現在ベータ段階です。


最近まで、アンバサダーパターンは、リモートホストサービスの検出に対する唯一のDockerネイティブアプローチでした。このパターンは引き続き使用でき、プロキシとして機能する1つ以上の追加のコンテナーでパターンが構成されるという点で、プレーンなDockerを超える魔法を必要としません。

さらに、Dockerをクラスター対応にするためのサードパーティの拡張機能がいくつかあります。サードパーティのソリューションには次のものがあります。

  • 2つのホストでDockerネットワークブリッジを接続する場合、軽量でさまざまなソリューションが存在しますが、一般的にいくつかの注意点があります
  • DNSベースのディスカバリー(例:skydockおよびSkyDNS)
  • ShipyardなどのDocker管理ツール、およびDockerオーケストレーションツール。広範なリストについては、この質問を参照してください:本番環境でDockerコンテナーをスケーリングする方法

2
したがって、基本的に、アンバサダーパターンを含まない、またはDockerをバイパスしてlxcと直接通信しない、ホスト間でコンテナーをリンクする方法はありませんか?
user3012759

@ user3012759アンバサダーパターンは確立された唯一のネイティブな方法ですが、Swarm(アルファ版)は、Dockerスケジューラーを置き換えることで機能するもう1つのネイティブな方法です。返事が遅くなってごめん。
14

SkyDockには(まだ:03/2015)マルチホストのサポートは含まれていません登録者(SkyDNSと連携できる単純なプロジェクト)は機能しますが、構成はより手動です(サービスはポートをホストポートにマップする必要があります)。
turtlemonvh 2015年

6
swarmの大まかな調査では、ホスト間の接続ではなく、クラスター管理に焦点を当てていることが示唆されています。この欠点は、Docker自身のデモyoutube.com/watch?v=M4PFY6RZQHQ&t=3m37s
Bruno Bronoskyに5

1
ドッカーが発表された@lyschoening ネットワーキングネイティブマルチホストあなたはあなたの答えを更新したいかもしれませんが
Thomasleveil

15

アップデート3

Libswarmはswarmに名前が変更され、現在は個別のアプリケーションです。

以下は、開始点として使用するgithubページのデモです。

# create a cluster
$ swarm create
6856663cdefdec325839a4b7e1de38e8

# on each of your nodes, start the swarm agent
#  <node_ip> doesn't have to be public (eg. 192.168.0.X),
#  as long as the other nodes can reach it, it is fine.
$ swarm join --token=6856663cdefdec325839a4b7e1de38e8 --addr=<node_ip:2375>

# start the manager on any machine or your laptop
$ swarm manage --token=6856663cdefdec325839a4b7e1de38e8 --addr=<swarm_ip:swarm_port>

# use the regular docker cli
$ docker -H <swarm_ip:swarm_port> info
$ docker -H <swarm_ip:swarm_port> run ... 
$ docker -H <swarm_ip:swarm_port> ps 
$ docker -H <swarm_ip:swarm_port> logs ...
...

# list nodes in your cluster
$ swarm list --token=6856663cdefdec325839a4b7e1de38e8
http://<node_ip:2375>

アップデート2

公式のアプローチは、libswarmを使用することです。ここでデモを参照してください

更新

同じアプローチを使用するdockerでのopenvswitchホスト通信には素晴らしい要点があります。

サービス検出を可能にするために、skydockと呼ばれるDNSに基づく興味深いアプローチがあります。

スクリーンキャストもあります。


これも同じパズルのピースを使用したすばらしい記事ですが、上にvlanも追加しています。

http://fbevmware.blogspot.it/2013/12/coupling-docker-and-open-vswitch.html

パッチの適用は、ソリューションの堅牢性とは関係ありません。Dockerは実際にはLinuxコンテナー上の一種のDSLであり、これらの記事の両方のソリューションは、単にDocker自動設定をバイパスし、直接Linuxコンテナーにフォールバックします。

したがって、ソリューションを安全に使用し、Dockerが実装したら、より簡単な方法で実行できるようになるのを待つことができます。


2
最近libswarmであまり活動がありません。Dockerチームは別の方向に進んでいるのでしょうか。
ラマン

12

Weaveは、TCP / UDP上の仮想イーサネットスイッチとして機能する新しいDocker仮想ネットワークテクノロジーです。必要なのは、ホストでWeaveを実行しているDockerコンテナーだけです。

ここで興味深いのは

  • リンクの代わりに、仮想ネットワークで静的IP /ホスト名を使用します
  • ホストは完全な接続性を必要とせず、利用可能なピアに基づいてメッシュが形成され、パケットは、必要な場所にマルチホップでルーティングされます

これは、次のような興味深いシナリオにつながります

  • WANを介して仮想ネットワークを作成します。Dockerコンテナーは、実際のネットワークがどのネットワークにあるかを認識したり気にしたりしません
  • コンテナーを別の物理的なDockerホストに移動すると、Weaveはそれに応じてピアを検出します

たとえば、ラップトップといくつかのクラウド(EC2)ホストでホストごとに2つのコマンドを使用してマルチノードのCassandraクラスターを作成する方法のサンプルガイドがあります。AWS CloudFormationを使用してCoreOSクラスターを起動し、/ home / coreのそれぞれにweaveをインストールし、さらにラップトップのvagrant docker VMをインストールして、1時間以内にクラスターを立ち上げました。私のラップトップはファイアウォールで保護されていますが、Weaveはそれで問題ないようです。EC2ピアに接続するだけです。


私が理解しているところでは、weaveはサービス接続のためコンテナーで機能するネットワークオーバーレイであり、swarmはインフラストラクチャオーケストレーション用のDocker CLIを拡張するクラスター化テクノロジーです。インフラ接続は、スウォームの外で(たとえば、通常のスイッチを使用して)、サービスオーケストレーションを織りの外で(たとえば、Mesos / Kubernetesを使用して)行う必要があります。これは、それがどのように機能するかについてのあなたの考えと一致しますか?
Henrik

ここに私がそれを見る方法があります:docker composeはコンテナーのリンクとオーケストレーションについてであり、docker swarmは多くのdockerホスト、socketplane(現在dockerが所有している)でのdockerの実行についてであり、weaveは両方がオーバーレイネットワークです。Socketplaneは、VMのオーバーレイ(openstackなど)で一般的に使用されるopenvswitchに基づいています。一方、織りはドッカーのみです。これらすべての中で、Mesos / Kubernetes / Latticeは、Docker CLIとは多少異なるユーザーエクスペリエンスとスケーラビリティレベルを備えたdocker swarmに代わるものです。
Stuart Charlton

7

更新

Docker 1.12には、いわゆるスウォームモードが含まれており、service抽象化も追加されています。おそらくすべてのユースケースに対応できるほど成熟しているわけではありませんが、監視することをお勧めします。スウォームモードは、少なくともマルチホストセットアップで役立ちますが、必ずしもリンクが容易になるわけではありません。Docker内部DNSサーバー(1.11以降)は、コンテナー名がよく知られている場合、それらにアクセスするのに役立つはずです。つまり、Swarmコンテキストで生成された名前は簡単にアドレス指定できません。


Docker 1.9リリースでは、マルチホストネットワークが組み込まれています。また、稼働中のクラスターを簡単にプロビジョニングするためのサンプルスクリプトも提供します。

すべてのホスト上の異なるDockerエンジン間で状態を共有できるK / Vストア(Consulなど)が必要です。すべてのDockerエンジンはそのK / Vストアで構成する必要があり、Swarmを使用してホストを接続できます。

次に、次のような新しいオーバーレイネットワークを作成します。

$ docker network create --driver overlay my-network

これで、コンテナーを実行パラメーターとしてネットワーク名で実行できます。

$ docker run -itd --net=my-network busybox

すでに実行されている場合は、ネットワークに接続することもできます。

$ docker network connect my-network my-container

詳細については、ドキュメントをご覧ください。


6

次の記事では、複数のホストでDockerコンテナーを接続する方法について説明しています。http://goldmann.pl/blog/2014/01/21/connecting-docker-containers-on-multiple-hosts/


1
これは非常に優れたソリューションです。私もそれに遭遇しました。私が心配しているのは、この記事が昨日しか投稿されておらず、Dockerパッチが必要であることです。(それがどれほど最近投稿されたかを考えると、彼らがそのパッチをDockerにマージするかどうかを確認するために少し待つでしょう)。
14年

Dockerは開発の初期段階にあり、おそらくすべての要件がまだ明確ではなく、定義された要件のすべてが実装されているわけではありません。したがって、パッチが必要です。
パウェロケ2014年

2
これは答えではありません。リンクされた記事から回答をコピーします。それがSO標準です。
Bruno Bronosky、2015

6

Open vSwitchまたはTincを使用して、複数のDockerサブネットをブリッジすることが可能です。方法を示すためにGistsを準備しました。

--linkオプションとアンバサダーパターンの代わりにこのソリューションを使用する利点は、それがより透過的になることです。追加のコンテナーを用意する必要がなく、さらに重要なことに、ホストのポートを公開する必要がありません。実際、--linkDockerがマルチホスト(またはマルチデーモン)のセットアップについてより良い話をする前に、一時的なハックになるオプションを考えています。

注:私の最初の要旨を指す別の回答があることはわかっていますが、その回答を編集したりコメントしたりするのに十分なカルマがありません。


どのようにしてサービスを検出しますか?たとえば、あるマシンにRedisがあり、別のマシンにクライアントアプリケーションがある場合、クライアントアプリケーションはどのようにしてRedisサービスのIPを取得しますか?
14

同じ方法で、単一のホストで実行します。新しく開始したサービスにIP /ポートを提供するか、キー/値ストア(etcdなど)を使用するか、サービスがクエリできるDNSを使用します。多くの既存のサービスが変更なしでDNSを使用できるため、私はDNSを使用するのが好きです。
2014

1

前述のように、Weaveは、ホスト間でDockerコンテナーをリンクするための実行可能なソリューションです。私自身の経験に基づくと、セットアップはかなり簡単です。現在はDNSサービスもあり、コンテナのアドレスをDNS名で指定できます。

一方、ホスト間でコンテナを配線するためのCoreOSのFlannelとJuniperのOpencontrailがあります。


1

港湾労働者の群れのように思え1.14ます:

  • --hostnameタグを使用して、ホスト名をコンテナに割り当てますが、機能させることができません。コンテナは、割り当てられたホスト名で相互にpingすることができません。

  • を使用してマシンにサービスを割り当てる --constraint 'node.hostname == <host>'

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.