通过 docker volume 共享 unix socket - 权限被拒绝

sou*_*ver 18 nginx socket docker

我尝试php5-fpm通过卷与我的nginx网络服务器共享我的套接字。Fpm 和 nginx 在不同的容器中运行,我想让它们通过共享卷工作,我将 fpm 中的套接字文件放在那里。

2014/04/13 10:53:35 [crit] 33#0: *1 connect() to unix:/container/fpm/run/php5-fpm.sock failed (13: Permission denied) while connecting to upstream, client: 192.168.8.2, server: docker.dev, request: "GET /test.php HTTP/1.1", upstream: "fastcgi://unix:/container/fpm/run/php5-fpm.sock:", host: "docker.dev"
Run Code Online (Sandbox Code Playgroud)

我已经尝试将权限设置为 777 并将组更改php5-fpm.socketwww-data.

fpm 容器的 Dockerfile

FROM ubuntu:13.10

RUN apt-get update
RUN apt-get upgrade -y
RUN apt-get install -y php5-cli php5-common
RUN apt-get install -y php5-fpm php5-cgi

ADD ./php-fpm.conf /etc/php5/fpm/php-fpm.conf
ADD ./pool.d/www.conf /etc/php5/fpm/pool.d/www.conf
ADD ./php.ini /etc/php5/fpm/php.ini

CMD ["/usr/sbin/php5-fpm"]
Run Code Online (Sandbox Code Playgroud)

nginx容器的Dockerfile

FROM ubuntu:13.10

RUN apt-get update
RUN apt-get upgrade -y
RUN apt-get install -y nginx

ADD ./test.php /var/test/test.php
ADD ./test.html /var/test/test.html
ADD ./nginx.conf /etc/nginx/nginx.conf
ADD ./site /etc/nginx/sites-enabled/test

EXPOSE 80

CMD ["/usr/sbin/nginx"]
Run Code Online (Sandbox Code Playgroud)

我可以访问,test.html但是在访问时test.php我得到 502 Bad Gateway。

通过卷共享内容时,还有什么我需要关心的权限吗?

小智 12

现在是 2015 年,我假设 Michael 提到的内核补丁现在已经进入了稳定的内核。我有一个 2 个 docker 容器的工作示例,一个使用 php-fpm,另一个使用 nginx 通过 unix 套接字相互通信。

请参阅:https : //github.com/brad-jones/conductor/tree/master/example-project

不过,它工作的关键是打开套接字的权限。

例如:listen.mode = 0777/etc/php-fpm.d/www.conf

listen.owner 和 listen.group 的设置似乎无关紧要。套接字需要完全不受限制,我猜是因为一个容器中的用户,即使它在另一个容器中具有相同的名称,仍然被视为不同的用户。

  • 根据我有限的经验,docker 无法为用户进行名称查找,或者更确切地说,这不会影响容器化架构。似乎容器中用户的 uid 才是最重要的。如果您尝试使用受限权限再次测试,请确保容器内外的 UID 匹配。 (5认同)

Mic*_*ton 6

当不同的容器位于不同的网络命名空间时,它们不能通过 UNIX 域套接字相互通信。有一个非官方的内核补丁允许这样做,但如果你使用它,你就靠自己了。