网络1
命令
ip addr 查看所有网关
实验
我们在服务器本机运行命令
其他的先不看,主要看这个docker0,我们本机安装了docker,所以这个docker0可以理解成docker的总路由器,docker0会给每个启动的容器分配ip地址
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000link/ether 00:16:3e:08:db:32 brd ff:ff:ff:ff:ff:ffinet 172.18.43.74/20 brd 172.18.47.255 scope global dynamic eth0valid_lft 313974695sec preferred_lft 313974695sec3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UPlink/ether 02:42:9b:2a:ef:a1 brd ff:ff:ff:ff:ff:ffinet 172.17.0.1/16 brd 172.17.255.255 scope global docker0valid_lft forever preferred_lft forever29: veth4f82aec@if28: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UPlink/ether ce:c7:c3:8c:ef:fd brd ff:ff:ff:ff:ff:ff link-netnsid 031: veth54fdea4@if30: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UPlink/ether 8a:1d:6d:87:c0:48 brd ff:ff:ff:ff:ff:ff link-netnsid 133: veth0bd4b35@if32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP
我们进入一个容器内部,并执行查询网关命令
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever42: eth0@if43: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group defaultlink/ether 02:42:ac:11:00:08 brd ff:ff:ff:ff:ff:ff link-netnsid 0inet 172.17.0.8/16 brd 172.17.255.255 scope global eth0valid_lft forever preferred_lft forever
eth0@if43,这个就是我们本机给容器分配的ip地址。
[root@9baa869a6b4d /]# ping 172.17.0.8PING 172.17.0.8 (172.17.0.8) 56(84) bytes of data.64 bytes from 172.17.0.8: icmp_seq=1 ttl=64 time=0.061 ms64 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
现象

可以看到,只要容器运行,就会被分配一个veth开头的网关信息
这就是我们强调的veth-pair技术
我们再进入第二个容器看看网关
[root@de7b70d2f1c1 /]# ip addr1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever46: eth0@if47: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group defaultlink/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0valid_lft forever preferred_lft forever
46: eth0@if47//发现第二个容器里,它是46 绑定着linux本机 47这个网络
那么不同容器间,可以ping通吗?
可以,因为不同容器都被docker0管理,相当于就在一个局域网下一样,肯定是能互相ping通的


思考
那这就带出一个问题,只要容器重启,ip就重新分配,但是我们如果在项目中写定了mysql url连接,我们可否通过容器名字来进行一个绑定
容器互连(不建议使用)
--link 要连接的容器名
docker run -id -P --name tomcat03 --link tomcat02 镜像名docker exec -it tomcat03 ping tomcat02
反向可以ping通吗?
不可以,因为没有配置
通过docker inspect
host文件
在容器内打开host文件,host文件路径是/etc/hosts
可以看到host文件里面已经绑定了另一个容器,访问tomcat02转发到 172.18.0.3(这个是tomcat02的ip)
自定义网络(推荐使用)
网络模式
bridge :桥接模式
none:不配置网络
host:和宿主机共享网络
桥接
配置
创建一个mynet名字的桥接方式子网为192.168.0.0/16,被分配网关为192.168.0.1的网络配置
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway192.168.0.1 mynet------解析--------subnet 子网--gateway 网关
运用
用配置的子网信息来运行一个容器,就相当于只要你运行容器带上我们配置好的网络文件,该容器就会被分配到网络文件里配置的子网里,会在子网里给这个容器生成一个ip
docker run -d -P --name tomcat-net-01 --net mynetdocker run -d -P --name tomcat-net-02 --net mynet

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

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