部署Flannel,实现跨主机Docker容器通信

flannel(flannel is a virtual network that attaches IP addresses to containers)

两个主机下的Docker容器之间是不互通的,通过部署flannel,对docker容器的ip进行规划,就能实现跨主机容器之间的通信。

官方文档:https://coreos.com/flannel/docs/latest/flannel-config.html

以下介绍Flannel的部署

机器配置如下

hostname ip 系统版本
etcd1 172.17.0.2 CentOS Linux release 7.4.1708 (Core)
etcd2 172.17.0.3 CentOS Linux release 7.4.1708 (Core)

一、搭建etcd集群

参见之前的文章:http://www.cnblogs.com/cs-zh/p/7878019.html

二、添加网络配置到etcd

etcdctl --endpoint="172.17.0.2:2379" set /coreos.com/network/config ‘{ "Network": "172.17.0.0/16", "Backend": {"Type": "vxlan"}}‘

这里配置flannel网络ip段为172.17.0.0

flannel默认加载etcd配置前缀为“/coreos.com/network”,可修改为其他的key

三、下载二进制包

wget https://github.com/coreos/flannel/releases/download/v0.9.1/flannel-v0.9.1-linux-amd64.tar.gz
tar -xf flannel-v0.9.1-linux-amd64.tar.gz

四、启动flannel

nohup ./flanneld >> flannel.log 2>&1 &

注意:1.如果“第二步”中修改etcdctl set的key值,这里需要加参数-etcd-prefix=".."

2.如果etcd不在部署flannel的节点,需要加参数-etcd-endpoints

具体./flanneld -h看参数说明

运行成功后,会生成文件/run/flannel/subnet.env,之后需要重启dockerd,要带上这几个信息

FLANNEL_NETWORK=172.17.0.0/16
FLANNEL_SUBNET=172.17.80.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=false

五、重启dockerd

1.修改docker.service

vim /usr/lib/systemd/system/docker.service

增加EnvironmentFile,并在ExecStart后面加上"$DOCKER_OPTS"

EnvironmentFile=/etc/default/docker
ExecStart=/usr/bin/dockerd $DOCKER_OPTS

2.重新加载配置

systemctl daemon-reload

3.重启dockerd

systemctl restart docker

4.确认参数正确执行

ps -ef|grep docker

查看进行信息,--bip参数已经被正确带上

root      4713     1  0 07:48 ?        00:00:00 /usr/bin/dockerd --bip=172.17.80.1/24 --ip-masq=true --mtu=1450
root      4721  4713  0 07:48 ?        00:00:00 docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/containerd --shim docker-containerd-shim --runtime docker-runc

六、确认配置是否正确

1.查看网卡信息

ifconfig

此时多出个“flannel.1”,并且docker0网卡在该子网下

docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.17.80.1  netmask 255.255.255.0  broadcast 0.0.0.0
        ether 02:42:2d:68:34:d8  txqueuelen 0  (Ethernet)
        RX packets 568  bytes 45301 (44.2 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 565  bytes 66158 (64.6 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.2  netmask 255.255.0.0  broadcast 0.0.0.0
        ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet)
        RX packets 983380  bytes 612479051 (584.1 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 964071  bytes 89535273 (85.3 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

flannel.1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1450
        inet 172.17.80.0  netmask 255.255.255.255  broadcast 0.0.0.0
        ether 2e:3c:6e:38:36:ce  txqueuelen 0  (Ethernet)
        RX packets 19  bytes 1464 (1.4 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 21  bytes 1593 (1.5 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

2.查看路由配置

route -n

确认有flannel.1的路由表

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.17.0.1      0.0.0.0         UG    0      0        0 eth0
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 eth0
172.17.80.0     0.0.0.0         255.255.255.0   U     0      0        0 docker0
172.17.87.0     172.17.87.0     255.255.255.0   UG    0      0        0 flannel.1

假如这里没有flannel.1的路由表,则跨主机容器之间还是ping不同,因为数据包没有被正确的转发。看看是不是flannel的版本过低,这个问题在0.8.0出现,换成最新0.9.1就没问题。

七.在其他节点继续按照“三”到“六”的步骤做一遍

八.验证是否能ping通

1.在节点1运行

docker run -it --rm=true busybox sh

进入容器后执行

ifconfig

此容器的ip是172.17.80.2

eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:50:02
          inet addr:172.17.80.2  Bcast:0.0.0.0  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1450  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:0
          RX bytes:0 (0.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.同样在节点2启动容器并查看ip:“172.17.87.2”

在此容器上执行

ping 172.17.80.2
PING 172.17.80.2 (172.17.80.2): 56 data bytes
64 bytes from 172.17.80.2: seq=0 ttl=62 time=0.415 ms
64 bytes from 172.17.80.2: seq=1 ttl=62 time=0.214 ms
时间: 2024-10-07 23:28:26

部署Flannel,实现跨主机Docker容器通信的相关文章

使用weave实现跨主机docker容器互联

关于weave的原理不做细致的说明,如果想了解weave可以登陆官网:https://www.weave.works/ In this post,使用阿里云3台ECS服务器进行weave搭建,并测试搭建weave后,跨主机docker容器的连通性. 场景:10.162.204.252 node110.171.31.181 node210.171.19.139 node3 一.在所有需要跨主机互通的docker宿主机安装weave.1.在node1上安装weave,并启动weave.wget -O

Docker:使用Ambassador进行跨主机间容器通信

由于Docker自身的网络的原因,想要在多主机间的容器之间进行通信是比较麻烦的事情.可以利用Ambassador容器来实现这一功能. 基本原理: 利用Ambassador来实现主机间容器进行通信时,需要在两台需要通信的容器的主机上都启动Ambassador容器.由Ambassador容器提供数据转发服务. 当客户端主机上的容器client_container想要同服务器端主机上的容器server_container通信时,client_container容器直接访问同一台主机上运行的client

如何实现docker跨主机之间容器通信问题(方法二)

主机名 宿主机IP 容器分配网段 启动容器的IP testa 192.168.1.105 172.172.0.0/24 172.172.0.10 testb 192.168.1.106 172.172.1.0/24 172.172.1.10 1.在testa主机上创建docker桥接网络 docker network create --subnet=172.172.0.0/24 docker-br0 2.在testb主机上创建docker桥接网络 docker network create --

使用openvswitch实现跨主机docker容器互联

安装openvswitch的步骤请参考上一篇文章:http://www.cnblogs.com/xkops/p/5568167.html 环境:192.168.3.201 node1192.168.3.202 node2 1.在node1上创建网桥obr0,然后增加端口gre0到obr0.ovs-vsctl add-br obr0ovs-vsctl add-port obr0 gre0ovs-vsctl set interface gre0 type=gre options:remote_ip=

Docker容器跨主机多网段通信解决方案

实现Docker的跨主机网络通信的方案有很多,比如在之前博文中写到的通过部署consul服务实现Docker容器跨主机通信 ,但是consul服务并不能实现多个网段跨主机进行通信,在这种情况之下,MacVlan的概念就应用而生了. Macvlan工作原理: Macvlan是Linux内核支持的网络接口.要求的Linux内部版本是v3.9–3.19和4.0+: 通过为物理网卡创建Macvlan子接口,允许一块物理网卡拥有多个独立的MAC地址和IP地址.虚拟出来的子接口将直接暴露在相邻物理网络中.从

10: docker 跨主机的容器间通信(macvlan / overlay )

docker 跨主机的容器间通信(macvlan) 作用: 虚拟多个mac地址,虚拟出多个网卡给容器用. #创建macvlan网络 docker network create --driver macvlan(要创建的网络类型) --subnet  子网IP段  --gateway 本机网关 -o parent=本机网卡  创建的macvlan网络名称 [[email protected] ~]# docker network create --driver macvlan --subnet 1

如何实现跨主机之间docker容器通信问题

这里采用最原始的桥接模式来实现跨主机直接docker容器通信问题 一些常用命令 brctl show br0 brctl addbr br0 brctl addif br0 eth0 ifconfig br0 down 1.先安装brctl工具包 apt-get install bridge-utils 2.创建一个docker的桥接网络类型(ip填写和同主机网段的ip) docker network create --subnet=192.168.17.100/16 br0 这里我的宿主机ip

多主机Docker容器的VLAN划分

原文发表于cu:2016-06-06 参考文档: Docker网络的4种模式,pipework/ovs的简单使用等:http://www.infoq.com/cn/articles/docker-network-and-pipework-open-source-explanation-practice Dockerpool全文档:https://yeasy.gitbooks.io/docker_practice/content/index.html Ovs完全使用手册:http://my.osc

docker部署Macvlan实现跨主机网络通信

基本概念: Macvlan工作原理: Macvlan是Linux内核支持的网络接口.要求的Linux内部版本是v3.9–3.19和4.0+: 通过为物理网卡创建Macvlan子接口,允许一块物理网卡拥有多个独立的MAC地址和IP地址.虚拟出来的子接口将直接暴露在相邻物理网络中.从外部看来,就像是把网线隔开多股,分别接受了不同的主机上一样: 物理网卡收到包后,会根据收到包的目的MAC地址判断这个包需要交给其中虚拟网卡. 当容器需要直连入物理网络时,可以使用Macvlan.Macvlan本身不创建网