2016-09-26 5 views
0

コンテナ内にバイナリプロトコルTCPサーバを実行しています。ダウンタイムゼロのアップグレードを容易にするために、私は、インスタンスがUnixドメインソケット経由で新しいコンテナ内のサーバにサーバソケットを転送できるフローを構築しました。これは、最初のコンテナが停止する瞬間までの魅力のように機能します。ポートを公開したコンテナであるため、コンテナが閉じられるとポートはパブリッシュされません。私はこのケースを処理する最善の方法を理解しようとしています。2つのドッカーコンテナ間でネットワークポートを共有する

は、ここで私がやっているの基本的な荒廃です:

# start the first container, starts listening on 3290 
docker run -p 3290:3290 --name first /my/server/app 

# start the second container, "steals" the server socket on 3290 from first 
docker run --net container:first /my/server/app 

# the second container, at this point, is handling connections from 3290 
# when the first container is killed below, the port is de-published 
# and the second container stops receiving connections 
docker rm first 

は、最初は、私は、ユーザー定義のネットワークが最高の仕事だろうと思ったが、私は、ユーザーのポートを公開する方法を見つけることができません定義されたネットワーク。私が検討している別のオプションは、ポートのパブリッシュを処理する別のコンテナを作成してから、そのコンテナから他のすべてのコンテナがネットワークを借り入れるようにすることです。私はアプローチがうまくいくと思います。私はちょうど他の目的のためにこの余分なコンテナを横たえなければならないという考えが嫌いです。おそらくそれが唯一の解決策ではありますか?

+0

HAPROXYなどのプロキシを使用しようとしましたか。 DockerCloudを使用している場合は、サービスエンドポイントを使用するだけで、リスクをさらに減らすことができます.HAPROXYを使用して個々のサービスを指定します。これは、ダウンタイムがゼロになることを意味します。 – AndrewL

+0

私はHAPROXYの使用を検討しましたが、私はいくつかの理由で躊躇しています。 HAPROXYの設定ページを調べると、HTTPサービスに合わせて調整されているように感じられます。生のバイナリTCPサーバにサービスを提供しているので、プロキシのアプローチとよく似ているかどうかわかりません。私は何か不足しているかもしれませんが。 –

+0

これは、複数のサービスに使用できます。主な用途はHTTPですが、任意のTCP接続を処理できます。私たちの用途では、HTTPトラフィックやその他のデータも処理します。 – AndrewL

答えて

0

https://docs.docker.com/engine/swarm/

ロードバランシング:あなたは、外部ロードバランサにサービス用のポートを公開することができます。内部的には、ノード間でサービスコンテナをどのように配布するかを指定することができます。

この記事の最後のビデオは、おそらくあなたにとっておもしろいかもしれません。https://blog.docker.com/2016/06/docker-1-12-built-in-orchestration/

+0

私は1つのノードでこれを実行しています。 –

+0

IPVSはシングルノードで動作します。https://blog.codeship.com/kernel-load-balancing-for-docker-containers-using-ipvs/ –

関連する問題