Docker overlay网络

overlay网络

docker pull progrium/consul
docker run -d --name consul-db --restart always -p 8400:8400 -p 8500:8500 -p 8600:53 -h consul progrium/consul -server -bootstrap -ui-dir /ui  # --restart always 参数可以让docker server守护进程在意外重启之后,立马启动该容器,不加这个参数,docker server启动之后,该容器是exited状态。

8500端口是consul的web页面端口,浏览器访问:http://192.168.1.102:8500,进入consul界面。# 下图1

将两台主机添加到consul集群:
    cd /usr/lib/systemd/system
    vim docker.service
		ExecStart行添加参数:--cluster-store=consul://192.168.1.102:8500 --cluster-advertise=ens33:2376
         --cluster-store=consul://192.168.1.102:8500 # consul服务地址
         --cluster-advertise:宣告consul所在机器的IP地址

重启两台机器的docker服务:
先启动consul服务的这台机器,然后另一台机器加入consul(因为consul是容器服务,先启动另一台,consul重启之后,另一台机器可能需要再次重启加入consul);
systemctl daemon-reload
systemctl restart docker        

浏览器刷新consul UI页面:两台机器已经加入consul # 下图2

图1:

图2:

docker network ls # 下图1

创建overlay网络,物理网卡必须要支持vxlan;想让物理网卡支持vxlan的通道,需要打开网卡的混杂模式。
ip a # 默认是mtu,不支持混杂模式

# 将两台虚拟机都开启混杂模式
ifconfig eth0 promisc # 开启混杂模式  在局域网内发送的数据包发现目标主机不是自己,会将这个包丢掉,但是开启混杂模式,不管局域网内发的数据包是不是自己主机的,都会接收。通常在抓包的时候可以开启

# 创建overlay网络,默认overlay 网络生效的范围是在docker swarm集群内;如果想在集群外单独用,需要加 --attachable 
docker network create --driver overlay --attachable ov-net1 # 会触发更新到添加到consul集群的所有主机都有此网络 # 下图2
docker network ls # 下图2

图1:

图2:

# 查看overlay网络的特点
docker network inspect ov-net1
'''
[
    {
        "Name": "ov-net1",
        "Id": "5d78e519ef573f47b92053af0b3c3ef0749f0b2c2853234477921e64d30ec0fb",
        "Created": "2021-11-09T03:36:55.826452188+08:00",
        "Scope": "global",
        "Driver": "overlay",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "10.0.0.0/24",
                    "Gateway": "10.0.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": true,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]
'''

以上10.0.0.0/24 这个网络从哪里来的?
使用overlay创建的ov-net1网络,运行一个容器观察现象:
docker run -itd --name bbox1 --network ov-net1 busybox
docker exec -it bbox1 sh # 下图1
brctl show

ip r # 下图2

图1:

图2:

docker run -d -p 81:80 --network ov-net1 --name web1 httpd 
curl 192.168.1.102:81
    '''
    <html><body><h1>It works!</h1></body></html>
    '''
docker network ls # 图1

brctl show  # 多出来一张桥卡vethe2b615a ,下图2

docker run -itd --name bbox2 --network ov-net1 busybox # 图3
docker exec -it bbox2 sh 

图1:

图2:

图3:

10.0.0.0网段不在宿主机,但是又能通信,那内部网络是如何连接的呢?猜想它应该和网络空间有关系;查看宿主机(192.168.1.102)的网络空间
ip netns # 看不到

cd /var/run/docker/
ls 
    '''
    libcontainerd  libnetwork  netns  plugins  swarm
    '''
ln -s /var/run/docker/netns/ /var/run/netns

ip netns # 192.168.1.102主机上
'''
6540d8c26336 (id: 4)
7b0b8a33fe43 (id: 3)
a15a2044681d (id: 2)
1-5d78e519ef (id: 1)
415c76148d80 (id: 0)
'''
在192.168.1.4主机上也有 1-5d78e519ef (id: 1)网络空间

