查看docker网络类型
root:~ $ docker network ls
NETWORK ID NAME DRIVER SCOPE
2294b8d47566 bridge bridge local
7ff5fac64629 host host local
ffdd428e9c41 none null local
查看网络
# 查看本机ip
root:~ $ ip addr
# 本机回环地址
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
# 阿里云内网地址
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:16:3e:04:96:35 brd ff:ff:ff:ff:ff:ff
inet 172.18.240.142/20 brd 172.18.255.255 scope global dynamic eth0
valid_lft 281094494sec preferred_lft 281094494sec
inet6 fe80::216:3eff:fe04:9635/64 scope link
valid_lft forever preferred_lft forever
# docker0是docker网络地址
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:70:ff:98:d0 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:70ff:feff:98d0/64 scope link
valid_lft forever preferred_lft forever
# 容器地址
85: veth654c937@if84: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether 02:d1:7a:b1:94:aa brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet6 fe80::d1:7aff:feb1:94aa/64 scope link
valid_lft forever preferred_lft forever
# 容器地址 docker为容器分配一个IP地址vethb825d28@if86,通过网桥(一对网卡)对进行匹配87:86
87: vethb825d28@if86: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether 26:c6:e9:2e:a8:b6 brd ff:ff:ff:ff:ff:ff link-netnsid 1
inet6 fe80::24c6:e9ff:fe2e:a8b6/64 scope link
valid_lft forever preferred_lft forever
docker网络原理
只要安装了docker,宿主机就会有一个网卡docker0桥接模式,每启动一个docker容器,docker就会为容器分配一个ip,使用的技术是evth-pair(网桥)技术!
测试一下!! 可以看到启动一个新的容器,docker为容器分配了一个网桥对
测试容器间的通信
root:~ $ docker exec -it centos1 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
88: eth0@if89: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
root:~ $ docker exec -it centos2 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
90: eth0@if91: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
root:~ $ docker exec -it centos1 ping 172.17.0.3
PING 172.17.0.3 (172.17.0.3) 56(84) bytes of data.
64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.105 ms
64 bytes from 172.17.0.3: icmp_seq=2 ttl=64 time=0.091 ms
64 bytes from 172.17.0.3: icmp_seq=3 ttl=64 time=0.083 ms
64 bytes from 172.17.0.3: icmp_seq=4 ttl=64 time=0.088 ms
查看IP地址信息可以看到docker通过evth-pair技术实现容器间的通信
由上图,相信聪明的你应该可以看出容器通信的原理了
总结:centos1和centos2 通过公用的路由器(docker0)实现通信!
容器间不指定网络的情况下,都是docker0路由的,docker会为容器分配一个默认可用的IP!
分配IP上限(根据子网区分):172.17.0.2/16 上限:255*255;172.17.0.2/24 上限:255
docker0的缺点
root:~ $ docker exec -it centos1 ping 172.17.0.3
PING 172.17.0.3 (172.17.0.3) 56(84) bytes of data.
64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.079 ms
64 bytes from 172.17.0.3: icmp_seq=2 ttl=64 time=0.081 ms
^C
--- 172.17.0.3 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 8ms
rtt min/avg/max/mdev = 0.079/0.080/0.081/0.001 ms
root:~ $ docker exec -it centos1 ping centos2
ping: centos2: Name or service not known
原生docker容器之间无法通过容器名通信!!!
自定义网络来了
# docker网络模式
root:~ $ docker network ls
NETWORK ID NAME DRIVER SCOPE
2294b8d47566 bridge bridge local
7ff5fac64629 host host local
ffdd428e9c41 none null local
tip: docker run -dit -P --name centos1 centos = docker run -dit -P --name centos1 --net bridge centos
创建网络模式
# 使用桥接模式 --driver bridge
# 分配子网 --subnet 192.168.0.0/16
# 分配网关(网络出口) --gateway 192.168.0.1
root:~ $ docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
dfd664e6ada8011941f6287e14a9ae272ef74747f6def44ba65d45d754cde461
root:~ $ docker network ls
NETWORK ID NAME DRIVER SCOPE
2294b8d47566 bridge bridge local
7ff5fac64629 host host local
dfd664e6ada8 mynet bridge local
ffdd428e9c41 none null local
root:~ $ docker inspect mynet
[
{
"Name": "mynet",
"Id": "dfd664e6ada8011941f6287e14a9ae272ef74747f6def44ba65d45d754cde461",
"Created": "2021-09-08T10:11:28.152426072+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.0.0/16",
"Gateway": "192.168.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
使用自定义网络启动容器
root:~ $ docker run -dit -P --name centos3 --net mynet centos
6a665f9682d94f46588aebab5e7231635abfdf2dd437343ef603333d7f5b5f29
root:~ $ docker run -dit -P --name centos4 --net mynet centos
437b46ed31953e4dc865dacdcaa66364a469d19b0ab515e3ddb83d14195bac42
root:~ $ docker exec -it centos3 ping centos4
PING centos4 (192.168.0.3) 56(84) bytes of data.
64 bytes from centos4.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.136 ms
64 bytes from centos4.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.081 ms
^C
--- centos4 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 2ms
rtt min/avg/max/mdev = 0.081/0.108/0.136/0.029 ms
root:~ $ docker network inspect mynet
[
{
"Name": "mynet",
"Id": "dfd664e6ada8011941f6287e14a9ae272ef74747f6def44ba65d45d754cde461",
"Created": "2021-09-08T10:11:28.152426072+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.0.0/16",
"Gateway": "192.168.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"437b46ed31953e4dc865dacdcaa66364a469d19b0ab515e3ddb83d14195bac42": {
"Name": "centos4",
"EndpointID": "c452f49a1957ece9ea4020597072c8ed9e2258efc6475445f2d34fbcba93f558",
"MacAddress": "02:42:c0:a8:00:03",
"IPv4Address": "192.168.0.3/16",
"IPv6Address": ""
},
"6a665f9682d94f46588aebab5e7231635abfdf2dd437343ef603333d7f5b5f29": {
"Name": "centos3",
"EndpointID": "08f5e5cede761596b843cb1b3141a588798684355bdf48cc7b661bf1e855d83f",
"MacAddress": "02:42:c0:a8:00:02",
"IPv4Address": "192.168.0.2/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
总结:使用自定义的网络通过容器名实现通信,在微服务发布下实现快速扩缩容!