我正在将 Traefik 设置为一堆 Docker 服务的反向代理。以下是我运行 Traefik 的方式:
services:
traefik:
image: traefik:v3.0.4
container_name: traefik
command:
# Set log level to debug
- --log.level=DEBUG
# Enable Docker provider
- --providers.docker=true
# Do not expose containers unless explicitly told so
- --providers.docker.exposedByDefault=false
# Enable File provider
- --providers.file=true
# Specify the self-signed key configuration
- --providers.file.filename=/conf/tls.yml
# Traefik will listen to incoming request on port 80 (HTTP)
- --entryPoints.web.address=:80
# Traefik will listen to incoming request on port 443 (HTTPS)
- --entryPoints.websecure.address=:443
# Redirect HTTP traffic to HTTPS
- --entrypoints.web.http.redirections.entryPoint.to=websecure
- --entrypoints.web.http.redirections.entryPoint.scheme=https
- --entrypoints.web.http.redirections.entrypoint.permanent=true
restart: unless-stopped
ports:
- 80:80
- 443:443
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./certs:/certs
- ./conf:/conf
networks:
- proxy
networks:
proxy:
name: proxy
Traefik 启动并运行后,我添加了我的第一个 Web 应用程序,并且 我成功地从浏览器打开了该应用程序。然后我添加了第二个和第三个网络应用程序,但在它们上都找不到 404。以下是我运行其中一个的方式:
services:
portainer:
image: portainer/portainer-ce:2.20.2
container_name: portainer
restart: unless-stopped
labels:
# Explicitly tell Traefik to expose this container
- traefik.enable=true
# The domain the service will respond to
- traefik.http.routers.portainer.rule=Host(`portainer.somedomain.lan`)
# Allow request only from the predefined entry point named "websecure" (HTTPS on port 443)
- traefik.http.routers.portainer.entrypoints=websecure
- traefik.http.routers.portainer.tls=true
# Specify which port Traefik should use for communicating to the service
- traefik.http.services.portainer.loadbalancer.server.port=9000
volumes:
- portainer-data:/data
- /var/run/docker.sock:/var/run/docker.sock
networks:
- proxy
volumes:
portainer-data:
networks:
proxy:
name: proxy
external: true
当我进行卷曲时,我得到以下信息:
# HTTP
$ curl -ki portainer.somedomain.lan
HTTP/1.1 301 Moved Permanently
Location: https://portainer.somedomain.lan/
Date: Wed, 31 Jul 2024 15:27:45 GMT
Content-Length: 17
Moved Permanently
这是预料之中的,因为我如何设置 Traefik 将 HTTP 流量重定向到永久移动的 HTTPS。但是,当我使用 https 执行卷曲时:
# HTTPS
$ curl -ki https://portainer.somedomain.lan
HTTP/2 404
content-type: text/plain; charset=utf-8
x-content-type-options: nosniff
content-length: 19
date: Wed, 31 Jul 2024 15:31:14 GMT
404 page not found
我已将您的 traefik 和 portainer 设置一起复制到 docker-compose 文件中并成功运行。您的问题一定出在其他地方。
您是否事先运行了 portainer 并单击了“仅强制 HTTPS”设置? 在这种情况下,您需要更正您的 traefik 服务以指向 9443。
无论如何,我建议您尝试以下操作,看看端口 9000 是否是问题所在:
- traefik.http.services.portainer.loadbalancer.server.port=9443
- traefik.http.services.portainer.loadbalancer.server.scheme=https
或者,您可能想放弃 portainer 数据卷并尝试使用干净的状态。
您可能遇到的问题是,您在第一个 docker compose 文件中引用网络“代理”,并在第二个文件中定义它。以错误的顺序启动或停止这些会导致问题。
创建静态 docker 网络来避免这种情况:
docker network create proxy