网络是激活Docker体系的唯一途径,如果Docker没有比较出色的容器网络,那么Docker根本没有如今的竞争力,起初Docker网络的解决方案并不理想,但是经过最近几年的发展,再加上很多云计算服务商都参与了进来,大批的SDN方案如雨后春笋般的冒了出来。

前提准备

官网链接:

https://developer.aliyun.com/mirror/docker-ce?spm=a2c6h.13651102.0.0.111e1b11jyJEib

​
安装docker-ce

[root@localhost ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

[root@localhost ~]# yum -y install yum-utils device-mapper-persistent-data lvm2

[root@localhost ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

[root@localhost ~]# ls /etc/yum.repos.d/

backup  Centos-aliyun.repo  CentOS-Media.repo  docker-ce.repo

[root@localhost ~]# yum -y install docker-ce

[root@localhost ~]# systemctl start docker

[root@localhost ~]# systemctl enable docker

阿里云镜像加速器

[root@localhost ~]# cat << END > /etc/docker/daemon.json

{

        "registry-mirrors":[ "https://nyakyfun.mirror.aliyuncs.com" ]

}

END

[root@localhost ~]# systemctl daemon-reload

[root@localhost ~]# systemctl restart docker

[root@localhost ~]# docker version

Client: Docker Engine - Community

 Version:           19.03.8

 API version:       1.40

 Go version:        go1.12.17

 Git commit:        afacb8b

 Built:             Wed Mar 11 01:27:04 2020

 OS/Arch:           linux/amd64

 Experimental:      false

Server: Docker Engine - Community

 Engine:

  Version:          19.03.8

  API version:      1.40 (minimum version 1.12)

  Go version:       go1.12.17

  Git commit:       afacb8b

  Built:            Wed Mar 11 01:25:42 2020

  OS/Arch:          linux/amd64

  Experimental:     false

 containerd:

  Version:          1.2.13

  GitCommit:        7ad184331fa3e55e52b890ea95e65ba581ae3429

 runc:

  Version:          1.0.0-rc10

  GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd

 docker-init:

  Version:          0.18.0

  GitCommit:        fec3683

[root@docker ~]# docker pull nginx

[root@docker ~]# docker pull busybox

[root@docker ~]# docker pull mysql

[root@docker ~]# vim /etc/sysctl.conf

net.ipv4.ip_forward = 1

[root@docker ~]# sysctl -p

​

一、Docker网络基础

Docker目前对单节点的设备提供了将容器端口映射到宿主机和容器互联两个网络服务。

1.1、端口映射

        在Docker中容器默认是无法与外部通信的,需要在启动命令中加入对应的参数才允许容器与外界通信。

        当Docker中运行一个Web服务时,需要把容器内的Web服务应用程序端口映射到本地宿主机的端口。这样,用户访问宿主机指定的端口的话,就相当于访问容器内部的Web服务端口。

1、使用-P选项时Docker会随机映射一个端口至容器内部的开放端口

[root@docker ~]# docker run -d -P --name test1 nginx

##使用docker port可以查看端口映射情况

[root@docker ~]# docker port test1

80/tcp -> 0.0.0.0:32768

使用docker logs查看Nginx的日志

[root@docker ~]# docker logs test1

172.17.0.1 - - [24/Nov/2020:14:45:37 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"



查看映射的随机端口范围

[root@docker ~]# cat /proc/sys/net/ipv4/ip_local_port_range

32768 60999

2、使用-p可以指定要映射到的本地端口。

  • Local_Port:Container_Port

端口映射参数中指定了宿主机的8000映射到容器内部的80端口,可以多次使用-p选项

[root@docker ~]# docker run -d -p 8000:80 --name test2 nginx

这种方式会映射到所有接口地址,所有访客都可以通过宿主机所有IP的端口来访问容器。

  • Local_IP:Local_Port:Container_Port

映射到指定地址的指定端口

[root@docker ~]# docker run -d -p 192.168.200.111:9000:80 --name test3 nginx

  • Local_IP::Container_Port

映射到指定地址,但是宿主机端口是随机分配的

[root@docker ~]# docker run -d -p 192.168.200.111::80 --name test4 nginx

[root@docker ~]# docker port test4

80/tcp -> 192.168.200.111:32769

  • 指定传输协议
[root@docker ~]# docker run -d -p 80:80/tcp --name test5 nginx

[root@docker ~]# docker port test5

80/tcp -> 0.0.0.0:80

1.2、端口暴露

        咱们之前讲过EXPOSE命令用于端口暴露,很多人会把端口暴露和端口映射混为一谈,目前有两种方式用于端口暴露,--expose和EXPOSE方式,这两种方式作用相同,但是--expose可以接受端口范围作为参数,例如--expose=2000~3000。

        Dockerfile的作者一般在包含EXPOSE规则时都只提示哪个端口提供哪个服务。访问时还需要运维人员通过端口映射来指定。--expose和EXPOSE只是为其他命令提供所需信息的元数据。

通过docker inspect container_name查看网络配置:

[root@docker ~]# docker inspect test1

        "NetworkSettings": {

            "Bridge": "",

            "SandboxID": "c83ae4368c468d3054eede1a83a3a67fe9dc375013f4a585387e5e16243406b3",

            "HairpinMode": false,

            "LinkLocalIPv6Address": "",

            "LinkLocalIPv6PrefixLen": 0,

            "Ports": {

                "80/tcp": [

                    {

                        "HostIp": "0.0.0.0",

                        "HostPort": "32768"

                    }

                ]

            },

1.3、容器互联

        容器互联是除了端口映射外另一种可以与容器通信的方式。端口映射的用途是宿主机网络与容器的通信,而容器互联是容器之间的通信。

        当前实现容器互联有两种方式,一种是把两个容器放进一个用户自定义的网络中,另一种是使用--link参数(已经弃用,即将删除的功能)。

        为什么要使用一个单独的网络来连接两个容器呢?

        设想一下后端容器需要调用一个数据库环境,数据库容器和后端服务容器如果使用上下文中的暴露端口或者映射端口来通信,势必会把数据库的端口也暴露在外网中,导致数据库容器的安全性大大降低,为了解决这个问题,docker允许用户建立一个独立的网络来放置相应的容器,只有在该网络中的容器才能相互通信,外部容器是无法进入这个特定网络中的。

一个容器可以同时加入多个网络,使用不同地址可以访问不同网络中的容器。

用户自定义的网络

首先创建两个容器,命名为container1和container2

[root@docker ~]# docker run -itd --name=container1 busybox

6200098cb616e6f414b39934153bb18388908547cd1049ea94851df57ec4b74f

[root@docker ~]# docker run -itd --name=container2 busybox

2d77db9b4415f9446f700cd7fb4ad7cf5352797bf79dd712dc69a5ebb139a1f7

        接下来创建一个独立的容器网络,这里使用bridge驱动(桥接模式),其他可选的值还有overlay和macvlan。

[root@docker ~]# docker network create -d bridge --subnet 172.25.0.0/16 demo_net

2abcbbf2ecae053b2abdf04fe3169359ca1720711326010762f8fa5e7a08abc5

[root@docker ~]# docker network ls

NETWORK ID          NAME                DRIVER              SCOPE

a6f1f7907e11        bridge              bridge              local

2abcbbf2ecae        demo_net            bridge              local

e963d0ca867a        host                host                local

3995cdd212c7        none                null                local

使用--subnet和--gateway可以指定子网和网关,现在我们把container2加入到demo_net中

[root@docker ~]# docker network connect demo_net container2

[root@docker ~]# docker network inspect demo_net

        "Containers": {

            "2d77db9b4415f9446f700cd7fb4ad7cf5352797bf79dd712dc69a5ebb139a1f7": {

                "Name": "container2",

                "EndpointID": "edccd77eb0fc4a1bf928109ebe4a832a51b506ede59455d934184c1ae26439b5",

                "MacAddress": "02:42:ac:19:00:02",

                "IPv4Address": "172.25.0.2/16",

                "IPv6Address": ""

            }

        },

        使用docker network inspect可以查看网络中容器的连接状态。Container2已经在demo_net网络中,注意IP地址使自动分配的。

启动第三个容器:

[root@docker ~]# docker run --network=demo_net --ip=172.25.3.3 -itd --name=container3 busybox

e480fceffe8be7bbc3bed1c2adca16f75d121a1832dabd6e91a80c7ee6969148

[root@docker ~]# docker network inspect demo_net

        "Containers": {

            "71cf566a0b7de502c8843206853df1afa38093bb132d91ad0ea0d105b2bbb1e8": {

                "Name": "container2",

                "EndpointID": "4f56122d24bad49bc6b0e32910e652bf10584fccaac504d0124fb24d754fa01e",

                "MacAddress": "02:42:ac:19:00:02",

                "IPv4Address": "172.25.0.2/16",

                "IPv6Address": ""

            },

            "e59b255b9abe2d164c08b29411fa9c684f82dee5dbd959aca535ceeafbc527a6": {

                "Name": "container3",

                "EndpointID": "666aa849ea7b8e9662ed72b817432110543eafefe621cbb0217d850df79c5613",

                "MacAddress": "02:42:ac:19:03:03",

                "IPv4Address": "172.25.3.3/16",

                "IPv6Address": ""

            }

        },

查看三个容器内部的网络

[root@docker ~]# docker exec -it container1 ifconfig

eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:02  

          inet addr:172.17.0.2  Bcast:172.17.255.255  Mask:255.255.0.0

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:31 errors:0 dropped:0 overruns:0 frame:0

          TX packets:11 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:0

          RX bytes:3218 (3.1 KiB)  TX bytes:742 (742.0 B)



lo        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)



[root@docker ~]# docker exec -it container2 ifconfig

eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:03  

          inet addr:172.17.0.3  Bcast:172.17.255.255  Mask:255.255.0.0

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:33 errors:0 dropped:0 overruns:0 frame:0

          TX packets:15 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:0

          RX bytes:3460 (3.3 KiB)  TX bytes:994 (994.0 B)



eth1      Link encap:Ethernet  HWaddr 02:42:AC:19:00:02  

          inet addr:172.25.0.2  Bcast:172.25.255.255  Mask:255.255.0.0

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:24 errors:0 dropped:0 overruns:0 frame:0

          TX packets:4 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:0

          RX bytes:2598 (2.5 KiB)  TX bytes:280 (280.0 B)



lo        Link encap:Local Loopback  

          inet addr:127.0.0.1  Mask:255.0.0.0

          UP LOOPBACK RUNNING  MTU:65536  Metric:1

          RX packets:19 errors:0 dropped:0 overruns:0 frame:0

          TX packets:19 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000

          RX bytes:1502 (1.4 KiB)  TX bytes:1502 (1.4 KiB)



[root@docker ~]# docker exec -it container3 ifconfig

eth0      Link encap:Ethernet  HWaddr 02:42:AC:19:03:03  

          inet addr:172.25.3.3  Bcast:172.25.255.255  Mask:255.255.0.0

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:12 errors:0 dropped:0 overruns:0 frame:0

          TX packets:4 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:0

          RX bytes:936 (936.0 B)  TX bytes:280 (280.0 B)



lo        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)



[root@docker ~]# docker exec -it container2 ping 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.132 ms

64 bytes from 172.17.0.2: seq=1 ttl=64 time=0.214 ms

^C

--- 172.17.0.2 ping statistics ---

2 packets transmitted, 2 packets received, 0% packet loss

round-trip min/avg/max = 0.132/0.173/0.214 ms

[root@docker ~]# docker exec -it container2 ping 172.25.3.3

PING 172.25.3.3 (172.25.3.3): 56 data bytes

64 bytes from 172.25.3.3: seq=0 ttl=64 time=0.162 ms

64 bytes from 172.25.3.3: seq=1 ttl=64 time=0.184 ms



[root@docker ~]# docker exec -it container2 ping container3

PING container3 (172.25.3.3): 56 data bytes

64 bytes from 172.25.3.3: seq=0 ttl=64 time=0.160 ms

64 bytes from 172.25.3.3: seq=1 ttl=64 time=0.077 ms
使用link参数

        容器的连接(linking)系统是除了端口映射外另一种可以与容器中应用进行交互的方式。它会在源和接收容器之间创建一个隧道,接收容器可以看到源容器指定的信息。

使用这个参数容器必须设置一个名字,也就是--name指定的值。

[root@docker ~]# docker run -itd --name test busybox

7aa2300b180dc5ae443ac5791a77d54686cc7651eab8ce2fcae76a95731c8ba3

--link参数的格式: --link name:alias , 其中name是要链接的容器的名称,alias是这个链接的别名。

[root@docker ~]# docker run -itd --name=link --link test:test busybox

59c1602376ada1238e1ad5007ceaa9931b8309356a53f5aa7ec7a7adda93d205

[root@docker ~]# docker exec -it link ping test

PING test (172.17.0.5): 56 data bytes

64 bytes from 172.17.0.5: seq=0 ttl=64 time=0.201 ms

64 bytes from 172.17.0.5: seq=1 ttl=64 time=0.201 ms

如果忘记设置名字可以通过docker rename来重命名容器,容器名字是唯一的。

此外--link还可以传递环境变量,实现在两个容器之间共享环境变量。

二、Docker网络模式

安装Docker时会自动创建3个网络,可以使用docker network ls命令列出这些网络。

[root@docker ~]# docker network ls

NETWORK ID         NAME             DRIVER              SCOPE

2479ceca4e84        bridge              bridge              local

39e2de843b38        host                host                local

2621f28b1641        none                null                local

        我们在使用docker run创建容器时,可以用--net选项指定容器的网络模式,Docker有以下4种网络模式:

  1. Host模式,使用--net=host指定。
  2. Container模式,使用--net=container:NAME_or_ID指定。
  3. None模式,使用--net=none指定。
  4. Bridge模式,使用--net=bridge指定,默认设置。

2.1、Host模式

        Docker底层使用了Linux的Namespaces技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,Network Namespace隔离网络等。一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、Iptables规则等都与其他的Network Namespace隔离。

        一个Docker容器一般会分配一个独立的Network Namespace。但如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Root Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。出于安全考虑不推荐使用这种网络模式。

        我们在192.168.200.111/24的机器上用Host模式启动一个含有WEB应用的Docker容器,监听TCP 80端口。当我们在容器中执行任何类似ifconfig命令查看网络环境时,看到的都是宿主机上的信息。而外界访问容器中的应用,则直接使用192.168.200.111:80即可,不用任何NAT转换,就如直接跑在宿主机中一样。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。

[root@docker ~]# docker run -itd --net=host --name=host busybox

b8875395a491c00bcf57cebc8c7d49d364da5943c32991448e911a207af0b0ea

[root@docker ~]# docker exec -it host ifconfig

br-cbbd18004d01 Link encap:Ethernet  HWaddr 02:42:DA:05:B0:06  

          inet addr:172.25.0.1  Bcast:172.25.255.255  Mask:255.255.0.0

          inet6 addr: fe80::42:daff:fe05:b006/64 Scope:Link

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:1 errors:0 dropped:0 overruns:0 frame:0

          TX packets:12 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:0

          RX bytes:28 (28.0 B)  TX bytes:1662 (1.6 KiB)



docker0   Link encap:Ethernet  HWaddr 02:42:97:BF:DB:16  

          inet addr:172.17.0.1  Bcast:172.17.255.255  Mask:255.255.0.0

          inet6 addr: fe80::42:97ff:febf:db16/64 Scope:Link

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:22 errors:0 dropped:0 overruns:0 frame:0

          TX packets:27 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:0

          RX bytes:980 (980.0 B)  TX bytes:3180 (3.1 KiB)



ens33     Link encap:Ethernet  HWaddr 00:0C:29:CE:EF:5F  

          inet addr:192.168.200.111  Bcast:192.168.200.255  Mask:255.255.255

.0          inet6 addr: fe80::d69a:8775:e61a:bae1/64 Scope:Link

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:294619 errors:0 dropped:0 overruns:0 frame:0

          TX packets:69315 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000

          RX bytes:426399659 (406.6 MiB)  TX bytes:5125327 (4.8 MiB)



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:74 errors:0 dropped:0 overruns:0 frame:0

          TX packets:74 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000

          RX bytes:6220 (6.0 KiB)  TX bytes:6220 (6.0 KiB)



veth29219db Link encap:Ethernet  HWaddr E6:D1:C5:31:23:E6  

          inet6 addr: fe80::e4d1:c5ff:fe31:23e6/64 Scope:Link

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:4 errors:0 dropped:0 overruns:0 frame:0

          TX packets:13 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:0

          RX bytes:280 (280.0 B)  TX bytes:978 (978.0 B)



veth356a015 Link encap:Ethernet  HWaddr 66:98:14:28:88:6B  

          inet6 addr: fe80::6498:14ff:fe28:886b/64 Scope:Link

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:4 errors:0 dropped:0 overruns:0 frame:0

          TX packets:12 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:0

          RX bytes:280 (280.0 B)  TX bytes:936 (936.0 B)



veth485953e Link encap:Ethernet  HWaddr 22:7C:14:AE:23:83  

          inet6 addr: fe80::207c:14ff:feae:2383/64 Scope:Link

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:11 errors:0 dropped:0 overruns:0 frame:0

          TX packets:19 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:0

          RX bytes:854 (854.0 B)  TX bytes:1510 (1.4 KiB)



veth5353e56 Link encap:Ethernet  HWaddr FE:33:36:04:A4:79  

          inet6 addr: fe80::fc33:36ff:fe04:a479/64 Scope:Link

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:11 errors:0 dropped:0 overruns:0 frame:0

          TX packets:31 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:0

          RX bytes:854 (854.0 B)  TX bytes:3172 (3.0 KiB)



veth895fcaa Link encap:Ethernet  HWaddr CE:69:CB:02:5C:46  

          inet6 addr: fe80::cc69:cbff:fe02:5c46/64 Scope:Link

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:19 errors:0 dropped:0 overruns:0 frame:0

          TX packets:40 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:0

          RX bytes:1302 (1.2 KiB)  TX bytes:3820 (3.7 KiB)



veth8ccf20f Link encap:Ethernet  HWaddr 32:E8:09:C3:53:FC  

          inet6 addr: fe80::30e8:9ff:fec3:53fc/64 Scope:Link

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:4 errors:0 dropped:0 overruns:0 frame:0

          TX packets:12 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:0

          RX bytes:280 (280.0 B)  TX bytes:936 (936.0 B)



vethe977319 Link encap:Ethernet  HWaddr 82:9C:A5:2A:2B:C2  

          inet6 addr: fe80::809c:a5ff:fe2a:2bc2/64 Scope:Link

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:22 errors:0 dropped:0 overruns:0 frame:0

          TX packets:42 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:0

          RX bytes:1456 (1.4 KiB)  TX bytes:4156 (4.0 KiB)



virbr0    Link encap:Ethernet  HWaddr 52:54:00:0B:2F:5D  

          inet addr:192.168.122.1  Bcast:192.168.122.255  Mask:255.255.255.0

          UP BROADCAST MULTICAST  MTU:1500  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)



[root@docker ~]# ifconfig

br-cbbd18004d01: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

        inet 172.25.0.1  netmask 255.255.0.0  broadcast 172.25.255.255

        inet6 fe80::42:daff:fe05:b006  prefixlen 64  scopeid 0x20<link>

        ether 02:42:da:05:b0:06  txqueuelen 0  (Ethernet)

        RX packets 11  bytes 854 (854.0 B)

        RX errors 0  dropped 0  overruns 0  frame 0

        TX packets 19  bytes 1510 (1.4 KiB)

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0



docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255

        inet6 fe80::42:97ff:febf:db16  prefixlen 64  scopeid 0x20<link>

        ether 02:42:97:bf:db:16  txqueuelen 0  (Ethernet)

        RX packets 22  bytes 980 (980.0 B)

        RX errors 0  dropped 0  overruns 0  frame 0

        TX packets 27  bytes 3180 (3.1 KiB)

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0



ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

        inet 192.168.200.111  netmask 255.255.255.0  broadcast 192.168.200.255

        inet6 fe80::d69a:8775:e61a:bae1  prefixlen 64  scopeid 0x20<link>

        ether 00:0c:29:ce:ef:5f  txqueuelen 1000  (Ethernet)

        RX packets 294648  bytes 426402027 (406.6 MiB)

        RX errors 0  dropped 0  overruns 0  frame 0

        TX packets 69336  bytes 5133939 (4.8 MiB)

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0



lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536

        inet 127.0.0.1  netmask 255.0.0.0

        inet6 ::1  prefixlen 128  scopeid 0x10<host>

        loop  txqueuelen 1000  (Local Loopback)

        RX packets 74  bytes 6220 (6.0 KiB)

        RX errors 0  dropped 0  overruns 0  frame 0

        TX packets 74  bytes 6220 (6.0 KiB)

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0



veth29219db: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

        inet6 fe80::e4d1:c5ff:fe31:23e6  prefixlen 64  scopeid 0x20<link>

        ether e6:d1:c5:31:23:e6  txqueuelen 0  (Ethernet)

        RX packets 4  bytes 280 (280.0 B)

        RX errors 0  dropped 0  overruns 0  frame 0

        TX packets 13  bytes 978 (978.0 B)

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0



veth356a015: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

        inet6 fe80::6498:14ff:fe28:886b  prefixlen 64  scopeid 0x20<link>

        ether 66:98:14:28:88:6b  txqueuelen 0  (Ethernet)

        RX packets 4  bytes 280 (280.0 B)

        RX errors 0  dropped 0  overruns 0  frame 0

        TX packets 12  bytes 936 (936.0 B)

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0



veth485953e: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

        inet6 fe80::207c:14ff:feae:2383  prefixlen 64  scopeid 0x20<link>

        ether 22:7c:14:ae:23:83  txqueuelen 0  (Ethernet)

        RX packets 11  bytes 854 (854.0 B)

        RX errors 0  dropped 0  overruns 0  frame 0

        TX packets 19  bytes 1510 (1.4 KiB)

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0



veth5353e56: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

        inet6 fe80::fc33:36ff:fe04:a479  prefixlen 64  scopeid 0x20<link>

        ether fe:33:36:04:a4:79  txqueuelen 0  (Ethernet)

        RX packets 11  bytes 854 (854.0 B)

        RX errors 0  dropped 0  overruns 0  frame 0

        TX packets 31  bytes 3172 (3.0 KiB)

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0



veth895fcaa: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

        inet6 fe80::cc69:cbff:fe02:5c46  prefixlen 64  scopeid 0x20<link>

        ether ce:69:cb:02:5c:46  txqueuelen 0  (Ethernet)

        RX packets 19  bytes 1302 (1.2 KiB)

        RX errors 0  dropped 0  overruns 0  frame 0

        TX packets 40  bytes 3820 (3.7 KiB)

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0



veth8ccf20f: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

        inet6 fe80::30e8:9ff:fec3:53fc  prefixlen 64  scopeid 0x20<link>

        ether 32:e8:09:c3:53:fc  txqueuelen 0  (Ethernet)

        RX packets 4  bytes 280 (280.0 B)

        RX errors 0  dropped 0  overruns 0  frame 0

        TX packets 12  bytes 936 (936.0 B)

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0



vethe977319: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

        inet6 fe80::809c:a5ff:fe2a:2bc2  prefixlen 64  scopeid 0x20<link>

        ether 82:9c:a5:2a:2b:c2  txqueuelen 0  (Ethernet)

        RX packets 22  bytes 1456 (1.4 KiB)

        RX errors 0  dropped 0  overruns 0  frame 0

        TX packets 42  bytes 4156 (4.0 KiB)

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0



virbr0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500

        inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255

        ether 52:54:00:0b:2f:5d  txqueuelen 1000  (Ethernet)

        RX packets 0  bytes 0 (0.0 B)

        RX errors 0  dropped 0  overruns 0  frame 0

        TX packets 0  bytes 0 (0.0 B)

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

 2.2container模式

        这个模式可以指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。

        使用--net=container:container_id/container_name,多个容器使用共同的网络看到的ip是一样的。

[root@docker ~]# docker run -itd --name=con1 busybox

29a3279e8e70169d5840d941c426b59c8408a5b4f50afc810cc214310b06c3c3

[root@docker ~]# docker exec -it con1 ifconfig

eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:07  

          inet addr:172.17.0.7  Bcast:172.17.255.255  Mask:255.255.0.0

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:8 errors:0 dropped:0 overruns:0 frame:0

          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:0

          RX bytes:656 (656.0 B)  TX bytes:0 (0.0 B)



lo        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)



