2017-03-01 5 views
4

을 역 프록시로 사용하려면 시간이 지남에 따라 동적 IP 주소가 변경 될 수있는 Docker 컨테이너 앞에 traefik에 docker backend. 이것을 설정하는 데 찾을 수있는 모든 예제는 동일한 패턴을 따릅니다.docker 백엔드가있는 traefik 역방향 프록시 - 컨테이너 레이블을 통하지 않고 traefik의 config 파일에서 프론트 엔드 규칙을 구성하십시오.

우선 docker 모드에서 추가 구성 파일없이 traefik을 시작하고 호스트 네트워크 모드를 활성화합니다 (선택 사항, traefik이 호스트의 모든 Docker 네트워크를 볼 수 있도록 선택 사항). 필요한 경우) Docker unix 소켓을 마운트하여 traefik이 컨테이너 시작 및 중지를 청취 할 수있게하십시오.

docker run --rm -p 80:80 --net=host --name traefik-reverse-proxy -v /dev/null/traefik.toml:/etc/traefik/traefik.toml -v /var/run/docker.sock:/var/run/docker.sock traefik --docker --loglevel debug 

그런 다음, 적어도 labels 다음 다른 컨테이너를 시작하고 설정 :

  • traefik.backend을 "일부-백엔드 이름"
  • traefik.frontend.rule : "호스트 : 로컬 호스트 ; 방법 : "GET (또는 어떤 규칙은)
  • traefik.port : 80 (또는 컨테이너가 내부적으로 노출 어떤 포트)

예 :

docker run --rm --name nginx -l traefik.backend="some-backend-name" -l traefik.frontend.rule="Host: localhost; Method: GET" -l traefik.port="80 nginx 

는 다음, curl localhost을하고, 하나가 요청을 가져다가 Nginx의 용기에 라우트 된 traefik 컨테이너의 로그를 볼 수 있습니다.

그러나 지금까지는 애플리케이션 자체 내 역방향 프록시 전달 규칙 (예 : 전달 호스트 : some.host.name to container xxx)을 구성해야한다는 사실을 좋아하지 않습니다. 내 도커가 파일을 작성하여 컨테이너, 레이블 등을 설정하는 곳이 일반적으로 있습니다. 오히려 이것을 응용 프로그램과 분리하고 대신 traefik 구성의 일부로 구성하려고합니다.

어떻게 든 가능합니까? 내가 노력하는 예제의 nginx 컨테이너에서 traefik.frontend.rule 라벨을 떠나는 대신 traefik에 대해 다음 구성 파일을 마운트된다

[frontends] 
    [frontends.frontend1] 
    backend = "some-backend-name" 
    [frontends.frontend1.routes.test_1] 
    rule = "Host: localhost; Method: GET" 

traefik의 시작 명령은 이렇게됩니다 :

docker run --rm -p 80:80 --net=host --name traefik-reverse-proxy -v $PWD/traefik.toml:/etc/traefik/traefik.toml -v /var/run/docker.sock:/var/run/docker.sock traefik --docker --loglevel debug 

그러나,이 수행 프론트 엔드 규칙을 nginx 컨테이너의 백엔드 레이블이있는 config 파일에서 첨부하지 않는 것 같습니다. curl localhost은 이제 404/Not found 오류를 반환합니다.

답변

0

이것은 작업 순서 문제 일 수 있습니다. config (debug = true)에서 디버그 로깅을 사용하면 traefik이 먼저 구성 파일 프론트 엔드 규칙을 구문 분석하고 나중에 만 작동하는 docker를 기반으로 프론트 엔드와 백엔드를 생성합니다.

이것은 config의 프론트 엔드가 생성 될 때 docker 백엔드가 존재하지 않으며 throw되고 오류가 발생 함을 의미합니다.

하나의 해결책은 규칙 설정을 별도의 파일 (예 : rules.toml : shown in the docs)에 넣고 설정에 watch = true 지시어를 추가하는 것입니다. 즉, 여기에 정의한 프론트 엔드 규칙은 도커의 백엔드가 생성 된 후에 업데이트됩니다.

정확히 바람직한 기능이 아니기 때문에 버그를 제출해야합니다.

+0

입력 해 주셔서 감사합니다. 그러나 이것을 시도 할 때 결과는 완전히 동일합니다. 이 일에 대한 실례를 찾았다면 알려주십시오. – Dirk

1

시계 플래그는 처음 변경된 rule.toml의 조건에서만 작동합니다.

귀하의 경우, 귀하의 규칙을 etcd 또는 사육사에 업데이트하는 서비스를 작성하는 것이 좋습니다. etcd에서 etcd를 읽고 변경하는 traefik 구성을 읽습니다.