Docker

Traefik SSL 用於在非標準埠上執行的服務

  • January 10, 2021

免責聲明:我的 Docker 和 Traefik 知識很薄弱。我曾多次嘗試遵循 Traefik 文件,但我通常只是感到困惑,可能是因為我想要解決的不僅僅是最簡單的案例,而且我確信我錯過了一些基礎知識。

在我目前的設置中,我可以創建 Traefik v2 獲取的基於 Web(埠 80)的 Docker 服務,創建 LE 證書,從 http:80 重定向到 https:443,然後公開。下面是我docker-compose.yml的 Traefik 和一個有效的範例服務。

但是,假設我的基於 Web 的服務確實想在 80 以外的埠上執行。例如,我想執行statping,它在埠 8080 上執行。考慮到我目前擁有的 SSL 設置,是否有可能,將其連接起來,以便我可以公開入口點http://statping.MYTLD並依賴 Traefik:1. 重定向到https://statping.MYTLD,2 . 獲取證書,以及 3. 公開我的 statping Docker容器?即使底層服務不在埠 80 上執行,Traefik 能否處理 Acme http 挑戰?我認為它可以,因為我的工作樣本甚至沒有暴露超過容器級別的埠。

注意:我最熟悉 Docker Compose,但也許對於像 statping 這樣的服務,我需要弄清楚如何編寫自己的 DOCKERFILE 以便我可以誘使它在埠 80 而不是埠 8080 上執行?

感謝您的任何見解!

交通docker-compose.yml

version: "3.3"

networks:
 traefik:
   external: true

services:

 traefik:
   image: "traefik:v2.3"
   container_name: "traefik"
   command:
     #- "--log.level=DEBUG"
     - "--api.insecure=true"
     - "--providers.docker=true"
     - "--providers.docker.exposedbydefault=false"
     - "--entrypoints.web.address=:80"
     - "--entrypoints.websecure.address=:443"
     - "--entrypoints.web.http.redirections.entryPoint.to=websecure"
     - "--entrypoints.web.http.redirections.entryPoint.scheme=https"
     - "--entrypoints.web.http.redirections.entrypoint.permanent=true"

     - "--certificatesresolvers.myresolver.acme.httpchallenge=true"
     - "--certificatesresolvers.myresolver.acme.httpchallenge.entrypoint=web"

     # FOR TESTING.
     #- "--certificatesresolvers.myresolver.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory"

     - "--certificatesresolvers.myresolver.acme.email=craig@wereallconnected.ca"
     - "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json"

   ports:
     - "80:80"
     - "443:443"
     - "8080:8080"

   volumes:
     - "./letsencrypt:/letsencrypt"
     - "/var/run/docker.sock:/var/run/docker.sock:ro"

樣品服務docker-compose.yml

version: "3.3"

networks:
 traefik:
   external: true

services:

 whoami2:
   image: "traefik/whoami"
   container_name: "simple-service2"
   labels:
     - "traefik.enable=true"
     - "traefik.http.routers.whoami2.rule=Host(`whoami2.MYTLD`)"
     - "traefik.http.routers.whoami2.entrypoints=websecure"
     - "traefik.http.routers.whoami2.tls.certresolver=myresolver"

   networks:
     - traefik

   restart: unless-stopped

來自traefik 文件

如果一個容器暴露了多個埠,或者沒有暴露任何埠,那麼您必須通過使用標籤手動指定 Traefik 應該使用哪個埠進行通信 traefik.http.services.<service_name>.loadbalancer.server.port(在路由的專用部分中閱讀有關此標籤的更多資訊)。

因此,如果 whoami 正在偵聽 8080 並且沒有公開一個埠,則應指定標籤:

"traefik.http.services.whoami2.loadbalancer.server.port=8080"

引用自:https://serverfault.com/questions/1049286