Docker网络

378 阅读4分钟

查看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为容器分配了一个网桥对

image.png

测试容器间的通信

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技术实现容器间的通信

image.png

由上图,相信聪明的你应该可以看出容器通信的原理了

容器通信原理.png

总结: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": {}
    }
]

总结:使用自定义的网络通过容器名实现通信,在微服务发布下实现快速扩缩容!