我正在尝试将我的一个开发程序从centos 8迁移到RHEL9。我严重依赖于码头,并注意到,当我试图运行一个码头命令,在RHEL盒,它安装了podman。这似乎进展顺利;我能够使用我已经知道的docker命令来提取映像、启动、构建、提交一个新版本,而不出问题。
不过,我遇到的问题是,我似乎无法通过端口套接字与其交互(这似乎是与podman套接字的链接)。
如果我运行docker命令:
[@rhel9 ~]$ docker images
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/redhat/ubi9 dev_image de371523ca26 6 hours ago 805 MB
docker.io/redhat/ubi9 latest 9ad46cd10362 6 days ago 230 MB它列出了我所期望的图片。我也应该能跑:
[@rhel9 ~]$ curl --unix-socket /var/run/docker.sock -H 'Content-Type: application/json' http://localhost/images/json | jq .
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 3 100 3 0 0 55 0 --:--:-- --:--:-- --:--:-- 55
[]但正如你所看到的,什么都不会回来。套接字已经启动并正在运行,因为我可以在没有问题的情况下将它平平:
[@rhel9 ~]$ curl -H "Content-Type: application/json" --unix-socket /var/run/docker.sock http://localhost/_ping
OK我还直接使用podman套接字尝试了curl命令,但结果是相同的。是否有什么是我遗漏的,或者是让它开始工作的窍门,这样我就可以通过套接字与码头/播客互动?
发布于 2022-06-21 11:48:22
我设法解决了我的问题,尽管我不完全确定这种情况是如何发生的。我正在查看docker info和podman info的输出,并注意到它们都将远程套接字设置为:
remoteSocket:
exists: true
path: /run/user/1000/podman/podman.sock而不是我所认为的/run/podman/podman.sock (这个套接字实际上存在于我的机器上)。查看podman.socket的systemd文件,我可以看到套接字被指定为%t/podman/podman.sock,并检查手册页中的podman-system-service,它将无根套接字指定为unix://$XDG_RUNTIME_DIR/podman/podman.sock (其中是my $XDG_RUNTIME_DIR=/run/user/1000 )。
为了让所有这些都与我的软件一起工作,我只需要确保DOCKER_HOST env变量的设置是正确的,例如export DOCKER_HOST=unix:///run/user/1000/podman/podman.sock
发布于 2022-06-20 21:18:11
Podman不是使用Docker这样的客户机/服务器模型实现的。默认情况下,不存在套接字,因为没有与docker守护进程等效的套接字。Podman确实提供了一个兼容接口,您可以通过启用podman.socket单元来使用该接口:
$ systemctl enable --now podman.socket这将在/run/podman/podman.sock上公开响应Docker命令的Unix套接字。但!
套接字将您连接到以根用户身份运行的podman,而您一直以非根用户的身份运行podman:因此您不会看到图像、容器、网络等相同的列表。
一些随机的注释:
默认情况下,
root的形式运行Podman,在这种情况下,这种行为更像是Docker。podman-docker (并使用docker-compose之类的东西),尽管我偶尔会遇到这样的问题。我通常只使用podman,并在VM中运行坞引擎)。您需要配置Docker来查看/run/podman/podman.sock.中的podman套接字
我已经在我的系统上启用了podman.socket,所以这是可行的:
$ curl --unix-socket /run/podman/podman.sock -H 'content-type: application/json' http://localhost/_ping
OK或者:
$ curl --unix-socket /run/podman/podman.sock -H 'content-type: application/json' -sf http://localhost/containers/json | jq
[
{
"Id": "f0d9a880c45bb5857b24f46bcb6eeeca162eb68d574c8ba16c4a03703c2d60f4",
"Names": [
"/sleeper"
],
"Image": "docker.io/library/alpine:latest",
"ImageID": "14119a10abf4669e8cdbdff324a9f9605d99697215a0d21c360fe8dfa8471bab",
"Command": "sleep inf",
"Created": 1655418914,
"Ports": [],
"Labels": {},
"State": "running",
"Status": "Up 3 days",
"NetworkSettings": {
"Networks": {
"podman": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "podman",
"EndpointID": "",
"Gateway": "10.88.0.1",
"IPAddress": "10.88.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "06:55:82:1b:1a:41",
"DriverOpts": null
}
}
},
"Mounts": null,
"Name": "",
"Config": null,
"NetworkingConfig": null,
"Platform": null,
"AdjustCPUShares": false
}
]https://stackoverflow.com/questions/72690495
复制相似问题