Docker-网络模型-进阶

1、Docker网络解析

1.1、简介

Docker默认采用的网络模型是 bridge,本质上是一种网络地址转换。
所以 同一宿主机上 采用默认网络模式启动的所有容器,都可以自由通信
因为 不同宿主机上 的容器的启动ip是重复的,所以原则上,默认不能自由通信

1.2、分析网络路由实践

1.2.1、启动一个容器

# 进入容器
]# docker run -it --rm ubuntu_ssh:v0.1 bash
root@5231ae466d3a:/# apt update && apt install iputils-ping -y

# 能访问外网
ping -c1 www.baidu.com 

1.2.2、查看容器路由

# 数据都路由到172.17.0.1
root@5231ae466d3a:/# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.17.0.1      0.0.0.0         UG    0      0        0 eth0
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 eth0

1.2.3、退出容器,回到ubuntu宿主机,查看docker虚拟网卡

# 退出容器,回到ubuntu宿主机,查看docker虚拟网卡
]# ifconfig docker0
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255

1.2.4、查看虚拟网桥效果

yum install -y bridge-utils

]# brctl show
bridge name     bridge id               STP enabled     interfaces
br-f390d8bfd39d         8000.0242ac9304d9       no
docker0         8000.02425db6a8b5       no

1.2.5、查看宿主机的网络转发功能

]# cat /proc/sys/net/ipv4/ip_forward
1

1.3、同一宿主机上的多个容器是可以自由通信实践【默认】

1.3.1、启动两个容器

docker run --name net-test1 -d busybox sleep 36000
docker run --name net-test2 -d busybox sleep 36000

1.3.2、相互ping

]# docker exec -it net-test1 ping -c1 172.17.0.3
PING 172.17.0.3 (172.17.0.3): 56 data bytes
64 bytes from 172.17.0.3: seq=0 ttl=64 time=0.182 ms


]# docker exec -it net-test2 ping -c1 172.17.0.2
PING 172.17.0.2 (172.17.0.2): 56 data bytes
64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.088 ms

# 默认容器是可以相互ping通的

1.4、可以通过 dockerd的参数来进行同一主机上的网络禁止通信【同一机器的容器设置间不能通讯】

1.4.1、关键参数

]# dockerd --help | grep icc
      --icc                                     Enable inter-container communication (default true)

1.4.2、禁用容器通讯

]# vi /lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd --icc=false -H fd:// --containerd=/run/containerd/containerd.sock

1.4.3、重启docker服务

systemctl daemon-reload 
systemctl restart docker

1.4.4、此时容器间ping不通

]# docker exec -it net-test1 ping -c1 172.17.0.3
PING 172.17.0.3 (172.17.0.3): 56 data bytes

]# docker exec -it net-test2 ping -c1 172.17.0.2
PING 172.17.0.3 (172.17.0.3): 56 data bytes

1.5、更换docker容器本身的网络桥接设备实践【了解】

1.5.1、关键命令参数

]# dockerd --help | grep bridge-b, --bridge string                           Attach containers to a network bridge

1.5.2、创建虚拟网桥

brctl addbr br0
brctl stp br0 on
ifconfig br0 10.0.1.12/24 up

]# brctl show
bridge name     bridge id               STP enabled     interfaces
br-f390d8bfd39d         8000.0242ac9304d9       no
br0             8000.000000000000       yes
docker0         8000.02425db6a8b5       no              veth36d1989

]# ifconfig br0
br0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 10.0.1.12  netmask 255.255.255.0  broadcast 10.0.1.255

1.5.3、修改docker网桥

]# vi /lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -b br0 -H fd:// --containerd=/run/containerd/containerd.sock


systemctl daemon-reload 
systemctl restart docker

1.5.4、启动容器测试

docker start net-test1

]# docker exec -it net-test1 sh
/ # ifconfig 
eth0      Link encap:Ethernet  HWaddr 02:42:0A:00:01:01  
          inet addr:10.0.1.1  Bcast:10.0.1.255  Mask:255.255.255.0

# 此时网口的IP地址,已经是我们创建的网桥地址了

1.6、容器名称互联

1.6.1、需求

我们知道,容器默认启动的时候,docker会为其分配动态的ip地址和相关的信息,而且随着docker的重启,
同一容器的ip也会发生不断的改变,那么我们就需要有一种能够不用查看容器ip,就可以自由的与指定容器通
信的方式。 -- 容器名称互联

1.6.2、什么是容器名称互联

所谓的容器名称互联,其实说的就是 我们不再以容器ip的方式进行通信,而是基于容器的名称来实现自由的
通信,根据容器名称的生成方式,这里主要有两种分类:默认的容器名称互联 和 自定义容器名称互联。

