赞
踩
即便用bridge网络模式或是host网络模式,容器所在主机都启用了docker0网卡,但是如上图所示,容器之间互ping也只能ping通自己或同宿主机内的其他容器。并不能跨宿主机
通过在Docker宿主机上添加静态路由实现跨宿主机通信
通过在主机中添加静态路由来实现跨主机通信。如果有两台主机host1和host2,两主机上的docker容器是两个独立的二层网络,将con1发往con2的数据流先转发到主机host2上,再由host2转发到其上的docker容器中,反之亦然。
由于使用容器的IP进行路由,就需要避免不同主机上的docker容器使用相同冲突的IP,所有应该为不同的主机分配不同的IP子网。
Flannel 使用etcd存储配置数据和子网分配信息。flannel 启动之后,后台进程首先检索配置和正在使用的子网列表,然后选择一个可用的子网,然后尝试去注册它。etcd也存储这个每个主机对应的ip。flannel 使用etcd的watch机制监视/coreos.com/network/subnets下面所有元素的变化信息,并且根据它来维护一个路由表。为了提高性能,flannel优化了Universal TAP/TUN设备,对TUN和UDP之间的ip分片做了代理。
## 1.随机挑选一名幸运观众,安装etcd yum install -y etcd ## 2.修改配置文件 [root@db01 ~]$ vim /etc/etcd/etcd.conf #[Member] ETCD_DATA_DIR="/var/lib/etcd/default.etcd" ETCD_LISTEN_CLIENT_URLS="http://10.0.0.51:2379,http://127.0.0.1:2379" ETCD_NAME="default" #[Clustering] ETCD_ADVERTISE_CLIENT_URLS="http://10.0.0.51:2379" ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster" ETCD_INITIAL_CLUSTER_STATE="new" ## 3.启动etcd [root@db01 ~]$ systemctl start etcd ## 4.测试 [root@db01 ~]$ etcdctl -C http://10.0.0.51:2379 cluster-health member 8e9e05c52164694d is healthy: got healthy result from http://10.0.0.51:2379 cluster is healthy [root@db01 ~]$ etcdctl -C http://10.0.0.51:2379 set /testdir/testkey "hello world" hello world [root@db01 ~]$ etcdctl -C http://10.0.0.51:2379 get /testdir/testkey hello world
所有要串连起来的docker机器都应该安装
## 安装flannel [root@db01 ~]$ yum install -y flannel [root@db02 ~]$ yum install -y flannel ## 修改flannel配置 [root@db02 ~]$ vim /etc/sysconfig/flanneld FLANNEL_ETCD_ENDPOINTS="http://10.0.0.51:2379" FLANNEL_ETCD_PREFIX="/atomic.io/network" [root@db01 ~]$ vim /etc/sysconfig/flanneld FLANNEL_ETCD_ENDPOINTS="http://10.0.0.51:2379" FLANNEL_ETCD_PREFIX="/atomic.io/network" ## 创建etcd配置 [root@db01 ~]$ etcdctl mk /atomic.io/network/config '{"Network":"172.17.0.0/16"}' {"Network":"172.17.0.0/16"} ## 启动flannel [root@db01 ~]$ systemctl start flanneld.service [root@db02 ~]$ systemctl start flanneld.service ## 重启docker ## iptables开启forward功能 [root@db01 ~]$ iptables -P FORWARD ACCEPT [root@db01 ~]$ iptables -F
[root@db01 ~]$ vim /usr/lib/systemd/system/docker.service
EnviromentFile=/run/flannel/docker
ExecStart=/usr/bin/dockerd -H fd:// $DOCKER_NETWORK_OPTIONS
## 开启forward转发
[root@db01 ~]$ echo 1 > /proc/sys/net/ipv4/ip_forward
http://www.cnblogs.com/CloudMan6/p/7270551.html
docker03上: consul存储ip地址的分配
docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap
设置容器的主机名
consul:kv类型的存储数据库(key:value)
docker01、02上:
vim /etc/docker/daemon.json
{
"cluster-store": "consul://10.0.0.13:8500",
"cluster-advertise": "10.0.0.11:2376"
}
vim /usr/lib/systemd/system/docker.service
systemctl daemon-reload
systemctl restart docker
2)创建overlay网络 docker network create -d overlay --subnet 172.16.2.0/24 --gateway 172.16.2.254 ol1
3)启动容器测试
docker run -it --network ol1 --name oldboy01 busybox /bin/sh 每个容器有两块网卡,eth0实现容器间的通讯,eth1实现容器访问外网
默认一个物理网卡,只有一个物理mac地址,虚拟多个mac地址
## 创建macvlan网络
docker network create --driver macvlan --subnet 10.0.0.0/24 --gateway 10.0.0.254 -o
parent=eth0 macvlan_1
## 设置eth0的网卡为混杂模式
ip link set eth0 promisc on
## 创建使用macvlan网络的容器
docker run -it --network macvlan_1 --ip=10.0.0.200 busybox
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。