2017-12-26 30 views
2

내 기본 목표는 포트를 노출하고 도커 웜에서 스택 배포를 수행 할 때 한 대의 컴퓨터에서만 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의 경우)를 게시하고 공개하면 기본적으로 docker swarm의 일부인 노드에서 해당 서비스에 액세스 할 수 있습니다. 당신이 당신의 서비스가 하나 개의 노드에서만 사용할 다음 포트 섹션에서 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의 각 작업자 노드에서 컨테이너를 실행하게되며, 복제 모드에서는 복제본의 수로 선택된 여러 컨테이너를 갖게되며, 그 컨테이너는 다음과 같이 결정된 동일하거나 다른 호스트에 배치 될 수 있습니다. 스케줄러. 특정 호스트에 하나의 컨테이너 만 배포하려면 mode : replicated를 사용하고 replica를 1로 설정하고 constraint를 사용하여 node.hostname constraint를 사용하여 사용할 노드를 지정하십시오. 파일을 정의하는 데 유용한 예제는 docs을 참조하십시오.

0

Docker swarm에는 전역 배포와 복제 된 두 가지 모드의 서비스 배포 만 있습니다. 기본값은 복제 모드입니다.이 모드에서는 실행할 동일한 작업의 수를 지정합니다.

글로벌 서비스는 모든 노드에서 하나의 작업을 실행합니다. 따라서 요컨대, 옴에 추가 노드를 추가 할 때마다 오케 스트레이터가 작업을 만들고 스케줄러가 작업을 새 노드에 할당합니다.

예를 들어 작업자 노드가 4 개 있지만 복제본을 3 개 정의하면 복제본 서비스에는 미리 정의 된 수의 동일한 작업이 있습니다. 하나의 작업자 노드에는 컨테이너가 없습니다.

이제 배포 시나리오에 따라 모든 노드에서 작업을 수행하려는 경우 전역 서비스 배포 모드를 사용해야합니다. 그래서 정의는 다음과 같이 표시됩니다 복제에 대한

deploy: 
     mode: global 

, 그것은 다음과 같습니다

deploy: 
     mode: replicated 
     replicas: 3 

를 사용하면 포트 (HOST : 컨테이너)에 노출되면 - 자동으로 모든 작업자 노드에 반영됩니다. 추가 정보는 https://docs.docker.com/engine/swarm/how-swarm-mode-works/services/https://www.aquasec.com/wiki/display/containers/Docker+Swarm+101을 참조하십시오.