1.6.3、关键命令参数

]# docker run --help | grep -E "\\--link li|\\--name"
      --link list                      Add link to another container
      --name string                    Assign a name to the container

注意:
    需要两个同时使用
    --link的完整写法是 --link 目标容器名称:目标容器别名

1.6.4、通主机容器名称互联

# 第一个容器不要使用 --link,因为没有别的容器可连接
docker run --name net-name1 -d busybox sleep 36000

# 查看容器的主机名效果
]# docker exec -it net-name1 hostname
6db68acc6242

]# docker exec -it net-name1 cat /etc/hosts
...
172.17.0.2      6db68acc6242


# 第二个容器启动的时候,使用 --link关联其他容器
docker run --name net-name2 --link net-name1 -d busybox sleep 36000

# 查看主机名效果
]# docker exec -it net-name2 cat /etc/hosts
...
172.17.0.2      net-name1 6db68acc6242
172.17.0.3      7013c2f63fb0

1.6.5、使用容器名字ping其它容器

]#  docker exec -it net-name2 ping -c1 net-name1
PING net-name1 (172.17.0.2): 56 data bytes
64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.067 ms

1.6.6、启动第三个容器,给目标容器起一个别名

docker run --name net-name3 --link net-name1:server1 --link net-name2:server2 -d busybox sleep 36000

1.6.7、查询容器hosts

]# docker exec -it net-name3 tail -n3 /etc/hosts
172.17.0.2      server1 6db68acc6242 net-name1
172.17.0.3      server2 7013c2f63fb0 net-name2
172.17.0.4      62ede9dbf8be

2、网络模型

2.2、网络模型分类

网络模型分类:
bridge 容器连接到虚拟网桥,借助于宿主机的nat模式来上网,默认模式,自由方便,不可控
host 借助于宿主机的ip地址来进行通信,性能好,多主机容器间无网络隔离,受宿主机端口限制
none 容器本身不包含任何网络信息,需要自己的高度定制
container 容器间公用网络空间,一个进阶版的容器名称通信
overlay

2.3、bridge模型

默认就是bridge

2.4、host模型

2.4.1、模型特点

直接使用宿主机的网络ip和容器本身的ip地址进行通信

2.4.2、启动容器

docker run -d --network host  -p 8080:8080 tomcat-webapp1:v0.1

2.4.3、查看容器的网络

# 发现网口跟宿主机一样
]# docker exec -it 6f7df9e4a0e6 /bin/bash 
root@redis-01:/usr/local/apache-tomcat-9.0.75# ifconfig  | grep "inet 1"
        inet 10.0.1.12  netmask 255.255.255.0  broadcast 10.0.1.255
        inet 172.18.0.1  netmask 255.255.0.0  broadcast 172.18.255.255
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        inet 192.168.10.19  netmask 255.255.255.0  broadcast 192.168.10.255
        inet 127.0.0.1  netmask 255.0.0.0

2.4.4、访问测试

2.5、none模型

2.5.1、模型特点

容器本身没有进行任何网络的定制,甚至都没有自己的网卡设备,需要自己定制网络效果

2.5.2、启动容器

docker run -d --network none busybox sleep 36000

2.5.3、查询网口

# 发现只有lo网口,没有其它的
]# docker exec -it 0a541be29c0e ifconfig
lo        Link encap:Local Loopback  

2.6、container 模型

2.6.1、模型特点

容器间共享一个网络空间,网络空间里面的容器是否能够与主机通信,主要有第一个容器来决定

2.6.2、container bridge实践

# 第一个容器定制名称(使用桥接模型)
# 默认bridge模型
docker run -d --name web1 busybox sleep 3600

# 第二个容器使用container模型
docker run -d --network container:web1 --name web2 busybox sleep 3600

# 继承web1 bridge模型,可以访问外网
]# docker exec -it web2 ping -c1  www.baidu.com
PING www.baidu.com (120.232.145.185): 56 data bytes
64 bytes from 120.232.145.185: seq=0 ttl=127 time=11.462 ms

2.6.3、container none实践

# 第一个容器定制名称(使用none模型)
docker run -d --network=none --name none1 busybox sleep 3600

# 第二个容器使用container模型
docker run -d --network container:none1 --name none2 busybox sleep 36000

# 继承none1,无法对外通讯
]# docker exec -it none2 ping -c1 www.baidu.com
ping: bad address 'www.baidu.com'

 

posted @ 2023-05-19 17:42  小粉优化大师  阅读(32)  评论(0编辑  收藏  举报