一个动态的 docker->redis->traefik 发现代理。
解决了在非 Swarm/Kubernetes 多主机集群中运行单个面向公众的 traefik 实例的问题。
+---------------------+ +---------------------+
| | | |
+---------+ :443 | +---------+ | :8088 | +------------+ |
| WAN |------------->| traefik | | | | svc-nginx | |
+---------+ | +---------+ | | +------------+ |
| | | | | |
| +---------+ | | +-------------+ | |
| | redis |<----------------| traefik-kop | | |
| +---------+ | | +-------------+ | |
| docker1 | | docker2 | |
+---------------------+ +---------------------+
traefik-kop 通过使用与 traefik docker-provider 相同的逻辑来解决此问题。它从本地 docker 节点读取容器标签,并将其发布到指定的 redis 实例。只需为 traefik 节点配置 redis 提供程序,并将其指向同一个实例,如上图所示。
traefik-kop 的自定义 IP 和端口自动检测可通过传递 --skip-replace 标志或设置 SKIP_REPLACE=1 环境变量来禁用。设置后,traefik-kop 将完全依赖 traefik 的原生 IP 和端口检测。其他相关标志(如 --bind-ip 或 --bind-interface)将不起作用。
--skip-replace SKIP_REPLACE=1 traefik-kop --bind-ip --bind-interface
当您的服务使用覆盖网络时(如上文“容器网络”部分所述),此配置效果最佳。
将 traefik 配置为使用 redis 提供程序,例如通过 traefik.yml:
providers:
providersThrottleDuration: 2s
docker:
watch: true
endpoint: unix:///var/run/docker.sock
swarmModeRefreshSeconds: 15s
exposedByDefault: false
redis:
endpoints:
# 假设在与 traefik 相同的 docker 主机上运行着以此服务名链接的 redis
- "redis:6379"
通过 docker-compose 在其他节点上运行 traefik-kop:
services:
traefik-kop:
image: "ghcr.io/jittering/traefik-kop:latest"
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- "REDIS_ADDR=192.168.1.50:6379"
- "BIND_IP=192.168.1.75"
# 或者,从接口获取(需要 network_mode: host)
# - "BIND_INTERFACE=eth0"
然后为目标服务添加常用标签:
services:
nginx:
image: "nginx:alpine"
restart: unless-stopped
ports:
# 主机端口绑定将自动被选为服务端点。更多信息见配置部分的“服务端口绑定”。
- 8088:80
labels:
- "traefik.enable=true"
- "traefik.http.routers.nginx.rule=Host(`nginx-on-docker2.example.com`)"
- "traefik.http.routers.nginx.tls=true"
- "traefik.http.routers.nginx.tls.certresolver=default"
# [可选] 显式设置此服务的端口绑定。更多信息见配置部分的“服务端口绑定”。
- "traefik.http.services.nginx.loadbalancer.server.scheme=http"
- "traefik.http.services.nginx.loadbalancer.server.port=8088"
另请参见下文的 IP 绑定 部分。
traefik-kop 能够通过命名空间定位容器。只需为 kop 配置一个命名空间:
services:
traefik-kop:
image: "ghcr.io/jittering/traefik-kop:latest"
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- "REDIS_ADDR=192.168.1.50:6379"
- "BIND_IP=192.168.1.75"
- "NAMESPACE=staging"
然后将 kop.namespace 标签添加到目标服务,以及常规的 traefik 标签:
services:
nginx:
image: "nginx:alpine"
restart: unless-stopped
ports:
- 8088:80
labels:
- "kop.namespace=staging"
- "traefik.enable=true"
- "traefik..."
可以通过逗号分隔值来使用多个命名空间。只要找到容器的其中一个命名空间,Traefik-kop 就会包含该容器。
services:
traefik-kop:
# ...
environment:
# 会暴露具有 'dev' 或 'staging' 命名空间的任何服务
- "NAMESPACE=dev,staging"
services:
nginx:
# ...
labels:
# 会被暴露,因为它具有 'staging' 命名空间
- "kop.namespace=staging,experimental"
另一种实现命名空间的方法是为 traefik 相关标签添加自定义前缀。这对 traefik-kop 而言是一个包含过滤器,对 traefik 而言是一个排除过滤器。当您在同一主机上同时运行 traefik 和 traefik-kop 时,这会非常有用。
services:
nginx:
labels:
- "traefik.enable=true"
- "traefik.http.routers..."
- "traefik..."
变为
services:
traefik-kop:
image: "ghcr.io/jittering/traefik-kop:latest"
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- "REDIS_ADDR=192.168.1.50:6379"
- "BIND_IP=192.168.1.75"
- "DOCKER_PREFIX=kop.public"
nginx:
labels:
- "kop.public.traefik.enable=true"
- "kop.public.traefik.http.routers..."
- "kop.public.traefik..."
配置Sentinel时,--redis-addr标志将被忽略。必须同时提供--redis-sentinel-addrs和--redis-sentinel-master。--redis-user、--redis-pass和--redis-db标志仍然适用,用于通过Sentinel发现的Redis主节点进行身份验证。
要发布新版本,只需向GitHub推送新标签。
git push
git tag -a v0.11.0
git push --tags
更新变更日志:
make update-changelog
# 或(替换下方标签)
docker run -it --rm -v "$(pwd)":/usr/local/src/your-app \
githubchangeloggenerator/github-changelog-generator \
-u jittering -p traefik-kop --output "" \
--since-tag v0.10.1
traefik-kop:MIT许可协议,(c) 2015,Pixelcop Research, Inc.。
traefik:MIT许可协议,(c) 2016-2025 Containous SAS;2020-2022 Traefik Labs。
探索更多轩辕镜像的使用方法,找到最适合您系统的配置方式
通过 Docker 登录认证访问私有仓库
无需登录使用专属域名
Kubernetes 集群配置 Containerd
K3s 轻量级 Kubernetes 镜像加速
VS Code Dev Containers 配置
Podman 容器引擎配置
HPC 科学计算容器配置
ghcr、Quay、nvcr 等镜像仓库
Harbor Proxy Repository 对接专属域名
Portainer Registries 加速拉取
Nexus3 Docker Proxy 内网缓存
需要其他帮助?请查看我们的 常见问题Docker 镜像访问常见问题解答 或 提交工单
docker search 限制
站内搜不到镜像
离线 save/load
插件要用 plugin install
WSL 拉取慢
安全与 digest
新手拉取配置
镜像合规机制
不支持 push
manifest unknown
no matching manifest(架构)
invalid tar header(解压)
TLS 证书失败
DNS 超时
域名连通性排查
410 Gone 排查
402 与流量用尽
401 认证失败
429 限流
D-Bus 凭证提示
413 与超大单层
来自真实用户的反馈,见证轩辕镜像的优质服务