我正在一个容器内运行一个基于tomcat的应用程序,并使用docker compose在我的 ubuntu 主机上运行了一个Postgres数据库容器。他们在我定义的同一个docker bridge网络中。我已启用防火墙。我的防火墙对5432端口没有任何拒绝规则。禁用防火墙后,tomcat应用程序可以使用其IP或服务名称连接到数据库容器。但是,启用防火墙后,它不会连接到数据库容器。我在docker.conf中设置了DOCKER_OPTS =“-iptables = false”并重新启动了docker。启用防火墙后为什么无法连接?
1)这些是我的活动规则:-
从以下位置采取行动
------- ----
2377 / tcp允许在任何地方
7946 / tcp允许在任何地方
7946 / udp允许在任何地方
4789 / udp允许在任何地方
22随处可见
8443允许10.20.220.185
8443允许10.20.220.78
8081允许10.5.0.7
5432允许在任何地方
8081允许10.5.0.5
2377 / tcp(v6)允许在任何地方(v6)
7946 / tcp(v6)允许在任何地方(v6)
7946 / udp(v6)允许在任何地方(v6)
4789 / udp(v6)允许在任何地方(v6)
22(v6)允许在任何地方(v6)
5432(v6)允许在任何地方(v6)
================================================ ========================
2)这些是我使用服务名称连接到数据库的应用程序配置:-
driverClass=org.postgresql.Driver
jdbcUrl=jdbc:postgresql://PostgresDatabase:5432/dockerdb
user=dockeruser
答案 0 :(得分:0)
设置--iptables=false
意味着docker守护进程无法在主机上配置iptables规则。但是,在启用ufw时这是必不可少的。
我确信在您删除配置中的DOCKER_OPTS="--iptables=false"
并重新启动docker daemon之后,该问题将消失。
在启动过程中,Docker守护进程将配置一些额外的iptable规则,以使容器之间/容器与外部世界之间的通信正常进行,因为防火墙/ ufw会通过DEFAULT_FORWARD_POLICY
丢弃数据包。
以下是docker创建iptable规则的一个粗略过程:
使用iptables工具启用docker0上的NAT。
iptables -I POSTROUTING -t nat -s 172.17.0.1 ! -o docker0 -j MASQUERADE
启用容器内的通信。
iptables -I FORWARD -i docker0 -o docker0 -j ACCEPT
启用容器与外部世界之间的通信。
iptables -I FORWARD -i docker0 ! -o docker0 -j ACCEPT
接受已建立的来自外部连接的任何数据包。
iptables -I FORWARD -o docker0 -m conntrack -ctstate RELATED,ESTABLISHED -j ACCEPT
。
首先,您已将iptables
设置为false并启用了防火墙,而无需进行任何其他操作。就像在锁着门的情况下扔掉钥匙一样,但是您仍然想出去。因此,我强烈建议您在完全了解architecture of docker network以及这些组件如何协同工作之前,不要更改任何docker网络设置。
这是another question 的另一种询问方式。希望答案能为您带来更多帮助。