容器ifconfig& nslookup IP不匹配

时间:2016-10-31 01:40:12

标签: docker

我正在运行一个名为“前端”的容器。其他容器通过使用名称前端与此容器进行通信,该前端将被解析为容器IP地址。我发现了一些对我这个容器没有意义的东西。

当我进入容器并运行“ifconfig”时,我看到一个IP地址。当我运行“nslookup front-end”时,我看到另一个IP地址。不过我认为这两个IP应该匹配。请参阅下面的终端输出:

我在swarm模式下这样做。以下是我启动容器的方法:

docker service create --with-registry-auth --name first --network my-network aarch64/ubuntu:16.04 sleep 99999999999999999
docker service create --with-registry-auth --name second --network my-network aarch64/ubuntu:16.04 sleep 99999999999999999

终端输出以确认容器已启动并正在运行:

odroid@odroid64-cluster4:~/ssd/weaveworksdemo$ docker service ls
ID            NAME    REPLICAS  IMAGE                 COMMAND
7v04cpi9b8uq  second  1/1       aarch64/ubuntu:16.04  sleep 99999999999999999
cru6diqlv5on  first   1/1       aarch64/ubuntu:16.04  sleep 99999999999999999

swarm服务和docker PS命令​​

odroid@odroid64-cluster4:~/ssd/weaveworksdemo$ docker service ps first
ID                         NAME     IMAGE                 NODE               DESIRED STATE  CURRENT STATE          ERROR
4dqy376icyi8fow1y1owwjzj0  first.1  aarch64/ubuntu:16.04  odroid64-cluster3  Running        Running 2 minutes ago
odroid@odroid64-cluster4:~/ssd/weaveworksdemo$ docker service ps second
ID                         NAME      IMAGE                 NODE               DESIRED STATE  CURRENT STATE          ERROR
aurs8nznz35to7pjcikn9903h  second.1  aarch64/ubuntu:16.04  odroid64-cluster4  Running        Running 2 minutes ago
odroid@odroid64-cluster4:~/ssd/weaveworksdemo$ docker ps
CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS              PORTS                    NAMES
cd28f6ec30e1        aarch64/ubuntu:16.04      "sleep 99999999999999"   3 minutes ago       Up 3 minutes                                 second.1.aurs8nznz35to7pjcikn9903h

可以看出。首先在cluster3上运行,然后在cluster4上运行。

现在,让我们来看看我的网络检查:

odroid@odroid64-cluster4:~/ssd/weaveworksdemo$ docker network inspect my-network
[
    {
        "Name": "my-network",
        "Id": "3kjlgo564nkmnccliuz7rlxa3",
        "Scope": "swarm",
        "Driver": "overlay",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "10.10.0.0/24",
                    "Gateway": "10.10.0.2"
                }
            ]
        },
        "Internal": false,
        "Containers": {
            "cd28f6ec30e1ab33c09ef20ef4ee3968d7e7d71f83608a7ebd995986f9c7a049": {
                "Name": "second.1.aurs8nznz35to7pjcikn9903h",
                "EndpointID": "bf3089daf09a9de1a9b245807d8b3cb3cbee1d3e28887f8f8b5a375ba72d9e18",
                "MacAddress": "02:42:0a:0a:00:06",
                "IPv4Address": "10.10.0.6/24",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.driver.overlay.vxlanid_list": "258",
            "encrypted": ""
        },
        "Labels": {}
    }
]

你只看到容器服务“第二”的原因是因为我被带入了cluster4。如果我要进入cluster3,并运行网络检查命令,我会看到该服务“第一次”。这就是网络覆盖在Docker中的工作方式。 请注意IP为10.10.0.6

好吧,让shell进入“second”并运行ifconfig和nslookup。

odroid@odroid64-cluster4:~/ssd/weaveworksdemo$ docker exec -ti second.1.aurs8nznz35to7pjcikn9903h bash
root@cd28f6ec30e1:/# ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:0a:0a:00:06
          inet addr:10.10.0.6  Bcast:0.0.0.0  Mask:255.255.255.0
          inet6 addr: fe80::42:aff:fe0a:6/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1424  Metric:1
          RX packets:13 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:1038 (1.0 KB)  TX bytes:648 (648.0 B)

eth1      Link encap:Ethernet  HWaddr 02:42:ac:12:00:03
          inet addr:172.18.0.3  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:acff:fe12:3/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:7374 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6551 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:36597121 (36.5 MB)  TX bytes:443087 (443.0 KB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:4096  Metric:1
          RX packets:12 errors:0 dropped:0 overruns:0 frame:0
          TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:876 (876.0 B)  TX bytes:876 (876.0 B)

root@cd28f6ec30e1:/# nslookup second
Server:         127.0.0.11
Address:        127.0.0.11#53

Non-authoritative answer:
Name:   second
Address: 10.10.0.5

注意ifconfig如何显示10.10.0.6,并且解析名称“front-end”返回10.10.0.5。另外,请注意网络检查如何与ifconfig输出匹配。

任何人都可以解释为什么会这样吗?我收回这一切都有效。在节点之间存在连接问题时,不确定这是否与它有关。

另外一点,我正在运行两个名称不同的容器,但即使我运行一个容器,我也会看到同样的事情。

1 个答案:

答案 0 :(得分:0)

关于Docker Virtual-IP

例如:

  • 您在撰写文件中命名服务redis-service
  • 您可以通过redis-service
  • 连接到该redis服务器
  • 如果您将此redis服务复制到五个实例,那么redis-service解析为哪个IP地址?
  • redis-service将被解析为虚拟IP,并且这个虚拟IP将对五个redis实例进行负载平衡。
  • 即使你只有一个实例也是如此。