zoukankan      html  css  js  c++  java
  • 17、docker多机网络通信overlay

      理论上来说多台宿主机之间的docker容器之间是无法通讯的,但是多台宿主机之间的docker容器之间是可以通讯的,主要是通过VXLAN技术来实现的。

      GitHub上对于docker-overlay-network的介绍。

    XVLAN实现远离

    17.1 overlay网络和etcd实现多机容器通信

      docker在创建容器的时候默认会使用bridge网络,要实现多机容器间通信,需要使用overlay网络,但是要实现多机的容器通信,通信的两个容器的IP肯定不能一样,所以我们需要借助第三方的工具来实现。这里使用ectd

    安装etcd

      在第一台服务器上安装

    [root@docker ~]# wget https://github.com/coreos/etcd/releases/download/v3.0.12/etcd-v3.0.12-linux-amd64.tar.gz
    [root@docker ~]# tar xf etcd-v3.0.12-linux-amd64.tar.gz
    [root@docker ~]# cd etcd-v3.0.12-linux-amd64/
    [root@docker ~]# nohup ./etcd --name docker-node1 --initial-advertise-peer-urls http://192.168.205.10:2380 
    --listen-peer-urls http://192.168.205.10:2380 
    --listen-client-urls http://192.168.205.10:2379,http://127.0.0.1:2379 
    --advertise-client-urls http://192.168.205.10:2379 
    --initial-cluster-token etcd-cluster 
    --initial-cluster docker-node1=http://192.168.205.10:2380,docker-node2=http://192.168.205.11:2380 
    --initial-cluster-state new&
    [root@docker ~]# 
    

      在第二台服务器上安装

    [root@docker ~]# wget https://github.com/coreos/etcd/releases/download/v3.0.12/etcd-v3.0.12-linux-amd64.tar.gz
    [root@docker ~]# tar xf etcd-v3.0.12-linux-amd64.tar.gz
    [root@docker ~]# cd etcd-v3.0.12-linux-amd64/
    [root@docker ~]# nohup ./etcd --name docker-node2 --initial-advertise-peer-urls http://192.168.205.11:2380 
    > --listen-peer-urls http://192.168.205.11:2380 
    > --listen-client-urls http://192.168.205.11:2379,http://127.0.0.1:2379 
    > --advertise-client-urls http://192.168.205.11:2379 
    > --initial-cluster-token etcd-cluster 
    > --initial-cluster docker-node1=http://192.168.205.10:2380,docker-node2=http://192.168.205.11:2380 
    > --initial-cluster-state new&
    [root@docker ~]# 
    

      检查cluster状态

    [root@docker etcd-v3.0.12-linux-amd64]# ./etcdctl cluster-health
    member 21eca106efe4caee is healthy: got healthy result from http://192.168.205.10:2379
    member 8614974c83d1cc6d is healthy: got healthy result from http://192.168.205.11:2379
    cluster is healthy
    

    重启docker服务

      在第一台服务器上重启

    systemctl stop docker.service
    /usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --cluster-store=etcd://192.168.205.11:2379 --cluster-advertise=192.168.205.11:2375&
    

      在第二台服务器上重启

    systemctl stop docker.service
    /usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --cluster-store=etcd://192.168.205.10:2379 --cluster-advertise=192.168.205.10:2375&
    

    创建overlay network

      在其中任意一台服务器上创建一个overlay网络

    [root@docker ~]# docker network create -d overlay demo
    
    [root@docker ~]# docker network ls
    NETWORK ID          NAME                DRIVER              SCOPE
    038cb815ca11        bridge              bridge              local
    efeabebb2ed5        demo                overlay             global
    674c97014876        host                host                local
    ac706f4efd8e        none                null                local
    [root@docker ~]# docker network inspect demo
    [
        {
            "Name": "demo",
            "Id": "efeabebb2ed5b63e705cb2eb3b9f77109119a71fdb89d05b105db30ae25c06f6",
            "Created": "2018-06-06T09:50:59.567617763Z",
            "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": false,
            "Ingress": false,
            "ConfigFrom": {
                "Network": ""
            },
            "ConfigOnly": false,
            "Containers": {},
            "Options": {},
            "Labels": {}
        }
    ]
    [root@docker ~]# 
    

      另一台服务器上的overlay网络也会被同步创建。这都是由etcd实现的:

    [root@docker etcd-v3.0.12-linux-amd64]# ./etcdctl ls
    /docker
    [root@docker etcd-v3.0.12-linux-amd64]# ./etcdctl ls /docker
    /docker/nodes
    /docker/network
    [root@docker etcd-v3.0.12-linux-amd64]# ./etcdctl ls /docker/nodes
    /docker/nodes/192.168.205.10:2375
    /docker/nodes/192.168.205.11:2375
    [root@docker etcd-v3.0.12-linux-amd64]# ./etcdctl ls /docker/network
    /docker/network/v1.0
    [root@docker etcd-v3.0.12-linux-amd64]# ./etcdctl ls /docker/network/v1.0
    /docker/network/v1.0/endpoint_count
    /docker/network/v1.0/endpoint
    /docker/network/v1.0/ipam
    /docker/network/v1.0/idm
    /docker/network/v1.0/overlay
    /docker/network/v1.0/network
    [root@docker etcd-v3.0.12-linux-amd64]# ./etcdctl ls /docker/network/v1.0/overlay
    /docker/network/v1.0/overlay/network
    [root@docker etcd-v3.0.12-linux-amd64]# ./etcdctl ls /docker/network/v1.0/overlay/network
    /docker/network/v1.0/overlay/network/efeabebb2ed5b63e705cb2eb3b9f77109119a71fdb89d05b105db30ae25c06f6
    [root@docker etcd-v3.0.12-linux-amd64]#
    

    分别在两胎服务器上创建容器

      在第一台服务器上创建

    [root@docker ~]# docker run -d --name test1 --net demo busybox sh -c "while true; do sleep 3600; done"
    [root@docker ~]# docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
    170e8edf81f2        busybox             "sh -c 'while true; …"   3 minutes ago       Up 3 minutes                            test1
    [root@docker ~]# docker exec -it test1 ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> 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 forever
    13: eth0@if14: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1450 qdisc noqueue
        link/ether 02:42:0a:00:00:02 brd ff:ff:ff:ff:ff:ff
        inet 10.0.0.2/24 brd 10.0.0.255 scope global eth0
           valid_lft forever preferred_lft forever
    15: eth1@if16: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
        link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff
        inet 172.18.0.2/16 brd 172.18.255.255 scope global eth1
           valid_lft forever preferred_lft forever
    [root@docker ~]# 
    

      在第二台服务器上创建

    [root@docker ~]# docker run -d --name test2 --net demo busybox sh -c "while true; do sleep 3600; done"
    [root@docker ~]# docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
    8b50c21f1337        busybox             "sh -c 'while true; …"   2 minutes ago       Up 2 minutes                            test2
    [root@docker ~]# docker exec -it test2 ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> 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 forever
    7: eth0@if8: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1450 qdisc noqueue
        link/ether 02:42:0a:00:00:03 brd ff:ff:ff:ff:ff:ff
        inet 10.0.0.3/24 brd 10.0.0.255 scope global eth0
           valid_lft forever preferred_lft forever
    10: eth1@if11: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
        link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff
        inet 172.18.0.2/16 brd 172.18.255.255 scope global eth1
           valid_lft forever preferred_lft forever
    [root@docker ~]# 
    

      查看demo网络信息:

    [root@docker ~]# docker network inspect demo
    [
        {
            "Name": "demo",
            "Id": "efeabebb2ed5b63e705cb2eb3b9f77109119a71fdb89d05b105db30ae25c06f6",
            "Created": "2018-06-06T09:50:59.567617763Z",
            "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": false,
            "Ingress": false,
            "ConfigFrom": {
                "Network": ""
            },
            "ConfigOnly": false,
            "Containers": {
                "170e8edf81f2bc216b926c52928c0e6977809387cc21db433c56d7b7d397f49b": {
                    "Name": "test1",
                    "EndpointID": "247454410f441b545c97c3d53cae508cbdbb9c2d91745381adf70580a77f8ec7",
                    "MacAddress": "",
                    "IPv4Address": "10.0.0.2/24",
                    "IPv6Address": ""
                },
                "ep-5e95b84eff1dbb3fbdc6abb4daa0707e117dac66220222a2e22a75bf6b7eb09d": {
                    "Name": "test2",
                    "EndpointID": "5e95b84eff1dbb3fbdc6abb4daa0707e117dac66220222a2e22a75bf6b7eb09d",
                    "MacAddress": "",
                    "IPv4Address": "10.0.0.3/24",
                    "IPv6Address": ""
                }
            },
            "Options": {},
            "Labels": {}
        }
    ]
    [root@docker ~]# 
    

    测试两个容器间能否通信

    [root@docker ~]# docker exec -it test1 ping 10.0.0.3
    
    PING 10.0.0.3 (10.0.0.3): 56 data bytes
    64 bytes from 10.0.0.3: seq=0 ttl=64 time=3.251 ms
    64 bytes from 10.0.0.3: seq=1 ttl=64 time=0.693 ms
    64 bytes from 10.0.0.3: seq=2 ttl=64 time=0.591 ms
    64 bytes from 10.0.0.3: seq=3 ttl=64 time=0.579 ms
    64 bytes from 10.0.0.3: seq=4 ttl=64 time=0.776 ms
    ^C
    --- 10.0.0.3 ping statistics ---
    5 packets transmitted, 5 packets received, 0% packet loss
    round-trip min/avg/max = 0.579/1.178/3.251 ms
    [root@docker ~]# 
    
    [root@docker ~]# docker exec -it test1 ping test2
    ^C[vagrant@docker-node1 ~]$ docker exec -it test1 ping test2
    PING test2 (10.0.0.3): 56 data bytes
    64 bytes from 10.0.0.3: seq=0 ttl=64 time=1.024 ms
    64 bytes from 10.0.0.3: seq=1 ttl=64 time=0.565 ms
    64 bytes from 10.0.0.3: seq=2 ttl=64 time=0.806 ms
    64 bytes from 10.0.0.3: seq=3 ttl=64 time=0.597 ms
    64 bytes from 10.0.0.3: seq=4 ttl=64 time=0.498 ms
    ^C
    --- test2 ping statistics ---
    5 packets transmitted, 5 packets received, 0% packet loss
    round-trip min/avg/max = 0.498/0.698/1.024 ms
    [root@docker ~]# 
    
    [root@docker ~]# docker exec -it test2 ping 10.0.0.2
    
    PING 10.0.0.2 (10.0.0.2): 56 data bytes
    64 bytes from 10.0.0.2: seq=0 ttl=64 time=3.374 ms
    64 bytes from 10.0.0.2: seq=1 ttl=64 time=0.531 ms
    64 bytes from 10.0.0.2: seq=2 ttl=64 time=0.499 ms
    ^C
    --- 10.0.0.2 ping statistics ---
    3 packets transmitted, 3 packets received, 0% packet loss
    round-trip min/avg/max = 0.499/1.468/3.374 ms
    [root@docker ~]# 
    
    [root@docker ~]# docker exec -it test2 ping test1
    PING test1 (10.0.0.2): 56 data bytes
    64 bytes from 10.0.0.2: seq=0 ttl=64 time=0.685 ms
    64 bytes from 10.0.0.2: seq=1 ttl=64 time=0.754 ms
    64 bytes from 10.0.0.2: seq=2 ttl=64 time=0.642 ms
    64 bytes from 10.0.0.2: seq=3 ttl=64 time=1.080 ms
    ^C
    --- test1 ping statistics ---
    4 packets transmitted, 4 packets received, 0% packet loss
    round-trip min/avg/max = 0.642/0.790/1.080 ms
    [root@docker ~]# 
    
  • 相关阅读:
    Python3.4 + Django1.7.7 搭建简单的表单并提交
    python3.4 + Django1.7.7 表单的一些问题
    TypeScript(10): String(同JS)
    TypeScript(09): Number(同JS)
    TypeScript(08): 循环
    TypeScript(07): 条件语句(同JS)
    TypeScript(06): 运算符(同JS)
    TypeScript(05): 变量声明
    TypeScript(04): 基础类型
    TypeScript(03):基础语法
  • 原文地址:https://www.cnblogs.com/jie-fang/p/10279770.html
Copyright © 2011-2022 走看看