通过Docker卷共享Unix套接字 - 权限被拒绝

我试图通过一个卷与我的nginx web服务器共享我的php5-fpm套接字。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"

我已经尝试将权限设置为777并将php5-fpm.socket的组更改为www-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"]
Docker容器的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"]

我可以访问 test.html,但是当访问 test.php 时,我得到502错误。

在通过卷共享东西时,是否还有其他权限方面的注意事项?


你怎么开始这些容器? - cpuguy83
请检查包含目录的权限。 - Aryeh Leib Taurog
3个回答

现在是2015年,我假设Michael提到的内核补丁现在已经被合并到稳定的内核中。我有一个工作示例,其中包含两个Docker容器,一个使用php-fpm,另一个使用nginx,它们通过Unix套接字进行通信。 请参见:https://github.com/brad-jones/conductor/tree/master/example-project 关键是要打开套接字的权限。 例如,在/etc/php-fpm.d/www.conf中设置listen.mode = 0777 似乎无论设置了什么listen.owner和listen.group,都没有关系。 套接字需要完全不受限制,我猜这是因为即使在另一个容器中具有相同名称的用户,也被视为不同的用户。

6根据我的有限经验,Docker 无法为用户进行名称查找,或者说这并不是容器化架构的考虑因素。似乎容器中用户的 UID 是唯一重要的。如果您尝试使用受限权限再次进行测试,请确保容器内外的 UID 匹配。 - ThorSummoner

不同的容器在不同的网络命名空间中无法通过UNIX域套接字进行通信。有一个非官方的内核补丁unofficial kernel patch可以实现这一点,但如果你使用它,就要自己承担风险。

嗯,解释一下?能把它们放在同一个命名空间里吗? - Steven Linn
@StevenLinn 当人们需要共享UNIX域套接字时,通常的做法是创建一个包含套接字的卷,并将其共享给两个容器。然而,在大多数情况下,包括这个问题中的情况,容器之间应该通过IP进行通信。 - Michael Hampton

fpm容器中添加./test.php /var/test/test.php PHP必须被解释才能显示,对吧?