我们在学会安装和简单的使用docker后,我们来了解下docker的网络,包括docker原生网络和如何创建我们需要的自定义网络,学习容器间如何通信以及怎么和外界进行通信
一、docker默认的网络
[root@my_server ~]# docker network lsNETWORK ID NAME DRIVER SCOPE61971e22a415 bridge bridge local41f9794cbf9f host host locale266e5678236 none null local
1.1、none网络就是什么网络都没有,除了环回口,没有其他任何的网卡
[root@my_server ~]# docker run -it --network=none busyboxUnable to find image 'busybox:latest' locallylatest: Pulling from library/busybox322973677ef5: Pull completeDigest: sha256:1828edd60c5efd34b2bf5dd3282ec0cc04d47b2ff9caa0b6d4f07a21d1c08084Status: Downloaded newer image for busybox:latest/ # ifconfiglo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)/ #
这样的网络经常用于一些测试或者存储密码等用途
1.2、host网络是容器共享Docker Host的网络栈,与宿主机网络一模一样
[root@my_server ~]# docker run -it --network=host busybox/ # ifconfigdocker0 Link encap:Ethernet HWaddr 02:42:AC:69:5B:F8 inet addr:172.17.0.1 Bcast:172.17.255.255 Mask:255.255.0.0 inet6 addr: fe80::42:acff:fe69:5bf8/64 Scope:Link UP BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:3 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 B) TX bytes:266 (266.0 B)ens33 Link encap:Ethernet HWaddr 00:0C:29:52:39:DE inet addr:192.168.157.147 Bcast:192.168.157.255 Mask:255.255.255.0 inet6 addr: fe80::8838:4f47:5581:2643/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:3685 errors:0 dropped:0 overruns:0 frame:0 TX packets:1603 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:1799256 (1.7 MiB) TX bytes:197037 (192.4 KiB)lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)/ # hostnamemy_server
我本机也是一个ens33网卡,一个docker0虚拟网卡和lo,它的主机名都使用的是宿主机的主机名
该场景主要用于需要大量数据传输,要求性能较好的情况下
1.3、bridge网络---应用最广泛的网络模式
[root@my_server ~]# docker run -it -d busybox1fb06c62819b0d3bfbf0b8ee5849aa53586f679d5d6ebdfdcf7e895e2082323e[root@my_server ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES1fb06c62819b busybox "sh" 2 seconds ago Up 2 seconds silly_beaver[root@my_server ~]# brctl showbridge name bridge id STP enabled interfacesdocker0 8000.0242ac695bf8 no veth5965854[root@my_server ~]# docker exec -it 1fb06c62819b sh/ # ip a1: lo: mtu 65536 qdisc noqueue 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 forever14: eth0@if15: mtu 1500 qdisc noqueue link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0 valid_lft forever preferred_lft forever/ #
可以看到默认创建的容器都挂在了docker0的默认bridge网桥上
容器里面的eth0@if15和veth5965854是一对veth pair,可以想象虚拟网线连接起来的一对网卡,示意图如下
二、用户自定义网络
docker提个三种自定义的网络驱动:bridge(默认)、overlay、macvlan
overlay、macvlan主要用于跨主机网络通讯,这个我们后面在进行学习
2.1、创建一个默认驱动(bridge)的自定义网络
[root@my_server ~]# docker network create --driver bridge my_network181f81542dc2b07b899da4cf1874b3e86d7e11dabaa1a0fa6f7e333934a7d446[root@my_server ~]# brctl showbridge name bridge id STP enabled interfacesbr-181f81542dc2 8000.02428b7e7023 nobr-7f629c2406e1 8000.02425cdc9f34 nobr-b4feab77c011 8000.0242c539187b nodocker0 8000.0242ac695bf8 no veth5965854
新增加了一个网桥181f81542dc2,下图是它的信息,其中IP和网关都可以在自己创建的时候指定
2.2、创建一个指定网段和网关的自定义bridge网络
[root@my_server ~]# docker network create --subnet 172.22.16.0/24 --gateway 172.22.16.1 my_network_define961e809ac5ea1e37e6c8d58ceff167307200d4c2dbc9e1ac9da3f79db24bd452[root@my_server ~]# docker network inspect my_network_define[ { "Name": "my_network_define", "Id": "961e809ac5ea1e37e6c8d58ceff167307200d4c2dbc9e1ac9da3f79db24bd452", "Created": "2019-12-13T13:22:31.790686709+08:00", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": {}, "Config": [ { "Subnet": "172.22.16.0/24", "Gateway": "172.22.16.1" } ] },
2.3、使用自定义的网络创建一个容器,我们也可以自己指定IP,使用 --ip 172.22.16.x来指定,当然这个也是只能用在我们指定网段的自定义网络中,如果用在非指定网络中会出现报错
[root@my_server ~]# docker run -it --network=my_netwirk_define busybox/ # ip a1: lo: mtu 65536 qdisc noqueue 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 forever20: eth0@if21: mtu 1500 qdisc noqueue link/ether 02:42:ac:16:10:02 brd ff:ff:ff:ff:ff:ff inet 172.22.16.2/24 brd 172.22.16.255 scope global eth0 valid_lft forever preferred_lft forever/ # [root@my_server ~]# docker run -it --network=my_network --ip 172.20.0.5 busyboxdocker: Error response from daemon: user specified IP address is supported only when connecting to networks with user configured subnets.ERRO[0000] error waiting for container: context canceled
三、容器之间通信
解决方案主要有Docker 自带的DNS服务,IP和join三种方式
3.1、通过DNS通信
[root@my_server ~]# docker run -it --network=my_netwirk_define --name=box1 busybox[root@my_server ~]# docker run -it --network=my_netwirk_define --name=box2 busybox/ # ping -c 4 box1
使用DNS的限制:只能在user-defined网络中使用,默认的bridge网络是无法使用的
3.2、通过join方式---原理是两个或者多个容器共享一个网络栈,共享网卡的配置信息
[root@my_server ~]# docker run -it -d --name=box3 busybox6c0d6c0009ab53a23d90fdcf24c6197a57e3a759bee83b70456d712d02a957b3 [root@my_server ~]# docker exec -it box3 sh/ # ip a1: lo: mtu 65536 qdisc noqueue 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 forever30: eth0@if31: mtu 1500 qdisc noqueue link/ether 02:42:ac:11:00:04 brd ff:ff:ff:ff:ff:ff inet 172.17.0.4/16 brd 172.17.255.255 scope global eth0 valid_lft forever preferred_lft forever[root@my_server ~]# docker run -it --network=container:box3 busybox/ # ip a1: lo: mtu 65536 qdisc noqueue 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 forever30: eth0@if31: mtu 1500 qdisc noqueue link/ether 02:42:ac:11:00:04 brd ff:ff:ff:ff:ff:ff inet 172.17.0.4/16 brd 172.17.255.255 scope global eth0 valid_lft forever preferred_lft forever
这里我们可以看到两个容器的网络信息一模一样,共享了网络信息,join适合的场景
(1)、不同容器希望通过loopback高效快速的通信
(2)、希望监控其他容器的网络流量