非Root模式Traefik发现其他用户启动的非Root Podman容器方案咨询
Rootless模式下Traefik跨用户发现Podman容器的可行方案
以下是几种能让system用户启动的rootless Traefik发现stack、overflow用户rootless容器的方法:
1. 共享Podman Socket并配置权限
每个非root用户的Podman socket默认在/run/user/<UID>/podman/podman.sock路径下,要让Traefik能访问其他用户的socket,需要做这些操作:
- 给stack和overflow用户的socket开放权限:把system用户加入这两个用户的主组(或者新建一个共享组,把三个用户都加进去),然后执行类似
chmod g+rwx /run/user/<stack的UID>/podman/podman.sock的命令,确保system用户有读写权限。 - 避免Podman重启后重置socket权限,可以修改
/etc/containers/containers.conf,添加socket_permissions = "0770"。 - 在Traefik配置里添加多个Docker Provider(Podman兼容Docker API),对应每个用户的socket:
providers: docker: endpoint: "unix:///run/user/<system的UID>/podman/podman.sock" exposedByDefault: false docker: endpoint: "unix:///run/user/<stack的UID>/podman/podman.sock" exposedByDefault: false docker: endpoint: "unix:///run/user/<overflow的UID>/podman/podman.sock" exposedByDefault: false - 启动Traefik时挂载这三个socket到容器内:
podman run -d \ -v /run/user/<system的UID>/podman/podman.sock:/run/user/<system的UID>/podman/podman.sock \ -v /run/user/<stack的UID>/podman/podman.sock:/run/user/<stack的UID>/podman/podman.sock \ -v /run/user/<overflow的UID>/podman/podman.sock:/run/user/<overflow的UID>/podman/podman.sock \ traefik:latest
2. 使用跨用户共享的Podman网络
通过共享网络让Traefik和其他容器处于同一网络环境,实现发现:
- 先用root用户创建一个支持rootless用户访问的共享网络:
sudo podman network create --driver bridge --rootless shared_traefik_net - 三个用户启动容器时都指定加入这个网络,同时给容器加上Traefik的启用标签:
# stack用户启动Nginx podman run -d --network shared_traefik_net --label traefik.enable=true nginx:latest # overflow用户启动WordPress podman run -d --network shared_traefik_net --label traefik.enable=true wordpress:latest # system用户启动Traefik也要加入该网络 podman run -d --network shared_traefik_net traefik:latest - 配置Traefik使用Docker Provider(基于共享网络内的容器标签),这样Traefik就能自动识别同网络内带标签的容器。
3. 手动配置静态路由(适合固定IP场景)
如果容器IP固定不变,可以直接在Traefik的静态配置文件里手动添加路由和服务,不需要自动发现:
http: routers: nginx-router: rule: "Host(`nginx.example.com`)" service: nginx-service wordpress-router: rule: "Host(`wp.example.com`)" service: wordpress-service services: nginx-service: loadBalancer: servers: - url: "http://<Nginx容器IP>:80" wordpress-service: loadBalancer: servers: - url: "http://<WordPress容器IP>:80"
这种方式灵活性差,容器重启IP变化后需要手动更新配置,适合测试或固定部署的场景。
内容的提问来源于stack exchange,提问作者Marcus
相关产品推荐
相关产品推荐

