모든 도커 컨테이너에 letsencrypt 인증서 설치

동일한 서버에서 실행되는 컨테이너를 처리할 때 다음과 같은 문제가 발생할 수 있습니다.

How do I give each of the containers its own domain/subdomain? and how do I do it securely?



우선, 이 문제는 여러 가지 방법으로 해결할 수 있으며 어느 쪽도 다른 것보다 더 정확하지 않습니다. 다음을 사용하여 빠르고 쉬운 방법을 보여 드리겠습니다.
  • 도커
  • Traefik
  • Letsencrypt

  • 자동으로 수행됩니다.

    설정



    두 개의 서비스를 설정하고 싶다고 가정해 보겠습니다.


    서비스
    도메인
    포트


    그라파나
    grafana.mydomain.com
    80, 443

    인플럭스DB
    influx.mydomain.com
    8086


    ⚠ This setup is just for testing purposes: any docker container will work with this method (wordpress, mariaDB, mongoDB, ELK stack, Minecraft server, custom images...)


  • Grafana: influxDB를 포함하여 인상적인 소스 배열의 데이터를 표시할 수 있는 놀라운 모니터링 도구입니다. 다른 곳에서 설정한 일부 서비스를 모니터링하고 싶다고 가정해 봅시다!
  • InfluxDB: 시간 이벤트를 저장할 수 있는 시간 기반 DB입니다(예: n초마다 CPU 온도 또는 드라이브의 IO 작업 수).

  • 각 컨테이너에 고유한 도메인/하위 도메인을 지정하려면 어떻게 해야 합니까?



    실행 중인 설정에 따라 다릅니다.

    a) VPS와 같은 공개 고정 IP를 사용하는 서버에서 모두 실행합니다.



    쉬운! DNS 설정으로 이동하여 각 도메인/하위 도메인에 대해 A record를 만드십시오. 이 경우 둘 다 동일한 IP 주소를 가리킵니다.

    약간 덜 반복적인 접근 방식은 A record를 통해 도메인 중 하나를 IP 주소로 가리키고 다른 모든 도메인은 CNAME records를 통해 해당 도메인을 가리킵니다. 이렇게 하면 IP 주소가 변경되면 한 번만 변경하면 됩니다!

    b) 공개 IP에서 실행하지만 때때로 변경됩니다.



    이 시나리오는 예를 들어 집에서 호스트하고 ISP에서 할당한 공용 IP 주소가 주기적으로 변경되는 경우에 적용됩니다. 이 문제를 피하기 위해 자세히 설명하지 않을 몇 가지 가능성이 있지만 쉽게 따라할 수 있습니다. IT는 집에 있는 서버가 DNS 공급자와 통신하도록 하여 변경될 때마다 공용 IP를 알려주므로 그에 따라 DNS 항목이 변경될 수 있습니다.

    이 작업을 직접 수행할 필요가 없으므로 걱정하지 마십시오. 빠른 시작을 위해 온라인에서 검색하십시오.
  • duckdns와 같은 서비스를 이용하세요
  • Cloudfare 동적 IP 서비스

  • 모든 DNS 항목이 동일한 IP 주소로 확인되는 경우 내 서버는 어떤 컨테이너를 가리킬지 어떻게 알 수 있습니까?



    그것이 traefik가 들어오는 곳입니다!

    1단계) traefik용 docker-compose.yml 파일 생성



    여기에 작은 템플릿, 그에 따라 매개변수를 변경하십시오!

    version: "3"
    
    services:
      traefik:
        image: traefik
        container_name: traefik
        ports:
          - "80:80"         # HTTP port for grafana
          - "443:443"       # HTTPS port for grafana
          - "8086:8086"     # Exposed port for influxDB
    
          # expose port below only if you need access to the Traefik API
          #- "8080:8080"
        command:
          #- "--log.level=DEBUG"
          #- "--api=true"
          - "--providers.docker=true"
    
          - "--entryPoints.port443.address=:443"
          - "--entryPoints.port80.address=:80"
          - "--entryPoints.port8086.address=:8086"
    
          - "--certificatesResolvers.le-ssl.acme.tlsChallenge=true"
          - "[email protected]"
          - "--certificatesResolvers.le-ssl.acme.storage=/letsencrypt/acme.json"
        volumes:
          - traefik-data:/letsencrypt/
          - /var/run/docker.sock:/var/run/docker.sock
        restart: always
    
    volumes:
      traefik-data:
    
    


    간단하지 않습니까? 당신이 그것을 실행하면

    docker-compose up
    


    많이 변경되지 않았음을 알 수 있습니다. 이는 컨테이너 정의에서 하위 도메인 자체를 설정해야 하기 때문입니다.

    2단계) 각 컨테이너의 특정 구성 추가



    예를 들어 grafana 및 influxDB는 다음과 같이 보일 수 있습니다.

    version: "3"
    
    services:
      influx:
        image: influxdb:1.7 # or any other recent version
        labels:
          # SSL endpoint
          - "traefik.http.routers.influx-ssl.entryPoints=port8086"
          - "traefik.http.routers.influx-ssl.rule=host(`influx.mydomain.com`)"
          - "traefik.http.routers.influx-ssl.tls=true"
          - "traefik.http.routers.influx-ssl.tls.certResolver=le-ssl"
          - "traefik.http.routers.influx-ssl.service=influx-ssl"
          - "traefik.http.services.influx-ssl.loadBalancer.server.port=8086"
        restart: always
        container_name: influxdb
        volumes:
          - influx-data:/var/lib/influxdb
        environment:
          # - INFLUXDB_DB=
          - INFLUXDB_HTTP_ENABLED=true
          - INFLUXDB_HTTP_AUTH_ENABLED=true
    
          # - INFLUXDB_ADMIN_USER=
          # - INFLUXDB_ADMIN_PASSWORD=
    
      grafana:
        labels:
          # SSL redirect requires a separate router (https://github.com/containous/traefik/issues/4688#issuecomment-477800500)
          - "traefik.http.routers.grafana.entryPoints=port80"
          - "traefik.http.routers.grafana.rule=host(`grafana.mydomain.com`)"
          - "traefik.http.middlewares.grafana-redirect.redirectScheme.scheme=https"
          - "traefik.http.middlewares.grafana-redirect.redirectScheme.permanent=true"
          - "traefik.http.routers.grafana.middlewares=grafana-redirect"
          # SSL endpoint
          - "traefik.http.routers.grafana-ssl.entryPoints=port443"
          - "traefik.http.routers.grafana-ssl.rule=host(`grafana.mydomain.com`)"
          - "traefik.http.routers.grafana-ssl.tls=true"
          - "traefik.http.routers.grafana-ssl.tls.certResolver=le-ssl"
          - "traefik.http.routers.grafana-ssl.service=grafana-ssl"
          - "traefik.http.services.grafana-ssl.loadBalancer.server.port=3000"
        image: grafana/grafana
        container_name: grafana
        restart: always
        volumes:
          - grafana-data:/var/lib/grafana
        environment:
          - GF_SERVER_ROOT_URL=https://grafana.mydomain.com
          - GF_SERVER_DOMAIN=grafana.mydomain.com
          - GF_USERS_ALLOW_SIGN_UP=false
    volumes:
      traefik-data:
      influx-data:
      grafana-data:
    
    


    다음 사항에 유의하십시오.
  • grafana 및 influxDB의 일반적인 구성에 여러 레이블을 추가했습니다.
  • grafana의 포트 80이 HTTPS 포트 443으로 리디렉션됩니다.
  • traefik-data 볼륨도 포함되었습니다

  • letsencrypt가 마지막으로 한 가지를 요구하기 때문에 이것을 실행하면 여전히 작동하지 않습니다.

    인증서 생성



    letsencrypt가 필요한 인증서를 생성하려면 여기에서 주장하는 도메인이 우리 도메인인지 확인해야 합니다. 그렇게 하려면 각 하위 도메인에 대해 하나 이상의 DNS 항목을 추가해야 합니다.



    각 항목은 다음과 같아야 합니다.
  • 유형: CAA
  • 이름: 전체 FQDN이 아닌 하위 도메인 이름(이 경우 grafanainflux만)
  • 플래그: 0
  • TTL: 자동
  • 태그: 특정 호스트 이름만 허용
  • CA 도메인 이름: letsencrypt.org

  • 완료!



    그게 다야! 통해 모든 컨테이너 실행

    docker-compose up
    


    (분리 모드의 경우 -d 추가)
    https://grafana.mydomain.com로 이동하여 사용자 정의 도메인 및 TLS로 작업 중인 grafana를 확인하십시오!

    읽어 주셔서 감사합니다!

    사랑스러운 하루!

    좋은 웹페이지 즐겨찾기