[root@docker ~]# docker run -itd --net=container:con1 --name=con2 busybox

7985ce368c27e0d03984ca92a7e3bdafacc0972dc3391a6e85973a82fc7fe13f

[root@docker ~]# docker exec -it con2 ifconfig

eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:07  

          inet addr:172.17.0.7  Bcast:172.17.255.255  Mask:255.255.0.0

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:8 errors:0 dropped:0 overruns:0 frame:0

          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:0

          RX bytes:656 (656.0 B)  TX bytes:0 (0.0 B)



lo        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)

 2.3none模式

        在这种模式下,Docker容器拥有自己的Network Namespace,但是并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。

使用--net=none指定,这种模式下不会配置任何网络。

[root@docker ~]# docker run -itd --name=none --net=none busybox

7d2703641f604b9125fec65fede1994c18ff0d49febaa8f8e030be46a3e20e18

[root@docker ~]# docker exec -it none ifconfig

lo        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)

 2.4bridge模式

        bridge模式是Docker默认的网络设置,属于一种NAT网络模型,Docker daemon在启动的时候就会建立一个docker0网桥(通过-b参数可以指定),每个容器使用bridge模式启动时,Docker都会为容器创建一对虚拟网络接口(veth pair)设备,这对接口一端在容器的Network Namespace,另一端在docker0,这样就实现了容器与宿主机之间的通信。

        在bridge模式下,Docker容器与外部网络通信都是通过iptables规则控制的,这也是Docker网络性能低下的一个重要原因。使用iptables -vnL -t nat可以查看NAT表,在Chain Docker中可以看到容器桥接的规则。

[root@docker ~]# iptables -vnL -t nat

Chain DOCKER (2 references)

 pkts  bytes target   prot opt in             out     source               destination         

 0    0 RETURN     all  --  br-cbbd18004d01 *       0.0.0.0/0            0.0.0.0/0           

 0    0 RETURN     all  --  docker0         *       0.0.0.0/0            0.0.0.0/0           

2.5、Overlay模式

        这是Docker原生的跨主机多子网的网络模型,当创建一个新的网络时,Docker会在主机上创建一个Network Namespace,Network Namespace内有一个网桥,网桥上有一个vxlan接口,每个网络占用一个vxlan ID,当容器被添加到网络中时,Docker会分配一对veth网卡设备,与bridge模式类似,一端在容器里面,另一端在本地的Network Namespace中。

容器A、B、C都在主机A上面,而容器D、E则在主机B上面,现在通过Overlay网络模型可以实现容器A、B、D处于同一个子网,而容器C、E则处于另一个子网中。

        Overlay中有一个vxlan ID,值得范围为256~1000,vxlan隧道会把每一个ID相同的网络沙盒连接起来实现一个子网。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