最近一直在学习使用docker部署项目,项目需要。
问题是:使用docker部署nacos和一个spring cloud项目,配置spring cloud在使用nacos配置server-addr时候使用nacos容器的名称和端口时启动web项目,出现连接不上的问题,后来又换成nacos的ip也不行,可是使用ping命令是正常的。但是把主机的防火墙关闭了,重启docker,运行项目正常。出现这样的情况的,或遇到这样容器之间的有端口通信问题,可以参考下。
总结一句话都是网络防火墙的问题。网上找了很多的资料都说这 添加 daemon.json中禁用iptables什么的,我试了,没有效果,可能是我配置的不对,现在看看我的处理。至少是成功了。
环境:使用同一个主机的一个docker实例,容器创建(这里就不写出创建容器的命令了,网上一大堆)的时候都使用自己的创建的bridge网络(-o的选项是为重合名网卡的名称,写运维脚本时有帮助,ip a 查询会有意想不到发现)
docker network create -d bridge --subnet=172.19.0.0/24 --attachable digit_net -o com.docker.network.bridge.name=br_digit
然后我们就是操作防火墙:
firewall-cmd --zone=trusted --add-interface=br_digit --permanent
//重载
firewall-cmd --reload
最后:重启docker
systemctl restart docker
终于可以了。
其实完全可以不用使用容器的ip进行处理,使用主机 的ip和公开的端口完全是可以运行的,但是注意有时要设置公开主机的端口一些端口:多研究 firewall-cmd命令,下面是一个有用的例子(不介绍含义了):
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="172.19.0.0/24" port protocol="tcp" port="8848" accept"
总结:官方的文档多看,尤其是那些Docker CLI (docker)命令,多看看,会有很多的收获。对问题要不断的发现。