免責聲明:我的 Docker 和 Traefik 知識很薄弱。我曾多次嘗試遵循 Traefik 文檔,但通常會感到困惑,可能是因為我想要解決的不僅僅是最簡單的情況,而且我確信我缺少一些基礎知識。
在我目前的設定中,我可以建立一個基於 Web(連接埠 80)的 Docker 服務,Traefik v2 會選擇該服務,建立 LE 證書,從 http:80 重定向到 https:443,然後公開。下面是我的docker-compose.yml
Traefik 以及一個有效的範例服務。
但是,假設我的基於 Web 的服務確實希望在 80 之外的連接埠上執行。統計,它在連接埠 8080 上運行。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
答案1
來自traefik 文件:
如果容器公開多個端口,或不公開任何端口,則必須使用標籤手動指定 Traefik 應使用哪個端口進行通信
traefik.http.services.<service_name>.loadbalancer.server.port
(在路由的專用部分中閱讀有關此標籤的更多資訊)。
因此,如果 whoami 正在監聽 8080 並且沒有暴露一個端口,您應該指定標籤:
"traefik.http.services.whoami2.loadbalancer.server.port=8080"