这是我参与8月更文挑战的第8天,活动详情查看:8月更文挑战”
【Docker】8. Docker网络
宿主机 ip a
docker 是如何处理容器网络访问的?
查看容器的内部网络地址 ip addr , 发现容器启动的时候会得到一个 eth0@if60 ip地址,docker分配的
思考:linux能不能 ping 通容器内部? (能)
原理
我们每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要安装了docker,就会有一个网卡docker0,桥接模式,使用的技术是evth-pair技术!
再次测试ip add
再启动一个容器 发现又多了一对网卡
我们发现这个容器带来网卡,都是一对对的(宿主机的网卡)
veth-pair 就是一对的虚拟设备接口,他们都是成对出现的,一端连着协>议,一端彼此相连
正因为有这个特性 veth-pair 充当一个桥梁,连接各种虚拟网络设备的OpenStac,Docker容器之间的连接,OVS的连接,都是使用evth-pair技术
tomcat01 和 tomcat02 是共用一个路由器,docker0。
所有的容器不指定网络的情况下,都是通过docker0路由的,docker会给我们的容器分配一个默认的可用IP
所以容器和容器之间是可以互相ping通的:==容器1→Docker0→容器2==
docker中的所有网络接口都是虚拟的 ,转发效率高。删除容器后,对应的网桥也随之删除。
自定义网络(推荐)
查看所有的docker网络
docker network ls
复制代码
网络模式
-
bridge :桥接 docker(默认,自己创建也是用bridge模式)
-
none :不配置网络,一般不用
-
host :和宿主机共享网络
-
container :容器网络连通(用得少!局限很大)
docker run 命令默认带有一个参数–net bridge,此处的bridge指的就是docker0。如果我们不想使用docker0,那如何创建一个新的网络呢?
创建新的网络,这个在安装ES的时候有提到
docker network create --driver 网络模式 --subnet 子网ip --gateway 网关 网络名
复制代码
查看网络详细信息
我们不仅在docker network ls命令下发现了这个新创建的网络newnet,还可以使用docker network inspect命令查看其详细信息,包括了我们创建时定义的子网ip和网关:
只要两个容器启动时都通过 –net,选用了同一个已创建的网络,不同容器间即可通过ip地址或容器名/id连通:
网络联通
对于建立在不同网络下(docker0, newnet)的两个容器tomcat01和tomcat02,他们的网段不同,因此是无法彼此ping通容器内部的:
这时我们需要通过docker network connect命令打通容器与网络之间的连接:
docker network connect 网络名 容器名/id
复制代码
这个功能类似于将一个容器赋予多个ip地址,同样可以用docker network inspect命令查看网络连通后,该网络的变化:
原本newnet网络中只含有tomcat02,现在增加了tomcat01,因此可以连通。
我们自定义的网络,docker为我们维护好了对应的关系,推荐我们平时这样使用网络!
好处:
redis – 不同的集群使用不同的网络,保证集群是健康和安全的
mysql – 不同的集群使用不同的网络,保证集群是健康安全的