0

내가 원하는 것은 Docker, Docker Compose, Registrator, Consul, Consul Template, NGINX 및 마지막으로 "Hello를 인쇄하는 작은 서비스입니다. 세계 "브라우저에서. 그래서, 지금은 docker-compose.yml 파일을 가지고 있습니다. 그것은 이렇게 보입니다 :Docker, Consul 및 nginx를 사용하여 부하를 분산 할 수 없습니다.

version: '2' 
services: 
accent: 
    build: 
     context: ./accent 
    image: accent 
    container_name: accent 
    restart: always 
    ports: 
     - 80 
consul: 
    image: gliderlabs/consul-server:latest 
    container_name: consul 
    hostname: ${MYHOST} 
    restart: always 
    ports: 
     - 8300:8300 
     - 8400:8400 
     - 8500:8500 
     - 8600:53/udp 
    command: -advertise ${MYHOST} -data-dir /tmp/consul -bootstrap -client 0.0.0.0 
registrator: 
    image: gliderlabs/registrator:latest 
    container_name: registrator 
    hostname: ${MYHOST} 
    network_mode: host 
    restart: always 
    volumes: 
     - /var/run/docker.sock:/tmp/docker.sock 
    command: -ip ${MYHOST} consul://${MYHOST}:8500 
nginx: 
    container_name: nginx 
    image: nginx:latest 
    restart: always 
    volumes: 
     - /etc/nginx 
    ports: 
     - 8181:80 
consul-template: 
    container_name: consul-template 
    build: 
     context: ./consul-template 
    network_mode: host 
    restart: always 
    volumes_from: 
     - nginx 
    volumes: 
     - /var/run/docker.sock:/tmp/docker.sock 
    command: -consul=${MYHOST}:8500 -wait=5s -template="/etc/ctmpl/nginx.ctmpl:/etc/nginx/nginx.conf:docker kill -s HUP nginx" 

첫 번째 서비스 - 액센트 -로드 균형이 필요한 웹 서비스입니다. 이 명령을 실행할 때 :

$ docker-compose up 

나는 모든 서비스가 실행되기 시작하고 오류 메시지가 나타나지 않습니다. 모든 것이 완벽하다는 것처럼 보입니다. 내가

$ docker ps 

를 실행하면 나는 콘솔에서 볼 :

... NAMES    STATUS   PORTS 
consul-template Up 45 seconds  
consul    Up 56 seconds  0.0.0.0:8300->8300/tcp, 0.0.0.0:8400->8400/tcp, 8301-8302/tcp, 8301-8302/udp, 0.0.0.0:8500->8500/tcp, 8600/tcp, 8600/udp, 0.0.0.0:8600->53/udp  
nginx    Up 41 seconds  0.0.0.0:8181->80/tcp 
registrator  Up 56 seconds 
accent    Up 56 seconds  0.0.0.0:32792->80/tcp 

, 마지막 행에 특히 PORTS 컬럼에주의하십시오. 보시다시피,이 서비스는 32792 포트를 게시합니다. 내 웹 서비스를 내 호스트 시스템 (I가 구성 고정 표시기를 실행하는 컴퓨터)에 127.0.0.1:32972로 이동 얻을 수 있는지 확인하고 브라우저에서이 문제를 확인하려면 :

Hello World 

이 내가보고 싶어 정확히입니다. 그러나, 내가 마침내 원하는 것은 아니다. 제발, 도커의 ps 명령의 출력을보고 당신이 볼 것이다, 내 nginx 서비스는 8181 포트를 발표했다. 그래서, 제가이 주소 (127.0.0.1:8181)로 갈 때, 정확히 같은 "Hello world"페이지가 보일 것이라고 기대하고 있습니다. 그러나 그렇지 않습니다. 브라우저에서 잘못된 게이트웨이 오류 메시지가 표시되고 nginx 로그에서이 오류 메시지가 표시됩니다.

nginx | 2017/01/18 06:16:45 [오류] 5 # 5 : * 5 업스트림에 연결하는 동안 connect()가 실패했습니다 (111 : Connection refused). 클라이언트 : 172.18.0.1, server :, request : "GET/favicon. 특별하다고 HTTP/1.1 "상류"http://127.0.0.1:32792/index.php "호스트"127.0.0.1:8181 "

의 nginx는 내가 뭘 기대 않기 때문에 그것은 정말 재미있다 -에 업스트림"http://127.0.0.1:32792/index.php ". 하지만 왜 실패하는지 모르겠습니다. 그런데,이 (영사 템플릿으로 자동으로 생성) 방법 nginx.conf처럼 보이는이 nginx.conf가 나에게 좋아 보인다 이후

