2017-12-15 12 views
0

群れにコンテナを展開しようとしています。 Execのコマンド:ドッカーの群れにいくつかのレプリカ

docker service create --name backend --replicas 3 --publish published=8080,target=80 my-repo/subserver:latest 

それは3つのレプリカを開始するが、そのうちの一つは、常にエラーがあります。

docker service ps --no-trunc backend 

    ID       NAME     IMAGE       NODE       DESIRED STATE  CURRENT STATE     ERROR             PORTS 
0759ox8aganle2banj4s1uc31 backend.1  my-repo/subserver:latest Debian-70-wheezy-64-minimal Running    Running 2 minutes ago 
zjm9tf5ca1t58iuyjsyjqpjnq backend.2  my-repo/subserver:latest Debian-70-wheezy-64-minimal Running    Running 2 minutes ago 
u9ebicuyh0it6kvpaj9n7id2b backend.3  my-repo/subserver:latest Debian-70-wheezy-64-minimal Ready    Ready less than a second ago 
4kgwlm4rddj7zefr9tc1xst75 \_ backend.3 my-repo/subserver:latest Debian-70-wheezy-64-minimal Shutdown   Failed 2 seconds ago   "starting container failed: Address already in use" 
dqvsyy5cjd95iid845ylrpdzi \_ backend.3 my-repo/subserver:latest Debian-70-wheezy-64-minimal Shutdown   Failed 8 seconds ago   "starting container failed: Address already in use" 
ki0y94msyswqirm03qr7ldzl6 \_ backend.3 my-repo/subserver:latest Debian-70-wheezy-64-minimal Shutdown   Failed 13 seconds ago   "starting container failed: Address already in use" 
emydpjqzzo5ce2ngid9ap9pb7 \_ backend.3 my-repo/subserver:latest Debian-70-wheezy-64-minimal Shutdown   Failed 19 seconds ago   "starting container failed: Address already in use" 

は異なるポートをしようと試みました。 コンテナにはPHP-FPMとnginxが含まれています。サービスはbashスクリプトから始まります:

#!/bin/bash 

service nginx start 
service php7.0-fpm start 

while /bin/true; do 
    ps aux |grep nginx |grep -q -v grep 
    PROCESS_1_STATUS=$? 
    ps aux |grep php |grep -q -v grep 
    PROCESS_2_STATUS=$? 
    # If the greps above find anything, they will exit with 0 status 
    # If they are not both 0, then something is wrong 
    if [ $PROCESS_1_STATUS -ne 0 -o $PROCESS_2_STATUS -ne 0 ]; then 
    echo "One of the processes has already exited." 
    exit -1 
    fi 
    sleep 60 
done 

ドッカーファイルはわずか80ポートです。

+0

ネットワークインターフェイス/関連ノードのアドレス? ( '$ ipアドレス')。コンテナに割り当てられたアドレスと比較する( 'docker container inspect ...')。 – tne

答えて

0

swarmモードでスケーリングを使用する場合は、ポートを公開しないでください。あなたはその問題で動くだけです。
正しい方法は次のとおりです。

  1. はgobalに(例えばnginxの、apacheやtraefik)リバースプロキシを使用します(ポートを公開しない)
  2. は、このネットワークにあなたのサービスを割り当てるドッカネットワークを作成しますだからあなたのリバースプロキシは、ちょうどあなたのサービスの名前(--name your_service)を呼び出しますと、内部的ドッキングウィンドウの群れモードはあなたのn個の1を呼び出すためにその含まラウンドロビン・ロード・バランサを使用するポート80

にあなたのサービスを公開するためのモード'th ser (--replicas n

これは、ドッカーのモードが設計されており、スケーリングはロードバランシングでそのまま使用できます。

+0

ほぼドッカーネットワークはオーバーレイでなければならず、ネットワークに参加してもポートを公開する必要があります。また、 'ingress'ネットワークはswarm設定のデフォルトであり、何とかボックス外で動作するはずです。私はOPが古いDockerバージョンにあると仮定しています。 –

0

ここでは、すべて同じポートに接続する複数のサービスを作成しようとしています。いずれかのポートに接続できるサービスは1つだけです。これはDocker特有のものではなく、将来の技術的な取り組みにおいても同様です。

ただし、好奇心をそそるのは、デフォルトでSwarmモードでは、ingressネットワークがset as the default networkであることです。これはルーティングメッシュのオーバーレイネットワークです。フードの下で起こっていることは、Dockerがあなたのために扱っているレイヤ3 IPロードバランシングです。

あなたがこの問題に遭遇しているのは不思議です.Dockerの古いバージョンを実行していると言いたいと思います。

あなたが自分でこれを解決したい場合は - 最も簡単な方法は、オーバーレイネットワークを作成することです、例えば:

docker network create --driver overlay my_new_network 

そして、あなたのサービスを作成するときに、あなたがネットワークを指定して確認してください。

docker service create --network my_new_network --name backend --replicas 3 --publish published=8080,target=80 my-repo/subserver:latest 

これは、IPベースのルーティングを解決します。しかし、いくつかのホストベースのルーティングを行う場合は、@ Markusが述べたようにTraefik、Docker Flow Proxy、HAProxyなどのレイヤ7ロードバランサを使用することができます。

関連する問題