Docker 서비스 발견 (1) -- 자동화 Nginx 역방향 에이전트

7431 단어 Docker

본문 jwilder Automated Nginx Reverse Proxy for Docker
왜 Docker 는 역방향 대 리 를 사용 합 니까?
Docker 용 기 는 무 작위 IP 와 포트 가 할당 되 어 클 라 이언 트 각도 에서 주 소 를 찾 는 것 이 매우 복잡 합 니 다.기본적으로 IP 와 포트 는 호스트 에 만 사용 되 며 호스트 에 연결 되 지 않 는 한 외부 에 접근 할 수 없습니다.
호스트 포트 에 용 기 를 연결 하면 여러 용기 가 같은 호스트 에서 실행 되 는 것 을 방지 할 수 있 습 니 다.예 를 들 어 같은 시간 에 하나의 용기 만 80 포트 에 연결 할 수 있다.이것 또한 새로운 버 전의 용기 가 정지 되 지 않 고 출시 되 는 것 을 복잡 하 게 만 들 었 다. 왜냐하면 오래된 버 전 은 반드시 새로운 버 전이 시작 되 기 전에 먼저 멈 춰 야 하기 때문이다.
역방향 대 리 는 이러한 문 제 를 처리 하 는 데 도움 을 줄 수 있 으 며, 동시에 제로 정지 배치 의 어려움 을 줄 여 가용성 을 높 일 수 있다.
역방향 프 록 시 프로필 생 성
용기 가 시작 되 고 정지 되 었 을 때 역방향 프 록 시 설정 을 설정 하 는 것 은 복잡 할 수 있 습 니 다.일반적인 설정 은 수 동 으로 업데이트 해 야 합 니 다. 오류 가 발생 하기 쉽 고 시간 이 걸 립 니 다.
다행히도 Docker 는 원 격 API 를 제공 합 니 다. inspect containers IP, 포트 및 기타 설정 메타 데 이 터 를 방문 합 니 다.또한 용기 가 언제 시작 되 고 정지 되 는 지 알려 주 는 실시 간 이벤트 API 도 제공 합 니 다.이 API 들 은 자동 으로 역방향 프 록 시 설정 을 만 드 는 데 사 용 될 수 있다.
docker-gen 이 API 를 사용 하 는 작은 도구 이 며, 용기 의 메타 데 이 터 를 템 플 릿 으로 내 보 냅 니 다.템 플 릿 이 렌 더 링 되 고 선택 한 알림 명령 이 실행 되 어 서 비 스 를 다시 시작 할 수 있 습 니 다.
쓰다 docker - gen, 우 리 는 Nginx 의 설정 을 자동 으로 생 성하 고 Nginx 가 바 뀌 었 을 때 다시 불 러 올 수 있 습 니 다.같은 방법 으로 사용 할 수 있다. Docker 로그 관리.
Nginx 역방향 에이전트 Docker
이 예 를 들 어 Nginx 템 플 릿 은 Docker 용기 에서 가상 호스트 루트 를 사용 하 는 역방향 프 록 시 설정 파일 을 만 드 는 데 사 용 될 수 있 습 니 다.이 템 플 릿 은 사용 golang text/template package 실현 적그것 은 통용 되 는 것 을 사용한다.  groupBy  템 플 릿 함수  VIRTUAL_HOST  환경 변 수 를 그룹 으로 나 누 어 실행 하 는 용기 입 니 다.이 는 용 기 를 옮 겨 다 니 며 부하 균형 백 엔 드 를 만 들 고 정지 배치 가 가능 하도록 간소화 했다.
{{ range $host, $containers := groupBy $ "Env.VIRTUAL_HOST" }}
upstream {{ $host }} {

{{ range $index, $value := $containers }}
    {{ with $address := index $value.Addresses 0 }}
    server {{ $address.IP }}:{{ $address.Port }};
    {{ end }}
{{ end }}

}

server {
    #ssl_certificate /etc/nginx/certs/demo.pem;
    #ssl_certificate_key /etc/nginx/certs/demo.key;

    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

    server_name {{ $host }};

    location / {
        proxy_pass http://{{ $host }};
        include /etc/nginx/proxy_params;
    }
}
{{ end }}

이 템 플 릿 은 사용 할 수 있 습 니 다.  docker-gen  실행:
docker-gen -only-exposed -watch -notify "/etc/init.d/nginx reload" templates/nginx.tmpl /etc/nginx/sites-enabled/default
  • -only-exposed  - 용기 가 노출 된 포트 만 사용 합 니 다
  • -watch  - 시작 후 docker 용기 이 벤트 를 감시 하고 템 플 릿 을 다시 생 성 합 니 다
  • -notify "/etc/init.d/nginx reload"  - 템 플 릿 생 성 후 nginx 설정 을 다시 불 러 옵 니 다
  • templates/nginx.tmpl  - nginx 템 플 릿
  • /etc/nginx/sites-enabled/default  - 대상 파일..

  • 이것 은 두 개의 용기 배치 입 니 다.  VIRTUAL_HOST=demo1.localhost  화해시키다  VIRTUAL_HOST=demo2.localhost  의 렌 더 링 템 플 릿 입 니 다.
    upstream demo1.localhost {
        server 172.17.0.4:5000;
        server 172.17.0.3:5000;
    }
    
    server {
        #ssl_certificate /etc/nginx/certs/demo.pem;
        #ssl_certificate_key /etc/nginx/certs/demo.key;
    
        gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
    
        server_name demo1.localhost;
    
        location / {
            proxy_pass http://demo.localhost;
            include /etc/nginx/proxy_params;
        }
    }
    
    upstream demo2.localhost {
        server 172.17.0.5:5000;
    }
    
    server {
        #ssl_certificate /etc/nginx/certs/demo.pem;
        #ssl_certificate_key /etc/nginx/certs/demo.key;
    
        gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
    
        server_name demo2.localhost;
    
        location / {
            proxy_pass http://demo2.localhost;
            include /etc/nginx/proxy_params;
        }
    }
    

    테스트
    나 는 이 설정 을 사용 하여 시험 하기 쉬 운 신뢰 할 수 있 는 구축 을 만 들 었 다.
    nginx - proxy 용 기 를 실행 합 니 다:
    $ docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock -t jwilder/nginx-proxy
    

    사용  VIRTUAL_HOST  환경 변수 가 용 기 를 시작 합 니 다:
    docker run -e VIRTUAL_HOST=foo.bar.com -t ...
    

    총결산
    docker 용기 에 nginx 역방향 프 록 시 설정 을 만 들 기 위해 Docker API 와 일부 기본 템 플 릿 자동 화 를 사용 할 수 있 습 니 다. 이 는 배 치 를 간소화 하고 가용성 을 향상 시 킬 수 있 습 니 다.
    단일 호스트 에서 실행 되 는 용기 에 매우 적합 하지만 원 격 호스트 생 성 설정 을 위해 서 는 자동 으로 발견 해 야 합 니 다.한번 보다 Docker 자동 발견 이 문제 에 대한 해결.
    업데이트: 유사 한 관점 과 변종 이 있 는 다른 글 들 이 있 습 니 다.
  • Using Nginx, Confd, and Docker for Zero-Downtime Web Update - Brian Ketelsen
  • Docker Events - Michael Crosby
  • Haproxy As A Static Reverse Proxy for Docker Containers - Oskar Hane
  • 좋은 웹페이지 즐겨찾기