Docker 卷上的 Unix 套接字连接被拒绝

问题描述 投票:0回答:1

我在尝试在主机和 Docker 容器之间使用 unix 套接字时似乎遇到了某种权限问题。

在正在运行的容器中,我有一个服务器正在侦听已安装卷上的 unix 套接字。当我尝试从容器的外部连接到套接字(使用已安装的卷)时,我收到 ECONNREFUSED 错误。我已经验证我正在谈论的是容器创建的套接字。

我假设我在这里缺少一些非常基本的东西来阻止它工作。

一些附加信息:

  • 运行Linux的容器(也尝试过ubuntu)
  • 我运行的是 Mac 操作系统,但是我的同事在 Linux 上也遇到了同样的问题
  • 该文件在 Docker 和我的主机之间似乎有不同的所有者(分别由 root 和我当前的用户拥有),但是两者都具有
    srwxrwxrwx
    权限。
  • 我的主机上的卷目录是在 Docker Desktop 中的
    Resources > File Sharing
    设置中设置的
  • 我们的 Docker Compose 文件已明确授予该卷的读写权限。
  • 如果我从容器中的调用套接字,它会按预期工作。

我已经阅读了 Docker Compose 中卷的几乎所有参考资料,我已经阅读了几乎所有关于该主题的教程和 Stack Overflow 帖子,而且它似乎仍然存在。

任何关于为什么这可能不起作用的想法将不胜感激!

docker docker-compose unix-socket
1个回答
0
投票

可能有不同的原因,但最有可能的是:

检查您的 Docker 容器是否使用 host 网络模式

docker inspect [container_id_or_name]

Then find the "NetworkMode" entry

在 Linux 中禁用 SELinuxAppArmor 模块或将它们配置为允许套接字通信。

您可以检查 SELinux 是否阻止套接字通信

/var/log/audit/audit.log
,如果阻止,请创建自定义策略模块以允许它。

grep your_socket_context /var/log/audit/audit.log | audit2allow -M my_socket_mod
semodule -i my_socket_mod.pp

另外,虽然套接字权限是srwxrwxrwx,但是您可以尝试更改套接字文件的所有者或将您的用户添加到docker组

sudo chmod 666 /var/run/docker.sock
sudo usermod -aG docker $USER

希望有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.