TL:博士:尝试通过Podman套接字使用无根podman与码头组合,并使用Traefik容器(与podman套接字对话)代理与https://stackoverflow.com/a/73774327/1469083相关的其他容器的流量。
我获得了被拒绝的权限错误,我可以用特权容器修复这些错误,我不想使用这些错误。
设置
我在RHEL 8上跑
$ cat /etc/redhat-release
Red Hat Enterprise Linux release 8.6 (Ootpa)Podman预装好了,我添加了坞-撰写(“独立”)和podman:
$ curl -SL https://github.com/docker/compose/releases/download/v2.10.2/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
$ chmod a+x /usr/local/bin/docker-compose
$ sudo yum install podman-docker激活无根的podman套接字,以便podman和docker撰写人可以相互交谈:
$ systemctl --user enable podman.socket
$ systemctl --user start podman.socket
$ systemctl --user status podman.socket
$ export DOCKER_HOST=unix:///run/user/$UID/podman/podman.sock
$ echo $DOCKER_HOST
unix:///run/user/1001/podman/podman.sock我还将网络后端切换到netavark,如果没有这种更改,DNS就无法工作。
$ podman info |grep -i networkbackend
networkBackend: netavark问题
首先,我尝试了使用https://stackoverflow.com/a/73774327/1469083编写堆栈,并做了一些小修改:
version: "3"
services:
frontend:
image: "docker.io/traefik:v2.8"
ports:
- "3000:80"
- "127.0.0.1:3080:8080"
command:
- --api.insecure=true
- --providers.docker
volumes:
- /run/user/$UID/podman/podman.sock:/var/run/docker.sock
backend:
labels:
traefik.http.routers.backend.rule: Host(`localhost`)
image: "tomcat:latest"
scale: 3我的安装程序没有欣赏$UID变量:
WARN[0000] The "UID" variable is not set. Defaulting to a blank string.
...
Error response from daemon: make cli opts(): error making volume mountpoint for volume /run/user//podman/podman.sock: mkdir /run/user//podman: permission denied我用硬编码的UID=1001替换了卷映射(它是运行无根播客的用户的UID,我以为我应该使用那个?)。套接字如下所示:
ls -la /run/user/1001/podman/podman.sock
srw-rw----. 1 myrootlessuser myrootlessuser 0 22. 9. 11:28 /run/user/1001/podman/podman.sock
volumes:
- /run/user/1001/podman/podman.sock:/var/run/docker.sock但是,现在我从试图连接到/var/run/docker.sock的Traefik获得了被拒绝的权限,但没有成功:
example-docker-compose-frontend-1 | time="2022-09-22T12:04:52Z" level=error msg="Provider connection error Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get \"http://%2Fvar%2Frun%2Fdocker.sock/v1.24/version\": dial unix /var/run/docker.sock: connect: permission denied, retrying in 5.656635591s" providerName=docker如果我将Traefik容器更改为privileged: true,就会解决这个问题。我再也不明白错误了,代理就像它应该做的。
但是,出于安全原因,我不愿意使用特权容器,或者至少理解为什么会出现这种情况。
问题
$ sudo curl -H "Content-Type: application/json" --unix-socket /var/run/docker.sock http://localhost/_ping
curl: (7) Couldn't connect to server
systemctl --user enable podman.socket等)?我只找到了一些关于这方面的博客,建议也各不相同,而且通常是针对较老的Podman版本。例如:podman.socketpodman.service发布于 2022-09-22 15:45:48
问题1和2
如果你正在使用
export DOCKER_HOST=unix:///run/user/$UID/podman/podman.sock您正在使用无根(非特权) Podman (即使您在撰写文件中指定了privileged: true )。
要在容器中使用泄漏的套接字,需要使用命令行选项--security-opt label=disable运行--security-opt label=disable。
示例:
启动并启用podman套接字
$ systemctl --user enable --now podman.socket
Created symlink /home/testuser/.config/systemd/user/sockets.target.wants/podman.socket → /usr/lib/systemd/user/podman.socket.测试Docker服务。结果:失败。卷曲印Couldn't connect to server
$ podman run --rm \
-v $XDG_RUNTIME_DIR/podman/podman.sock:/var/run/docker.sock \
docker.io/library/fedora \
/usr/bin/curl \
-H "Content-Type: application/json" \
--unix-socket /var/run/docker.sock \
http://localhost/_ping
curl: (7) Couldn't connect to server再次测试Docker服务,但现在添加--security-opt label=disable。结果:成功
$ podman run --rm \
--security-opt label=disable \
-v $XDG_RUNTIME_DIR/podman/podman.sock:/var/run/docker.sock \
docker.io/library/fedora \
/usr/bin/curl \
-Hs "Content-Type: application/json" \
--unix-socket /var/run/docker.sock \
http://localhost/_ping
OK$Docker服务响应文本字符串OK。
(在上面的命令中,我还添加了curl选项-s,以便curl打印更少的调试输出)
我猜想,将--privileged添加到复合文件中与向podman run提供privileged: true命令行选项具有相同的效果。
使用--privileged的效果之一是它意味着-安全-选择label=disable。
问题3
摘要:
这就够跑了
$ systemctl --user start podman.socket为无根Podman设置UNIX套接字。
没有必要,但是如果你除了跑步
$ systemctl --user start podman.servicepodman.service将立即启动(甚至在第一个客户端连接到UNIX之前)。
较长版本:
如果podman.socket是活动的,那么podman.service将在客户端连接时启动。(Podman支持套接字激活)
如果启用了podman.service (systemctl --user enable podman.service)并且启用了挥之不去(loginctl enable-linger),那么在重新启动之后也会启动podman.service。
如果启用了podman.service (systemctl --user enable podman.service),则当用户登录时也会启动podman.service。
在podman.service中运行的podman进程将在一段时间不活动后自动退出(默认为5秒)。
在Fedora 36计算机上,Restart指令被设置为no (默认值):
$ grep Restart= /usr/lib/systemd/user/podman.service
$ 这意味着这并不重要
systemctl --user enable podman.service是否已经运行过。如果没有客户端访问,服务podman.service将在5秒内停止。
https://stackoverflow.com/questions/73814619
复制相似问题