1. 为什么要使用自定义网络
前面默认的bridge模式,可以实现容器与宿主机,容器与容器之前的互通,但是容器一旦删除,它的ip就会变化,所以并不是很好用。为了解决这个问题,我们当时想了,如果能用容器名来访问就好了,那么自定义网络就能解决这个问题。
2. 创建自定义网络
我们先查看一下当前docker的网络信息:
docker network ls
创建一个自定义网络 net_1:
docker network create net_1
我们查看一下这个网络:
docker network inspect net_1
我们再看一下宿主机的网络信息:
我们看到,宿主机多了一个br-058adb395d8b,它和自定义的docker网络属于同一个网段,并且也是bridge模式。因为这里使用了bridge模式,所以容器与容器之间,容器与宿主机之间是可以连通的(注意:这是说的是同一个自定义网络容器,使用自定义网络或者使用不同自定义网络的容器之间的ip是无法ping通的)
3. 运行容器时使用自定义网络
创建使用自定义网络的容器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
t2 ping t1
docker exec -it t2 ping t1
惊喜吧,容器之前使用容器名称是可以ping通的哦。
4. 原理
我们已经使用自定义网络启动了两个容器,分别是t1和t2,那我们再查看一下自定义网络net_1的信息:
docker network inpect net_1
我们可以看到,在Containers下,自定义网络已经为我们维护好了容器间对应的关系,所以我们推荐使用自定义网络来处理容器之间的网络问题,这样保证保证不同的集群使用不同的网络,保证集群是安全和健康的。
5. 默认bridge和自定义网络容器怎么连通?
我们以默认docker0再创建两个容器,t3 和 t4:
docker run -d -p 8083:8080 --name t3 f014789eac58
docker run -d -p 8084:8080 --name t4 f014789eac58
首先我们试一下,t3能否用容器名ping通t2
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
这个容器竟然又多个一个ip:172.18.0.4/16,一个容器,多个ip。