我当前的服务器使用的用 Docker 部署的 Traefik 路由到各个服务,但是有些服务没有提供官方的 Docker 镜像,我也不想自己制作镜像,所以不是通过 Docker 部署的,而是直接在宿主机运行的。如何让 Docker 内部的 Traefik 路由到外部宿主机上的服务就成了一个问题。
经过一番研究,发现主要思路是通过额外的一个 provider 来实现。
因为单独使用 Docker 的话,就只有 Docker 作为provider,自然只能提供 Docker 内部的各项服务。所以要路由到其他服务,必须额外使用另一个 provider。根据 Traefik 文档说明,有很多 provider 可以选。这里就使用最基本的 file ,也就是一个静态配置文件作为 provider就可以了。
第一步是给 traefik 加一句启动项,大致的 docker-compose.yml文件如下
version: '3.7'
services:
traefik:
image: traefik:latest
restart: always
container_name: traefik
ports:
- '80:80'
- '443:443'
command:
- --providers.docker=true
- --providers.docker.exposedbydefault=false
- --providers.file.filename=/etc/traefik/dynamic_conf.yml
- --entrypoints.web.address=:80
- --entrypoints.web-secured.address=:443
- --certificatesresolvers.myresolver.acme.dnschallenge.provider=namedotcom
- --certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json
volumes:
- ./traefik/letsencrypt:/letsencrypt
- /var/run/docker.sock:/var/run/docker.sock
- ./traefik/dynamic_conf.yml:/etc/traefik/dynamic_conf.yml
第二步就是在配置文件里额外写好外部的服务,更多细节参考文档 https://doc.traefik.io/traefik/providers/file/
http:
routers:
cqhttp:
entryPoints:
- web-secured
service: myservice
rule: Host(`myservice.example.com`)
tls:
certresolver: myresolver
services:
myservice:
loadBalancer:
servers:
- url: http://172.20.0.1:5700/
另外,本地宿主的ip可以用下面这句来获取
ip -4 addr | grep -oP '(?<=inet\s)\d+(\.\d+){3}'
参考资料: