Docker网络
- 问题:
- Docker容器如何连接网络
- Docker容器之间能否接通网络
- Docker容器之间可以通过名称ping通吗
- 能否自定义一个网络
那么,我们带着几个问题来学习docker的网络
Docker容器是如何连接网络的
我们在安装了Docker以后,在 宿主机上 ip addr
就会发现,多一个docker0的网卡配置
我们启动一个tomcat容器,然后再去容器看一下
ip addr
docker run -d -P --name tomcat01 tomcat
docker exec -it tomcat01 ip addr # 支持此写法
发现有个 6:eth0@if7的网络,我们再去宿主机上看一下网络
会发现,宿主机上多了一个 7:veth0925cfc@if6的网络
实际上这是采用了 evth-pair技术,6:eth0@if7和7:veth0925cfc@if6就是一对儿对应的虚拟网络设备接口,两个接口可以连接起来,把网络打通
evth-pair就是一对的虚拟设备接口,他们都是成对出现的,一段连着协议,一段彼此相连。正因为有这个特性,evth-pair充当一个桥梁,连接各种虛拟网络设备的
OpenStac,Docker容器之间的连接,OVS的连接,都是使用evth-pair 技术
那么我们能不能ping通容器呢,试一下 (tomcat01的地址 172.17.0.2)
完全可以,实际上,我们在宿主机ping容器,经过docker0上的虚拟网络设备接口,也就是7:veth0925cfc@if6和
6:eth0@if7就可以走通
Docker容器之间可以通吗
先再建一个tomcat02容器
docker run -d -P --name tomcat02 tomcat
docker exec -it tomcat02 ip addr
ip addr
发现又多了一对虚拟设备接口 8:eth@if9 和 9:vethe9ed702@if8
用 tomcat01 ping tomcat02(172.17.0.3)
docker exec -it tomcat01 ping 172.17.0.3
发现,容器之间也可以ping通
画一个网络模型
流程:从tomcat01–>evth-pair技术的虚拟设备接口–>docker0路由器–>evth-pair技术的虚拟设备接口–>连接到tomcat02
Docker容器之间可以通过名称ping通吗
docker exec -it tomcat01 ping tomcat02
直接使用容器名称是ping不通的,要是用 --link技术来实现(创建容器的时候指定)
在启动一个tomcat03 docker run -d -P --name tomcat03 --link tomcat02 tomcat
使用tomcat03ping tomcat02
docker exec -it tomcat03 ping tomcat02
结果ping通了
我们看一下docker的docker0网络配置(docker0的名称默认为bridge)
docker network ls
docker network inspect 网络id/名称
也就是说,创建的容器如不指定网络的话,那么默认的使用docker0(bridge)的网络模式
我们去看一下tomcat03的 /etc/hosts文件
**实质:**那么实质上就是,在tomcat03的hosts配置文件里,给tomcat02的ip设置了一个名字,访问tomcat02的时候实际上就是转发到172.17.0.3 也就是 tomcat02的ip地址
**局限性:**但是如果使用tomcat02去ping tomcat03呢,结果是不可行,现在已经不再使用 --link来连接容器了,局限性比较
能否自定义一个网络
当然可以,创建一个容器在不指定网络的情况下,默认是docker0(bridge)网络
docker network ls 查看所有网络
温馨提示:忘记命令时,docker network --help 查文档
网络模式:
bridge :桥接docker (默认,自己创建也使用bridge模式)
none:不配置网络
host :和宿主机共享网络
container :容器网络连通! ( 用的少!局限很大)
创建容器时指定网络
docker run -d -P tomcat01 --net bridge tomcat # --net 指定网络
自定义网络
忘记怎么敲,就docker network create --help
–driver bridge
–subnet 192.168. 0.0/16
–gateway 192.168.0.1
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 net
docker network inspect net # 查看网络信息
尝试一下,使用我们自己的网络来启动容器
docker run -d -P --name tomcat-net-01 --net net tomcat
docker run -d -P --name tomcat-net-02 --net net tomcat
查看 net 网络的配置信息
docker network inspect net
使用我们自定义的网络创建的容器之间可以通过容器名字相互ping通
docker exec -it tomcat-net-01 ping tomcat-net-02
打通网络
我们先使用默认bridge创建一个tomcat01,那么tomcat01可以访问到 net 网络下的 tomcat-net-01吗
不可以,两个网络间的容器需要打通后才可以访问
是指,网络和容器之间打通(例如,net网络和 tomcat01容器)
docker network connect net tomcat01
打通后,试一下可不可以访问 tomcat-net-01
docker exec -it tomcat01 ping tomcat-net-01
访问成功了
我们看一下tomcat01的网络配置
惊讶,这个容器的网络配置居然有两个,而且分配了两个ip地址!!!
网络模型图(偷个图,哈哈O(∩_∩)O)
也就是说,docker0的网络中有tomcat01这个容器,而且自定义的net网络中也有tomcat01这个容器
一般使用docker network connect 打通网络