docker跨主机overlay网络配置

环境说明:

ubuntu14.04.4

4.2.0 kernel

docker 1.10.3

etcd 2.3.6

etcd配置:

etcd启动

etcd启动命令:

etcd --advertise-client-urls 'http://192.168.15.232:2379' --listen-client-urls 'http://0.0.0.0:2379'

需要确保 advertise-client-urls 是在正确的ip和端口上监听

etcd检查

  • 本机检查:

在etcd运行的机器上,检查启动情况:

etcdctl member list
ce2a822cea30bfca: name=default peerURLs=http://localhost:2380,http://localhost:7001 clientURLs=http://192.168.15.232:2379 isLeader=true

检查功能是否正确,能否正确设置和获取

etcdctl mk key value
etcdctl get key 
value
  • 远程检查

在其他主机上,验证远程连接的正确性,是否可以正确设置和获取

./etcdctl -endpoints http://192.168.15.232:2379 get key
value
/etcdctl -endpoints http://192.168.15.232:2379 mk key2 value2
value2
./etcdctl -endpoints http://192.168.15.232:2379 get key2 
value2

docker配置

在/etc/docker下新建或修改文件daemon.json,添加内容:

一台主机

{
    "cluster-store":"etcd://192.168.15.232:2379",
    "cluster-advertise":"192.168.15.232:2376"
}

另外一台主机

{
    "cluster-store":"etcd://192.168.15.232:2379",
    "cluster-advertise":"192.168.15.233:2376"
}

其中cluster-store指向etcd所在设备ip,cluster-advertise内填写本机ip地址

配置生效

如果是1.10.3版本的docker,需要重启docker服务

service docker restart

如果是1.11版本的docker,可以通过发送信号reload配置文件,ps查看到docker daemon的pid:

kill -s SIGHUP 8182

生效检查

执行命令

docker info

其中信息有:

Cluster store: etcd://192.168.15.232:2379
Cluster advertise: 192.168.15.233:2376

说明集群信息正确配置进入了docker deamon

另外:

Plugins: 
 Volume: local
 Network: overlay bridge null host

此处也说明了支持创建的网络类型.其中overlay就是用来建立跨主机网络的类型.

docker网络创建

执行命令:

docker network create -d overlay t1

docker network ls

NETWORK ID          NAME                DRIVER
f5ec4b3e24d8        t1                  overlay             
9a1aa00e5873        docker_gwbridge     bridge              
b71af588fbe1        none                null                
61fab2c54528        host                host                
507e83023697        bridge              bridge    

可以看到网络已建立. 可以在创建是使用 '--subnet=192.168.1.0/24' 这种类型来规定创建子网的网段.

确认创建

在其他主机上执行 'docker network ls',应该均能看到已创建的t1网络的信息.

容器加入

创建时加入

在执行 'docker run' 时使用参数 '--net t1', 使得创建的容器能加入t1网络:

docker run -id --net t1 --name t233_t1 busybox sh

创建后加入

已经在运行的容器也可以加入网络,通过执行命令:

docker run -id --name t233_t1 busybox sh
docker network connect t1 t233_out

网络互通

在不同主机上创建或加入容器到网络内,并在容器内互相 ping .在这种情况下,可以通过直接 ping 容器名的方式确认网络连接已通.

docker exec t233_t1 ping t232_t1

其他

  • 在使用overlay网络的情况下,容器默认带有的bridge网络还是存在,可以在容器内看到两个网口.这种时候容器访问外网通过的是bridge网络.
docker exec 233_t1 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 
    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
79: eth0@if80: <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 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:aff:fe00:2/64 scope link 
       valid_lft forever preferred_lft forever
81: eth1@if82: <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 scope global eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::42:acff:fe12:2/64 scope link 
       valid_lft forever preferred_lft forever

docker exec 233_t1 ping www.baidu.com
PING www.baidu.com (112.80.248.73): 56 data bytes
64 bytes from 112.80.248.73: seq=0 ttl=54 time=39.120 ms
64 bytes from 112.80.248.73: seq=1 ttl=54 time=40.778 ms
64 bytes from 112.80.248.73: seq=2 ttl=54 time=39.840 ms
  • 容器可以加入多个overlay网络.但是在docker run的时候,只能通过 --net 指定一个网络,要加入其他网络需要在启动后通过 docker network connect 来添加