首页 文章

如何将tomcat容器中的应用程序连接到在同一网络中创建的postgres容器?

提问于
浏览
0

我在容器内运行基于tomcat的应用程序,并使用docker compose在我的 ubuntu 主机上运行Postgres数据库容器 . 它们位于我定义的同一个docker bridge网络中 . 我有 firewall enabled . 我的防火墙对5432端口没有任何拒绝规则 . 当我的防火墙被禁用时,我的tomcat应用程序可以使用其IP或服务名称连接到数据库容器 . 但是当启用防火墙时,它不会连接到数据库容器 . 我在docker.conf中设置了DOCKER_OPTS = "--iptables=false"并重新启动了docker . 为什么在启用防火墙时没有连接?

1)这些是我的主动规则: -

来自行动


2377 / tcp ALLOW Anywhere
7946 / tcp ALLOW Anywhere
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)ALLOW Anywhere(v6)
7946 / tcp(v6)ALLOW Anywhere(v6)
7946 / udp(v6)允许任何地方(第6节)
4789 / udp(v6)ALLOW Anywhere(v6)
22(v6)允许任何地方(第6节)
5432(v6)允许任何地方(第6节)

================================================== =======================

2)这些是使用服务名称连接数据库的应用程序配置: - driverClass=org.postgresql.Driver jdbcUrl=jdbc:postgresql://PostgresDatabase:5432/dockerdb user=dockeruser

1 回答

  • 0

    设置 --iptables=false 表示docker守护程序无法在主机上配置iptables规则 . 但是,当你启用ufw时,它是必不可少的 .
    在配置中删除 DOCKER_OPTS="--iptables=false" 并重新启动docker守护程序后,我确定此问题将消失 .

    在启动过程中,Docker守护程序将配置一些额外的iptable规则,以使容器之间/容器与外部世界之间的通信顺利进行,因为防火墙/ ufw将通过 DEFAULT_FORWARD_POLICY DROP数据包 .

    下面,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

    • 接受来自已 Build 的外部连接的任何数据包 .
      iptables -I FORWARD -o docker0 -m conntrack -ctstate RELATED,ESTABLISHED -j ACCEPT .

    最重要的是,你有 iptables 设置false和防火墙启用没有任何额外的动作 . 就像你把钥匙从门锁上扔开一样,但你还是想出去 . 所以我强烈建议您在完全理解architecture of docker network以及这些组件如何协同工作之前不要更改任何docker网络设置 .

    这是以不同的方式提出来的another question . 愿答案可以为您提供更多帮助 .

相关问题