worker_processes 1; 
events { 
    worker_connections 1024; 
} 
http { 
    sendfile on; 

    upstream app_servers { 
     server 127.0.0.1:32792; 
    } 

    server { 
     listen 80; 
     root /code; 
     index index.php index.html; 

     location/{ 
      try_files $uri/ $uri/ /index.php; 
     } 

     location ~ \.php$ { 
     proxy_pass http://app_servers; 
     proxy_redirect off; 
     proxy_set_header Host $host; 
     proxy_set_header X-Real-IP $remote_addr; 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
     proxy_set_header X-Forwarded-Host $server_name; 
     } 

     location ~ /\.ht { 
     deny all; 
     } 

    } 
} 

내가 아무것도 변하지 않을 것입니다. 그것이 작동하지 않는 이유를 이해하려고 노력, 나는 용기를 nginx에하는 껍질과 명령의 몇했다 : nginx를 컨테이너 포트 80에서 내 웹 서비스를보고 그 아래 32972을 게시되지 때문에 다시

$ curl accent 
Hello World 

$ curl 127.0.0.1:32972 
curl: (7) Failed to connect to 127.0.0.1 port 32972: Connection refused 

$ curl accent:32972 
curl: (7) Failed to connect to accent port 32972: Connection refused 

, 그것은 흥미 롭다 포트. 어쨌든,이 단계에서 나는 그것이 왜 효과가없고 어떻게 고쳐야 할지를 모른다. 난 그냥 추측을 가지고, 그것은 어떻게 든 연결되는 방법, 네트워크가 docker-compose.yml에 어떻게 구성되어 있는지를 보여줍니다. 나는 악센트와 nginx 서비스에 network_mode: host의 다양한 조합을 시도했지만 아무 소용이 - 악센트가 작동하거나 nginx 또는 둘 다 중지합니다. 그래서 도움이 필요해.

+0

중요하다면, MYHOST 환경 변수는'127.0.0.1'로 설정됩니다. – Jacobian

답변

1

포트 바인딩을 사용하면 컨테이너 (80, 예 : accent)와 호스트의 일부 포트 (호스트에서 임의의 32792 등)를 게시합니다.악센트 컨테이너와 동일한 네트워크에있는 컨테이너는 도커 작성 서비스 이름 확인으로 인해 컨테이너 포트 80accent (과 동일)까지 액세스 할 수 있습니다. accent:32792으로 호스트의 accent:80에 액세스 할 수 있습니다. nginx 컨테이너에서 127.0.0.1:32792을 요청할 때 nginx 컨테이너 32792 포트에만 액세스 할 수 있으며 accent이 아니라 액세스 할 수 있습니다. accent:32792은 올바른 URL이 아닙니다 (80 포트가 호스트에서 accent, 32792에 열려 있음). 그러나 host 네트워크에 nginx 컨테이너를 추가하면 127.0.0.1:32792이 작동합니다. 그러나 curl 전화에서 잘못된 포트를 사용하는 것으로 나타났습니다. accent:80이 호스트 32792에 게시되었지만 32972을 요청했습니다.

+0

감사! 하지만 두 가지를 고쳐야한다는 뜻입니까? network_mode를 nginx의 호스트로 설정하고 nginx.conf의 consul 템플릿에 {{.Address}} 대신 {{. Port}}를 사용합니다. {{. Port} }? 즉, 나는 그것을 정확히 고치는 데 필요한 것을 이해하지 못합니다. 미리 많은 감사드립니다! – Jacobian

+0

아니면 영사 템플릿을 변경하고 {{. 서비스}} : 80과 같이해야하나요? BTW 영사 템플리트에 맞는 핵심 ​​단어가 무엇인지 확실하지 않아 실제 서비스 이름 (내 경우에는 악센트)으로 자리 표시자를 변경합니다. – Jacobian

+0

그것은 도커를 실행하는 방법에 따라 다릅니다. 영사와 nginx를 작성한 후에 호스트 네트워크에 nginx를 추가하고 config에 올바른 포트를 설정할 수 있습니다. 작성으로 컨테이너를 실행하려면 외부에서 액세스해야하는 포트만 게시해야합니다. 악센트로 이해하고 외부에서 직접 사용할 수 있어야합니다. 그런 다음 호스트 포트에 포트를 게시해서는 안됩니다. 'scale'을 사용하여 아주 간단한 도커 작성로드 밸런싱을 할 수 있습니다 https://www.brianchristner.io/how-to-scale-a-docker-container-with-docker-compose/ – Cortwave