容器名称互相访问

Mon May 13, 2024

300 Words|Read in about 2 Min
Tags: Devops  

由于容器的 IP 地址会在容器重启后发生变化,因不能写死 IP 地址,使用容器的名字访问容器服务是最优的,所以就有了下文。

容器默认网络类型驱动有3类


root@debian:~# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
bb2bc4e074b3   bridge    bridge    local
9b2bd4bb10a7   host      host      local
45553d2a12f8   none      null      local

bridge和主机模式和空。

默认创建的容器都是name为bridge的桥接模式,类似vmware workstation的nat模式。 这种模式下建立的容器,只能通过内部ip互访,但是每次容器创建删除后,ip可能会改变。所以需要使用名称(别名)的方式进行连接固定访问。

测试

比如从容器A访问容器B,直接写name。 需要首先建立一个network

docker network create my-net

root@debian:~# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
bb2bc4e074b3   bridge    bridge    local
9b2bd4bb10a7   host      host      local
7de385069869   my-net    bridge    local
45553d2a12f8   none      null      local

然后创建2个容器进行试验

docker run -tid --network my-net --name test1 alpine:latest /bin/sh
docker run -tid --network my-net --name test2 alpine:latest /bin/sh

测试

docker exec test2 ping -c 3 test1
docker exec test1 ping -c 3 test2

发现都能成功!


root@debian:~# docker exec test2 ping -c 3 test1
PING test1 (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.097 ms
64 bytes from 172.18.0.2: seq=1 ttl=64 time=0.139 ms
64 bytes from 172.18.0.2: seq=2 ttl=64 time=0.121 ms

--- test1 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.097/0.119/0.139 ms
root@debian:~# docker exec test1 ping -c 3 test2
PING test2 (172.18.0.3): 56 data bytes
64 bytes from 172.18.0.3: seq=0 ttl=64 time=0.144 ms
64 bytes from 172.18.0.3: seq=1 ttl=64 time=0.087 ms
64 bytes from 172.18.0.3: seq=2 ttl=64 time=0.075 ms

--- test2 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.075/0.102/0.144 ms

使用默认驱动bridge的桥类型网络创建的容器名称互通测试:

root@debian:~# docker run -itd --name test1 alpine:latest /bin/sh
55bd3a72cc46db3a4cdda322fd6068c80ce99c51da4ceb3d26f4d3cdb51ddf5e
root@debian:~# docker run -itd --name test2 alpine:latest /bin/sh
5cc76e794247a0286177f26ad5fe2083c10a51a3a42c6591ca93c978b3ae6093
root@debian:~# docker exec test1 ping -c 3 test2
ping: bad address 'test2'
root@debian:~# docker exec test2 ping -c 3 test1
ping: bad address 'test1'
root@debian:~#

为什么会失败?

默认网卡 Name 为bridge ,使用该网段,容器间可以互相通过容器ip访问,但是无法通过容器名字互相访问或者进行自身访问。

用户自定义的网络可以在容器之间提供自动的 DNS 解析。

See Also

Mon May 13, 2024

300 Words|Read in about 2 Min
Tags: Devops