问题
前几天在另一台服务器上通过docker部署wekan,执行
docker-compose up -d
没有报错,但是curl却无法访问。
接着我尝试
docker-compose up
在前台运行容器,以便查看容器输出的信息。果然有一个报错
wekan-db1 | chown: cannot dereference '/proc/1/fd/1': Permission denied
。
解决
搜索issue
这个报错来自wekan-db1这个容器,db使用的是MongoDB,于是我在
https://github.com/docker-library/mongo/issues
中仔细搜索了下,果然有这个issue,解决方法是添加
--user mongodb
参数。
于是我按照issue的解决方法,先用docker run的方式另外创建一个mongo容器,创建并运行命令为
docker run --user mongodb --name mongo-test mongo:latest
,果然没有那个报错。而使用不带
--user mongodb
参数的
docker run --name mongo-test mongo:latest
是会有那个报错的。
于是我更加确定了,就是因为缺少
--user mongodb
导致的。
于是我尝试在
docker-compose.yml
文件中添加该配置,由于自己还不是很熟
docker compose
,经过各种尝试配置的
--user mongodb
都是不对的。
同时我也在docker的官方文档中以及Google中都搜索了,没有找到解决方法。或许是我眼花,其实官网有答案,只是我没看到。
提issue
虽然这个属于
docker compose
的知识点,本不该在mongo中提issue的,没办法,由于时间紧迫,我就提了个issue
chown: cannot dereference ‘/proc/1/fd/1’: Permission denied #465
。
过了2天终于有人回答了:
我按照他说的查阅了docker的文档,并在
docker-compose.yml
文件中
weandb
下添加了
user: mongodb
。然后再次up,如果没有报错了。
但是执行curl还是不能访问。
此时我要奔溃了。
于是我仔细再看了一下他的回答,其中说到:
My guess is the error chown: cannot dereference ‘/proc/1/fd/1’: Permission denied is from the host’s SELinux or AppArmor, I’m not able to reproduce
说的就是是不是防火墙(SELinux or AppArmor)导致的权限不足。
测试Tomcat
我想运行Tomcat容器是不是也有问题呢?
于是,运行如下命令进行测试:
docker run --name tomcat -d -p 8082:8080 tomcat
果然curl访问失败,没有任何返回。
这个测试让我加大了对防火墙的怀疑。
关闭SELinux和AppArmor
-
查看是否安装SELinux
-
查看SELinux是否开启
SELinux为关闭状态。 -
查看是否安装AppArmor
没有安装。
关闭firewalld和iptables
SELinux是关闭的、AppArmor没有安装。
后来从
firewalld 与 iptables
查阅到:
从Cent7以后,iptables服务的启动脚本已被忽略。请使用firewalld来取代iptables服务。
那么接着尝试关闭:
-
查看是否安装iptables
-
查看iptables是否开启
是关闭的。 -
查看是否安装firewalld
-
查看firewalld是否开启
-
关闭firewalld
做完上面这些,接着尝试重新运行Tomcat,结果curl还是失败,重新运行docker服务(
sudo systemctl restart docker
),还是不行。
快泪奔了!😭😭😭
那重启服务器试试,重启后,果然没问题了!
看来就是防火墙的问题啊。
但是重启后firewalld是开启的,因为服务开机自动运行的。这就很奇怪了,似乎与防火墙有关有很矛盾?
问题虽然解决了,但是留下了这个疑问。
先记录着,以后有空再好好研究下!
参考
支持🤟
-
🎸
[关注❤️我吧]
,我会持续更新的。 -
🎸
[点个👍赞吧]
,码字不易麻烦了。