내가 원하는 것은 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 또는 둘 다 중지합니다. 그래서 도움이 필요해.
중요하다면, MYHOST 환경 변수는'127.0.0.1'로 설정됩니다. – Jacobian