内网docker使用traefik作为网关

由于内网docker上跑了一些服务,但是发现经常不记得它们的端口号,于是很多时候直接就把它们忘掉了,也就偶尔记得一些常用的。遂决定上traefik来用域名去访问它们。

配置泛域名解析

最好是有一个没啥用的域名,如果域名已经在其他地方用了,那就要保证添加的泛域名不要把原来的解析记录给搞失效了,比如我的域名就已经配置过泛域名了。于是随便找了个linx.com的,用来在内网使用,没打算上https,所以问题不大。

由于内网已有mosdns服务,直接在mosdns的hosts.txt 增加一条 domain:linx.com 10.10.0.16

随便ping一个 xxx.linx.com 测试下看看

配置traefik容器

  • image: traefik:latest

  • command:

    1
    2
    3
    4
    5
    6
    7
    8
    
    '--api=true' 
    '--api.dashboard=true' 
    '--api.insecure=true' 
    '--entrypoints.http.address=:80' 
    '--providers.docker=true' 
    '--providers.docker.endpoint=unix:///var/run/docker.sock' 
    '--providers.docker.exposedbydefault=true' 
    '--providers.docker.defaultrule=Host(`{{ .ContainerName }}.linx.com`)'
    

最后两行的意思是,反代所有容器,并且以 容器名.linx.com 的方式访问,这样就无需到每个容器里都增加labels了

  • volume: /var/run/docker.sock:/var/run/docker.sock

  • network: host

    由于还有一些服务是docker compose运行的,不想把这些都跑在一个network下,于是就偷个懒

  • labels:

    1
    2
    3
    4
    5
    6
    
    traefik.http.routers.traefik-dashboard-api.entrypoints=http
    traefik.http.routers.traefik-dashboard-api.rule=Host(`linx.com`) && PathPrefix(`/api`)
    traefik.http.routers.traefik-dashboard-api.service=api@internal
    traefik.http.routers.traefik-dashboard.entrypoints=http
    traefik.http.routers.traefik-dashboard.rule=Host(`linx.com`)
    traefik.http.routers.traefik-dashboard.service=dashboard@internal
    
  • restart: unless-stoped

手动指定端口

如果一个容器有多个端口,然后它运行时,你发现它的第一个端口(docker ps)不是你要的端口,则需要手动指定端口,通过labels设置即可

`traefik.http.services.emby-emby.loadbalancer.server.port=8096`
docker compose创建的服务,在traefik中会以 `堆栈名-服务名` 的形式存在

docker compose 下是这样的

1
2
labels:
  - "traefik.http.services.emby-emby.loadbalancer.server.port=8096"
Licensed under CC BY-NC-SA 4.0
记录平时瞎折腾遇到的各种问题, 方便查找
使用 Hugo 构建
主题 Stack 3.29.0Jimmy 设计