2017-05-03 26 views
2

도커 컨테이너가 포트 대신 간단한 하위 도메인을 사용하도록 nginx proxy을 설정하려고합니다. 도커를 사용하여 콘테이너를 시작하는 것이 좋으며, 일반적으로 도커에 익숙하지 않기 때문에 즉시 v2 포맷을 사용하기 시작했습니다.Docker nginx 프록시는 도커로 작동하지만 v2가 아닌 v1을 사용합니까?

나는이 꽤 인기 있고 겉으로보기에 단순한 nginx 프록시 컨테이너를 사용하는 것이 왜 저에게 효과가 없었는지에 대해 많은 시간을 보냈습니다. 그것은 어떻게 든 도커 - 사용 v2를 사용하는 것과 관련이 있다는 것을 알게되었습니다.

내가 어떤 이유로 작동하지 않았다 처음 사용 된 고정 표시기 - compose.yml 파일을 게시 할 예정입니다

:

version: '2' 

services: 
    nginx-proxy: 
    image: jwilder/nginx-proxy:alpine 
    container_name: nginx-proxy 
    network_mode: bridge 
    ports: 
     - 80:80 
     - 443:443 
    volumes: 
     - /var/run/docker.sock:/tmp/docker.sock:ro 
    environment: 
     - ENABLE_IPV6=true 
     - DEFAULT_HOST=domain.com 

    whoami: 
    image: jwilder/whoami 
    network_mode: bridge 
    environment: 
     - VIRTUAL_HOST=whoami.local 

을 그리고이 그것을 테스트하기 위해 예를 젠킨스 컨테이너입니다 :

version: "2" 

services: 
    jenkins: 
    image: jenkins:2.46.2-alpine 
    restart: always 
    hostname: jenkins.domain.com 
    network_mode: bridge 
    expose: 
     - 8080 
     - 50000 
    ports: 
     - 8080:8080 
     - 50000:50000 
    volumes: 
     - /srv/jenkins:/var/jenkins_home 
    environment: 
     - VIRTUAL_HOST=jenkins.domain.com 
     - VIRTUAL_PORT=8080 

nginx-proxy: 
    image: jwilder/nginx-proxy:alpine 
    container_name: nginx-proxy 
    ports: 
    - 80:80 
    - 443:443 
    volumes: 
    - /var/run/docker.sock:/tmp/docker.sock:ro 
    environment: 
    - ENABLE_IPV6=true 
    - DEFAULT_HOST=domain.com 

whoami: 
    image: jwilder/whoami 
    environment: 
    - VIRTUAL_HOST=whoami.local 
:

지금 나는 실제로 나를 위해 상자 밖으로 작업을했던 구성을 게시 할 예정입니다 16,

그리고 젠킨스 컨테이너 :

jenkins: 
    image: jenkins:2.46.2-alpine 
    restart: always 
    hostname: jenkins.domain.com 
    expose: 
    - 8080 
    - 50000 
    ports: 
    - 8080:8080 
    - 50000:50000 
    volumes: 
    - /srv/jenkins:/var/jenkins_home 
    environment: 
    - VIRTUAL_HOST=jenkins.domain.com 
    - VIRTUAL_PORT=8080 

내가 network_mode: bridge의 제거입니다 볼 수있는 유일한 진정한 차이. 나는 v2를 사용하여 별도의 네트워크가 생성되었음을 알았을 때 v1 (또는 간단하게 docker run)과 같은 네트워크에 있다는 사실을 알았습니다. network_mode: bridge을 사용하면이 문제가 해결 된 것으로 보입니다.

이 외에도 docker-compose.yml 파일의 구조적 변경 일 뿐이지 만이 설정이 작동하지 않게하는 몇 가지 다른 차이가 있어야합니다.

V1은 사용되지 않으므로 v2 형식을 사용하고 싶습니다. v2를 도우미로 작성하여 v2처럼 작동시키고 프록시가 제대로 작동하도록하려면 어떻게해야합니까?

+0

을 너 봤어? – BMitch

+0

실제로 오류가 없습니다. 프록시가 작동하지 않고 요청을 다른 컨테이너로 전달하지 않습니다. – noone

답변

2

컨테이너가 동일한 네트워크에 있는지 확인해야합니다. nginx-proxy에서는 노드에 도달 할 수없는 경우 업스트림 설정을 추가하지 않습니다. 그 상류 부분이 비어있는 경우는 컨테이너에 도달하는 일반적인 고정 표시기 네트워크를 찾을 수 없습니다입니다, 코멘트 및 server 라인없이,

$ docker exec -it nginx-proxy cat /etc/nginx/conf.d/default.conf 
# .... 
# whoami.local 
upstream whoami.local { 
           ## Can be connect with "nginxproxy_default" network 
         # nginxproxy_whoami_1 
         server 172.19.0.3:8000; 
} 
# .... 

그것은 트래픽을 라우팅 할 수 없습니다 : 당신은 같은 것을 볼 수 .

나는 다음과 같은 파일 작성과 그것을보고 있어요 :

version: '2' 

services: 
    nginx-proxy: 
    image: jwilder/nginx-proxy:alpine 
    container_name: nginx-proxy 
    ports: 
     - 8080:80 
     - 8443:443 
    volumes: 
     - /var/run/docker.sock:/tmp/docker.sock:ro 
    environment: 
     - ENABLE_IPV6=true 
     - DEFAULT_HOST=domain.com 

    whoami: 
    image: jwilder/whoami 
    environment: 
     - VIRTUAL_HOST=whoami.local 

그리고 나는 그것을 확인할 수 있습니다

젠킨스와
$ curl -H "Host: whoami.local" http://localhost:8080 
I'm b066afdb6e45 

, 당신은 (별도의 작성 파일을 그 위로 회전 할 때 실제로 다른 디렉토리 이름에있을 때 기본적으로 발생하는 별도의 작성 프로젝트), 별도의 기본 네트워크를 갖게됩니다. 내가 가진 가장 쉬운 해결책은 외부 네트워크를 사용하는 것입니다.

$ docker network create proxynet 

을 다음 작성 파일은 외부 네트워크에 포함됩니다 : 먼저 고정 표시기에서 직접 만드는 당신은 젠킨스와 동일한 기능을 수행 할 것

version: '2' 

networks: 
    proxynet: 
    external: true 

services: 
    nginx-proxy: 
    image: jwilder/nginx-proxy:alpine 
    container_name: nginx-proxy 
    ports: 
     - 8080:80 
     - 8443:443 
    volumes: 
     - /var/run/docker.sock:/tmp/docker.sock:ro 
    networks: 
     - proxynet 
    environment: 
     - ENABLE_IPV6=true 
     - DEFAULT_HOST=domain.com 

    whoami: 
    image: jwilder/whoami 
    environment: 
     - VIRTUAL_HOST=whoami.local 
    networks: 
     - proxynet 

: 무엇 오류

version: "2" 

networks: 
    proxynet: 
    external: true 

services: 
    jenkins: 
    image: jenkins:2.46.2-alpine 
    restart: always 
    hostname: jenkins.domain.com 
    networks: 
     - proxynet 
    expose: 
     - 8080 
     - 50000 
    ports: 
     - 8080:8080 
     - 50000:50000 
    volumes: 
     - /srv/jenkins:/var/jenkins_home 
    environment: 
     - VIRTUAL_HOST=jenkins.domain.com 
     - VIRTUAL_PORT=8080 
+0

답변 해 주셔서 감사합니다. 나중에 테스트하고 작동하는지 확인하겠습니다. 내가 이해하지 못하는 것 : 두 컨테이너 모두에 대해 공유 외부 네트워크를 설정하는 것과 두 브리지에서 동일한 기본 브리지 네트워크에 'network_mode : bridge'를 사용하는 것의 차이점은 무엇입니까? – noone

+0

테스트해야하지만 브리지가 기본 네트워크 모드이므로 프로젝트 당 고유 한 네트워크 (v2 기능)를 만드는 기본 작업을 계속 수행 할 가능성이 큽니다. – BMitch

+0

네트워크 목록에 추가 네트워크가 나열되지 않습니다 (기본 네트워크 외에도). 그러나'network_mode : bridge'가 없으면 2 개의 추가적인 네트워크가 있습니다 (nginx와 jenkins 용). – noone