2017-12-26 9 views
2

私の主な目標は、ポートを公開してdocker swarmにスタックをデプロイするときにNginxサービスを利用できるようにすることです(通常、ドッカークラスター)。そのために私はseenmode: hostオプションを持っています。不明なモード:ホストがドッカースタックにデプロイされている

しかし、私はドッカーでファイルを使用して、スタックを展開すると、エラーservice nginx: Unknown mode: hostが発生します。

version: "3.4" 
services: 
    nginx: 
     image: ramidavalapati/nginx:tag1 
     deploy: 
      mode: host 
      restart_policy: 
       condition: on-failure 
      placement: 
       constraints: [node.hostname == ram-ThinkPad-E470] 
     ports: 
      - 80:80 
      - 443:443 
     volumes: 
      - /home/ram/nginxDocker/nginx.conf:/etc/nginx/nginx.conf 
      - /home/ram/nginxDocker/logs/access.log:/var/log/nginx/access.log 
      - /home/ram/nginxDocker/logs/error.log:/var/log/nginx/error.log 
     networks: 
      - all 
     command: ["nginx", '-g', 'daemon off;'] 

networks: 
    all: 
     external: true 

配布ファイルnginx.yml:ドッカーはあなたを通知したよう が$ sudo docker stack deploy -c nginx.yml nginx

答えて

3

私の第一の目標は、私はポートを公開してデプロイを積み重ね行うときに一つだけのマシンからnginxのサービスを利用できるようにすることです(通常、我々はドッキングウィンドウの群れクラスタ内の任意のマシンから公開されたサービスにアクセスすることができます)

何私は、publish and expose ports to only one node and access it only from that node.

サービスのポート(あなたの場合はNginx)を公開し公開すると、デフォルトで、ドッカーswarmの一部である任意のノードからそのサービスにアクセスできます。ポートセクションの

しかし、1つのノードから、あなたのサービスでのみ利用できる必要がありますしたいならば、あなたはfrom

ports: 
    - target: 80 
    published: 80 
    protocol: tcp 
    mode: host 
    - target: 443 
    published: 443 
    protocol: tcp 
    mode: host 

としてあなたのポートセクションを使用することができます使用mode: host

これはからあなたのサービスでのみ利用できる必要がありますコンテナが稼動しているマシン。

サービスコンテナを特定のマシンでのみ実行する必要がある場合は、@Miguel A.C.という制約を使用できます。

1

、ホストがサポートされているモードではありません。 Supported modesはグローバルで複製されています。グローバルモードでは、Swarmの各ワーカーノードでコンテナを実行し、レプリケートモードでは、レプリカの数として選択された多数のコンテナがあり、それらのコンテナは、スケジューラ特定のホストに1つのコンテナのみをデプロイする場合は、mode:replicatedを使用し、レプリカを1に設定し、制約を使用してnode.hostname constraintなどの使用するノードを指定します。ファイルの定義に役立つ例については、docsを参照してください。

0

Docker swarmには、グローバルと複製の2つのモードのサービス展開しかありません。デフォルトは複製モードです。このモードでは、実行する同一のタスクの数を指定します。

グローバルサービスは、すべてのノードで1つのタスクを実行します。したがって、簡単に言えば、追加ノードをswarmに追加するたびに、オーケストレーターがタスクを作成し、スケジューラーがそのタスクを新しいノードに割り当てます。

レプリケートされたサービスには、定義済みの同じタスク数があります。たとえば、4つのワーカーノードがある場合は3つのレプリカを定義すると、1つのワーカーノードにコンテナはありません。

ここで、展開シナリオに基づいて、すべてのノードでタスクを実行する場合は、グローバルサービス展開モードを使用する必要があります。だから、定義は次のようになります。複製されたために

deploy: 
     mode: global 

を、それは次のようになります。

deploy: 
     mode: replicated 
     replicas: 3 

あなたがポート(HOST:CONTAINER)を公開したら - それは自動的にすべてのワーカーノードに反映されます。詳細は、https://docs.docker.com/engine/swarm/how-swarm-mode-works/services/https://www.aquasec.com/wiki/display/containers/Docker+Swarm+101を参照してください。

関連する問題