2017-12-15 10 views
0

떼지기 위해 컨테이너를 전개하려고합니다. 실행 명령은 :도커 떼에 여러 개의 복제본

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" 

Tryed 다른 포트를. 컨테이너에 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 

Docker 파일은 80 포트만을 제공합니다.

+0

네트워크 인터페이스/관련 노드의 주소? ('$ ip address'). 컨테이너에 할당 된 주소와 비교하십시오 ('docker container inspect ...'). – tne

답변

0

득표 모드에서 확장을 사용하는 경우 포트를 게시하지 마십시오. 너는 그걸로 곤경에 빠질거야.
올바른 방법은 다음과 같습니다

  1. 이 gobal에 (예를 들면 nginx를 아파치 또는 traefik) 리버스 프록시를 사용 (포트를 게시하지 않습니다)
  2. 이 네트워크에 서비스를 할당 할 고정 표시기 네트워크를 구축 모드는 80

그래서 역방향 프록시 그냥 서비스 (--name your_service)의 이름을 호출 포트에서 서비스를 공개하고, internaly 고정 표시기 떼 모드는 N 중 하나를 호출하기 위해 포함 라운드 로빈 부하 분산 장치를 사용합니다 'th ser 부두 (--replicas n)

도커 웜 모드가 설계되었으며 부하 분산 기능을 사용하여 확장이 가능합니다.

+0

거의. 도커 네트워크는 오버레이 여야하며 네트워크에 가입하더라도 포트를 게시하려고합니다.또한'ingress' 네트워크는 swarm 설정에서 기본값이며 아무렇게나 작동합니다. OP가 오래된 Docker 버전에 있다고 가정합니다. –

0

여기서 일어나는 일은 모두 동일한 포트에 연결되는 여러 서비스를 만드는 중입니다. 하나의 서비스 만이 특정 포트에 연결할 수 있습니다. 이는 Docker에만 국한된 것이 아니며 앞으로도 계속 노력할 것입니다.

그러나; 궁금한 점은 기본적으로 Swarm 모드는 ingress 네트워크가 set as the default network이라는 것입니다. 이것은 라우팅 메시가있는 오버레이 네트워크입니다. 실제 상황에서는 Docker가 처리하는 Layer-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 등과 같은 Layer-7로드 밸런서를 사용할 수 있습니다.