前面默认的bridge模式,可以实现容器与宿主机,容器与容器之前的互通,但是容器一旦删除,它的ip就会变化,所以并不是很好用。为了解决这个问题,我们当时想了,如果能用容器名来访问就好了,那么自定义网络就能解决这个问题。
我们先查看一下当前docker的网络信息:
docker network ls
docker network create net_1
docker network inspect net_1
我们再看一下宿主机的网络信息:
我们看到,宿主机多了一个br-058adb395d8b,它和自定义的docker网络属于同一个网段,并且也是bridge模式。因为这里使用了bridge模式,所以容器与容器之间,容器与宿主机之间是可以连通的(注意:这是说的是同一个自定义网络容器,使用自定义网络或者使用不同自定义网络的容器之间的ip是无法ping通的)
创建使用自定义网络的容器t1
docker run -d -p 8091:8080 --network net_1 --name t1 f014789eac58
创建使用自定义网络的容器2
docker run -d -p 8092:8080 --network net_1 --name t2 f014789eac58
那我们试下容器之间使用容器名称是否能够ping通
t1 ping t2
docker exec -it t1 ping t2
docker exec -it t2 ping t1
我们已经使用自定义网络启动了两个容器,分别是t1和t2,那我们再查看一下自定义网络net_1的信息:
docker network inpect net_1
我们可以看到,在Containers下,自定义网络已经为我们维护好了容器间对应的关系,所以我们推荐使用自定义网络来处理容器之间的网络问题,这样保证保证不同的集群使用不同的网络,保证集群是安全和健康的。
我们以默认docker0再创建两个容器,t3 和 t4:
docker run -d -p 8083:8080 --name t3 f014789eac58
docker run -d -p 8084:8080 --name t4 f014789eac58
docker exec -it t3 ping t2
果不其然,是ping不通的。那怎么才能ping通呢?
这里我们使用docker network connect来实现不通网络下的容器的连通。
docker network connect net_1 t3
docker network connect net_1 t4
我们再查看一下自定义网络:
docker network inspect net_1
我们惊奇的发现,Containers增加了t3和t4的网络配置,并且给他们增加了
172.18.0的网段,使得四个容器在一个网段呢。此时我们再试一下t3和t2是否能够ping通。
docker exec -it t3 ping t2
docker exec -it t2 ping t3
就问你牛不牛,竟然真的能互相ping通。我们再查看下容器t3的网络:
docker exec -it t3 ip addr