由于容器的 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 解析。