2017-12-26 5 views
2

Mein primäres Ziel ist es, den Nginx-Service von nur einem Rechner verfügbar zu machen, wenn ich Ports freilege und im docker schwarm staple (Normalerweise können wir von jedem Rechner im Docker-Schwarm-Cluster auf den exponierten Dienst zugreifen). Dafür habe ich seenmode: host Option.Unbekannter Modus: Host im Docker-Stack deploy

Aber wenn ich es in Docker komponieren Datei verwenden und Stapel bereitstellen dann erhalte ich Fehler service nginx: Unknown mode: host.

nginx.yml

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 

Deploy-Datei: $ sudo docker stack deploy -c nginx.yml nginx

Antwort

3

Mein primäres Ziel ist es Nginx Service von nur einer Maschine zu machen, wenn ich Ports freilegen und stapeln bereitstellen (In der Regel können wir exponierter Service von jedem Rechner im Schwarm Cluster Docker Zugriff)

Was Ich verstehe, ist, publish and expose ports to only one node and access it only from that node.

Wenn Sie Ports für einen Dienst veröffentlichen und verfügbar machen (in Ihrem Fall Nginx) dann können Sie standardmäßig auf diesen Dienst von einem der Knoten zugreifen, die der Teil von Docker Schwarm sind.

Aber wenn Sie Ihr Dienst wollen nur von einem Knoten verfügbar sollte dann Sie Ihren Ports Abschnitt als from

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

Verwenden mode: host in Häfen Abschnitt verwenden können

Das macht Ihren Service sollte nur von der zur Verfügung stehenden Maschinen, auf denen seine Container laufen.

Wenn Sie möchten, dass Ihre Servicebehälter nur auf einer bestimmten Maschine ausgeführt werden sollen, können Sie Constraints wie @Miguel A.C.

1

Wie Docker Sie informiert, Host nicht unterstützt Modus befindet. Supported modes sind global und repliziert. Im globalen Modus wird auf jedem Arbeitsknot Ihres Swarm ein Container ausgeführt. Im replizierten Modus wird eine Anzahl von Containern als Anzahl von Replikaten ausgewählt und diese Container können auf demselben oder einem anderen Host bereitgestellt werden der Planer. Wenn Sie nur einen Container auf einem bestimmten Host bereitstellen möchten, können Sie mode: replicated verwenden, Replikate auf 1 setzen und mithilfe von Einschränkungen festlegen, welcher Knoten verwendet werden soll, z. B. mithilfe der Bedingung node.hostname. Beispiele, die Ihnen beim Definieren Ihrer Datei helfen können, finden Sie unter docs.

0

Im Docker-Schwarm gibt es nur zwei Arten von Servicebereitstellungen, global und repliziert. Der Standardwert ist der replizierte Modus. In diesem Modus geben Sie die Anzahl der auszuführenden identischen Aufgaben an.

Ein globaler Dienst führt auf jedem Knoten eine Aufgabe aus. Kurz gesagt, jedes Mal, wenn Sie dem Schwarm einen zusätzlichen Knoten hinzufügen, erstellt der Orchestrator eine Aufgabe, und der Scheduler weist die Aufgabe dem neuen Knoten zu.

Ein replizierter Service verfügt über eine vordefinierte Anzahl identischer Tasks. Wenn Sie beispielsweise vier Worker-Knoten haben, aber 3 Replikate definieren, enthält ein Worker-Knoten keinen Container.

Jetzt müssen Sie basierend auf Ihrem Bereitstellungsszenario den globalen Servicebereitstellungsmodus verwenden, wenn Sie eine Aufgabe auf jedem Knoten haben möchten. So wird die Definition wie folgt aussehen:

deploy: 
     mode: global 

Für replizierte, es wäre:

deploy: 
     mode: replicated 
     replicas: 3 

Sobald Sie Ports (HOST: CONTAINER) aussetzen - es wird automatisch auf alle Arbeiter Knoten widerspiegeln. Für weitere Informationen können Sie sich auf https://docs.docker.com/engine/swarm/how-swarm-mode-works/services/ und https://www.aquasec.com/wiki/display/containers/Docker+Swarm+101 beziehen.

Verwandte Themen