当前位置: 首页 > 知识库问答 >
问题:

docker - 如何解决AMHPOD容器在IP地址变更后的访问问题?

华英睿
2025-01-17

AMHPOD容器IP错误问题
宿主机是一台独立IP的国内主机,近期因为一些原因,主机的IP地址变更了两次,IPV4和IPV6同时变更
我发现变更后,普通的docker可以正常启动,但是使用了podman的amhpod似乎无法直接适应IP的变化,无法正常从外网访问
默认情况下,应该是走的bridge 网络模式?
直接在amhpod重启运行、或重部署容器不能解决问题

第一次变更IP时,我将所有容器全部卸载,重装了amhpod后,再挨个重新拉取部署解决
现在因为容器十几个,挨个重复这个操作很费劲
请问大大有没有更好的解决方式


根据两位大大的提示,问题排查如下:
确定容器内网ip 10.88.0.6

"NetworkSettings": {
               "EndpointID": "",
               "Gateway": "10.88.0.1",
               "IPAddress": "10.88.0.6",
               "IPPrefixLen": 16,
               "IPv6Gateway": "",
               "GlobalIPv6Address": "",
               "GlobalIPv6PrefixLen": 0,
               "MacAddress": "96:e1:27:f0:4e:ea",
               "Bridge": "",
               "SandboxID": "",
               "HairpinMode": false,
               "LinkLocalIPv6Address": "",
               "LinkLocalIPv6PrefixLen": 0,
               "Ports": {
                    "80/tcp": [
                         {
                              "HostIp": "",
                              "HostPort": "10000"
                         }
                    ]
               },
               "SandboxKey": "/run/netns/netns-ddee8b9f-89d7-2eeb-d814-1ddf20a1363a",
               "Networks": {
                    "podman": {
                         "EndpointID": "",
                         "Gateway": "10.88.0.1",
                         "IPAddress": "10.88.0.6",
                         "IPPrefixLen": 16,
                         "IPv6Gateway": "",
                         "GlobalIPv6Address": "",
                         "GlobalIPv6PrefixLen": 0,
                         "MacAddress": "96:e1:27:f0:4e:ea",
                         "NetworkID": "podman",
                         "DriverOpts": null,
                         "IPAMConfig": null,
                         "Links": null,
                         "Aliases": [
                              "1f4798f85017"
                         ]
                    }
               }

并且ping curl测试均正常
现在我在想是不是防火墙出了问题:
这是摘选的几条相关IP和端口(10000)防火墙记录:

-A INPUT -p tcp -m tcp --dport 10000 -j ACCEPT
-A NETAVARK-DN-1D8721804F16F -p tcp -m tcp --dport 10000 -j DNAT --to-destination 10.88.0.36:80
-A NETAVARK-DN-1D8721804F16F -p tcp -m tcp --dport 8089 -j DNAT --to-destination 10.88.0.6:8088
-A NETAVARK-DN-1D8721804F16F -p tcp -m tcp --dport 10000 -j DNAT --to-destination 10.88.0.6:80
-A NETAVARK-DN-1D8721804F16F -s 10.88.0.0/16 -p tcp -m tcp --dport 10000 -j NETAVARK-HOSTPORT-SETMARK
-A NETAVARK-DN-1D8721804F16F -s 127.0.0.1/32 -p tcp -m tcp --dport 10000 -j NETAVARK-HOSTPORT-SETMARK
-A NETAVARK-DN-1D8721804F16F -p tcp -m tcp --dport 10000 -j DNAT --to-destination 10.88.0.6:80
-A NETAVARK-HOSTPORT-DNAT -p tcp -m tcp --dport 10000 -m comment --comment "dnat name: podman id: 1f4798f85017ea7c01563710553d46107ddbeae713c2d6006ef314fde27a0776" -j NETAVARK-DN-1D8721804F16F

我发现多了一个8089的端口的转发,但是这个端口我应该是用在另外一个IP为10.88.0.4的容器,并且防火墙中也有这么一条记录:

-A NETAVARK-DN-1D8721804F16F -p tcp -m tcp --dport 8089 -j DNAT --to-destination 10.88.0.4:8088

于是我把所有容器都停止了,然后发现还剩下这么几个规则:

-A NETAVARK-DN-1D8721804F16F -p tcp -m tcp --dport 8092 -j DNAT --to-destination 10.88.0.23:8080
-A NETAVARK-DN-1D8721804F16F -d 127.0.0.100/32 -p tcp -m tcp --dport 5270 -j DNAT --to-destination 10.88.0.25:80
-A NETAVARK-DN-1D8721804F16F -p tcp -m tcp --dport 21114 -j DNAT --to-destination 10.88.0.34:21114
-A NETAVARK-DN-1D8721804F16F -p tcp -m tcp --dport 10000 -j DNAT --to-destination 10.88.0.36:80
-A NETAVARK-DN-1D8721804F16F -p tcp -m tcp --dport 8092 -j DNAT --to-destination 10.88.0.3:8080
-A NETAVARK-DN-1D8721804F16F -p tcp -m tcp --dport 21114 -j DNAT --to-destination 10.88.0.5:21114
-A NETAVARK-DN-1D8721804F16F -d 127.0.0.100/32 -p tcp -m tcp --dport 5270 -j DNAT --to-destination 10.88.0.7:80
-A NETAVARK-DN-1D8721804F16F -p tcp -m tcp --dport 10000 -j DNAT --to-destination 10.88.0.6:80

明显出现了重复的规则……我决定这几条全删掉
然后,恢复了……
总结一下,问题出现在了防火墙上出现了一些冗余的规则,这些规则目前我也不知道怎么来的,可能是我个人操作的原因
我打算这回把所有容器自己定义好子网IP,这样应该不会有类似问题发生?

共有2个答案

云骏奇
2025-01-17

建议用固定网络配置:
建一个文件 /etc/cni/net.d/87-podman-bridge.conflist:


{
  "cniVersion": "0.4.0",
  "name": "podman",
  "plugins": [
    {
      "type": "bridge",
      "bridge": "cni-podman0",
      "ipam": {
        "type": "host-local",
        "ranges": [
          [
            {
              "subnet": "10.88.0.0/16",
              "gateway": "10.88.0.1"
            }
          ]
        ]
      }
    },
    {
      "type": "portmap",
      "capabilities": {
        "portMappings": true
      }
    }
  ]
}

或者用host网络模式:

# 部署容器时用host网络
podman run --network=host ...
彭博厚
2025-01-17

容器默认网络是10.88.0.0/16网段的,在内网正常应该不会影响才对,
外网访问是通过iptables转发到内网访问到相应的容器,容器只监听端口的情况,应是没绑定外网IP的,访问不了的话,可以先确认下容器的网络情况,可以运行命令,
podman inspect 容器名/或ID
看下容器网络配置,类似

NetworkSettings": {
               "EndpointID": "",
               "Gateway": "10.88.0.1",
               "IPAddress": "10.88.0.18",
               "IPPrefixLen": 16,
               "IPv6Gateway": "",
               "GlobalIPv6Address": "",
               "GlobalIPv6PrefixLen": 0,
               "MacAddress": "e2:9e:9b:c7:79:56",
               "Bridge": "",
               "SandboxID": "",
               "HairpinMode": false,
               "LinkLocalIPv6Address": "",
               "LinkLocalIPv6PrefixLen": 0,
               "Ports": {
                    "80/tcp": [
                         {
                              "HostIp": "",
                              "HostPort": "88"
                         }
                    ]
               },

上面容器就10.88.0.18,可以在ssh先ping与curl测试相应内网端口是否正常,
也排查外网监听情况,在面板『网络』可以看得到,
与iptables转发规则,默认是用的NETAVARK,老系统是CNI,
正常这些在容器重新启动时是会自动配置。

 类似资料:
  • 我有两个docker容器在我的Mac主机上运行-容器1是docker Hub的Jenkins,容器2是docker Hub的SonarQube。我有两个容器成功运行。我可以通过从我的主机访问Jenkins,我可以通过访问我的SonarQube。 詹金斯容器是这样启动的: SonarQube容器是这样启动的: 难道我不应该能够从我的主机通过它们的内部IP地址访问每个容器吗? 我如何测试一个容器(例如

  • 我是的新手,虽然我阅读了基本文档,并尝试部署一个简单的Spring BootAPI,但我可能缺少很多东西 我已经将API部署为.jar文件,然后安装并使用以下命令推送它: 然后使用docker命令启动API: 当我访问localhost:7777/hello时,我得到了所需的响应 这是我的 根据这个应答的命令,发布这个命令以获取 因此,我使用运行它,得到了这个错误 如果我设法获得,我是否能够访问它

  • 如何访问postgres-docker container其他docker container没有ip地址?我想通过使用MyWeb将数据存储在postgres中。在jar中给定主机,如localhost:5432/db。 这是我的作曲文件:

  • 我有docker容器用于实验。所以我不知道以后尝试新应用时会使用哪些端口。在docker-run命令中使用ip/port从主机访问docker容器应用程序而不公开它,这是不可能的吗?

  • 我正在使用Docker为Mac。我正在Docker容器中运行一个基于nodejs的微服务。我想通过浏览器测试节点微服务。如何获取正在运行的docker容器的IP地址?

  • 问题内容: 创建新容器后,是否可以运行命令以从主机获取容器的IP地址? 基本上,一旦Docker创建了容器,我想滚动自己的代码部署和容器配置脚本。 问题答案: 该的选项就派上用场了。 现代Docker客户端语法为: 旧的Docker客户端语法为: 这些命令将返回Docker容器的IP地址。 如注释中所述:如果在Windows上,请在花括号周围使用双引号而不是单引号。

  • 假设我有一个名为“mynet”的网络,我想启动一个IP地址绑定到192.168.23.2的容器。 我开始使用的代码是: 我从这里做什么?我正在有效地从中寻找与选项等效的选项。

  • 正如标题所说。我需要能够检索docker主机的IP地址,以及从主机到容器的端口映射,并在容器内部完成此操作。