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,这样应该不会有类似问题发生?
建议用固定网络配置:
建一个文件 /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 ...
容器默认网络是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地址,以及从主机到容器的端口映射,并在容器内部完成此操作。