网络1

命令

  1. ip addr 查看所有网关

实验

我们在服务器本机运行命令
其他的先不看,主要看这个docker0,我们本机安装了docker,所以这个docker0可以理解成docker的总路由器,docker0会给每个启动的容器分配ip地址

  1. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
  2. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  3. inet 127.0.0.1/8 scope host lo
  4. valid_lft forever preferred_lft forever
  5. 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
  6. link/ether 00:16:3e:08:db:32 brd ff:ff:ff:ff:ff:ff
  7. inet 172.18.43.74/20 brd 172.18.47.255 scope global dynamic eth0
  8. valid_lft 313974695sec preferred_lft 313974695sec
  9. 3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
  10. link/ether 02:42:9b:2a:ef:a1 brd ff:ff:ff:ff:ff:ff
  11. inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
  12. valid_lft forever preferred_lft forever
  13. 29: veth4f82aec@if28: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP
  14. link/ether ce:c7:c3:8c:ef:fd brd ff:ff:ff:ff:ff:ff link-netnsid 0
  15. 31: veth54fdea4@if30: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP
  16. link/ether 8a:1d:6d:87:c0:48 brd ff:ff:ff:ff:ff:ff link-netnsid 1
  17. 33: veth0bd4b35@if32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP

我们进入一个容器内部,并执行查询网关命令

  1. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
  2. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  3. inet 127.0.0.1/8 scope host lo
  4. valid_lft forever preferred_lft forever
  5. 42: eth0@if43: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
  6. link/ether 02:42:ac:11:00:08 brd ff:ff:ff:ff:ff:ff link-netnsid 0
  7. inet 172.17.0.8/16 brd 172.17.255.255 scope global eth0
  8. valid_lft forever preferred_lft forever

eth0@if43,这个就是我们本机给容器分配的ip地址。

  1. [root@9baa869a6b4d /]# ping 172.17.0.8
  2. PING 172.17.0.8 (172.17.0.8) 56(84) bytes of data.
  3. 64 bytes from 172.17.0.8: icmp_seq=1 ttl=64 time=0.061 ms
  4. 64 bytes from 172.17.0.8: icmp_seq=2 ttl=64 time=0.053 ms

ping通了

总结:

只要我们启动了docker容器,它就会被docker分配ip,我们只要安装了docker,就会有一个docker0,docker0是系统给docker分配的网关

Veth-pair

现象

image.png
可以看到,只要容器运行,就会被分配一个veth开头的网关信息
这就是我们强调的veth-pair技术

我们再进入第二个容器看看网关

  1. [root@de7b70d2f1c1 /]# ip addr
  2. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
  3. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  4. inet 127.0.0.1/8 scope host lo
  5. valid_lft forever preferred_lft forever
  6. 46: eth0@if47: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
  7. link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
  8. inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
  9. valid_lft forever preferred_lft forever
  1. 46: eth0@if47
  2. //发现第二个容器里,它是46 绑定着linux本机 47这个网络

那么不同容器间,可以ping通吗?
可以,因为不同容器都被docker0管理,相当于就在一个局域网下一样,肯定是能互相ping通的

image.png
image.png

思考

那这就带出一个问题,只要容器重启,ip就重新分配,但是我们如果在项目中写定了mysql url连接,我们可否通过容器名字来进行一个绑定

容器互连(不建议使用)

--link 要连接的容器名

  1. docker run -id -P --name tomcat03 --link tomcat02 镜像名
  2. docker exec -it tomcat03 ping tomcat02

反向可以ping通吗?
不可以,因为没有配置

通过docker inspect

image.png

host文件

在容器内打开host文件,host文件路径是/etc/hosts
可以看到host文件里面已经绑定了另一个容器,访问tomcat02转发到 172.18.0.3(这个是tomcat02的ip)
image.png

自定义网络(推荐使用)

网络模式
bridge :桥接模式
none:不配置网络
host:和宿主机共享网络

桥接

配置

创建一个mynet名字的桥接方式子网为192.168.0.0/16,被分配网关为192.168.0.1的网络配置

  1. docker network create --driver bridge --subnet 192.168.0.0/16 --gateway
  2. 192.168.0.1 mynet
  3. ------解析------
  4. --subnet 子网
  5. --gateway 网关

/16默认支持65535个ip

运用

用配置的子网信息来运行一个容器,就相当于只要你运行容器带上我们配置好的网络文件,该容器就会被分配到网络文件里配置的子网里,会在子网里给这个容器生成一个ip

  1. docker run -d -P --name tomcat-net-01 --net mynet
  2. docker run -d -P --name tomcat-net-02 --net mynet

image.png
这样我们不使用 —link 一样可以互ping通。
这样桥接的自定义网络相当于是两个不同的子网,而之前link是在一个子网下的,不同子网可以相互隔离,避免感染

互通

image.png
下面这条命令就相当于 把容器 和 另一个网段 连接
这时候再tomcat01可以ping通另一网段的所有主机

  1. docker network connect mynet tomcat01