# 查看 1-5d78e519ef (id: 1)网络空间 ,发现85通过veth2网桥连84,这个连接是我们运行bbox1容器内部的84连85,下图2
ip netns exec 1-5d78e519ef ip a # 下图1
# bbox1的虚拟网卡的IP是10.0.0.2/24,走的是10.0.0.0/24网络,
docker exec -it bbox1 ip a # 下图2
ip a # 宿主机中的网桥卡在出现在84和85是断层的,原来84和85藏在了1-5d78e519ef (id: 1)网络空间 # 下图1、3

# 在1-5d78e519ef网络空间内执行brctl show,发现了veth2连到了br0上 下图4
ip netns exec 1-5d78e519ef brctl show 

# 查看bbox2 vxlan的id ,和bbox1相同;bbox1和bbox2在同一个广播域,又在同一个网段,所以可以通讯。
ip netns exec a15a2044681d ip -d l show vxlan1  # overlay同一网络中容器(主机)通信,下图5

图1:

图2:

图3:

图4:

图5:

overlay网络间如何隔离的呢?

# 再创建一个overlay网络
docker network create --driver overlay --attachable ov-net2 
    '''
    [
        {
            "Name": "ov-net2",
            "Id": "4eb0bfa0c2b90bc8d97aa070e62410cd6cfe0b1b3d60194b71cf5840caa084d3",
            "Created": "2021-11-09T16:43:05.737041254+08:00",
            "Scope": "global",
            "Driver": "overlay",
            "EnableIPv6": false,
            "IPAM": {
                "Driver": "default",
                "Options": {},
                "Config": [
                    {
                        "Subnet": "10.0.1.0/24", # 一个新的网段,bbox1和bbox2容器再10.0.0.0/24网段
                        "Gateway": "10.0.1.1"
                    }
                ]
            },
            "Internal": false,
            "Attachable": true,
            "Containers": {},
            "Options": {},
            "Labels": {}
        }
    ]
    '''
docker network ls
docker network inspect ov-net2

使用新创建的ov-net2网络,运行一个bbox3容器,验证不同网络中容器能否通信。

docker run -itd --name bbox3 --network ov-net2 busybox

docker exec -it bbox3 sh
# 在bbox3容器内pingbbox1和bbox2的操作 如下图1
ip a
'''
使用10.0.1.0/24网段的网卡,ping bbox1(10.0.0.2/24)和bbox2(10.0.0.4/24)无法ping通,可以ping通外网。那如何让这两个网段的容器进行通信呢?而且 三个容器的另一张网卡都在172.19.0.0/16网段,然而在bbox3使用172.19.0.5/16这个网卡,直接ping bbox1和bbox2也是ping不通的,那是什么原因呢?是防火墙规则的限制。可以使用docker命令将bbox3连接到ov-net1网络,这样bbox3就可以通过10.0.1.0/16网段与bbox1和bbox2通信了。 
'''


docker network connect ov-net1 bbox3
docker exec -it bbox3 sh # 下图3
ping 10.0.0.2
ping 10.0.0.4

图1:

图2:

图3:

自定义网关和子网,创建overlay网络

docker network create --driver overlay --subnet=10.22.1.0/24 --gateway 10.22.1.1 ov-net3
docker network ls
docker network inspect ov-net3
    '''
    [
        {
            "Name": "v-net3",
            "Id": "273dcb44b1aede14d3953c4bdbb453e8ca530eae543c3307556537df1f8f510a",
            "Created": "2021-11-09T17:50:52.938785407+08:00",
            "Scope": "global",
            "Driver": "overlay",
            "EnableIPv6": false,
            "IPAM": {
                "Driver": "default",
                "Options": {},
                "Config": [
                    {
                        "Subnet": "10.22.1.0/24",
                        "Gateway": "10.22.1.1"
                    }
                ]
            },
            "Internal": false,
            "Attachable": false,
            "Containers": {},
            "Options": {},
            "Labels": {}
        }
    ]
    '''
posted on 2021-11-09 18:04  jueyuanfengsheng  阅读(582)  评论(0编辑  收藏  举报