当前位置:   article > 正文

Docker跨主机通讯_docker跨主机容器通信

docker跨主机容器通信

docker跨主机通讯方式


  • 静态路由
  • flannel (k8s)
  • overlay
  • macvlan
  • calico

在这里插入图片描述

即便用bridge网络模式或是host网络模式,容器所在主机都启用了docker0网卡,但是如上图所示,容器之间互ping也只能ping通自己或同宿主机内的其他容器。并不能跨宿主机

静态路由


通过在Docker宿主机上添加静态路由实现跨宿主机通信

通过在主机中添加静态路由来实现跨主机通信。如果有两台主机host1和host2,两主机上的docker容器是两个独立的二层网络,将con1发往con2的数据流先转发到主机host2上,再由host2转发到其上的docker容器中,反之亦然。

由于使用容器的IP进行路由,就需要避免不同主机上的docker容器使用相同冲突的IP,所有应该为不同的主机分配不同的IP子网
在这里插入图片描述

flannel


flannel概述

Flannel 使用etcd存储配置数据和子网分配信息。flannel 启动之后,后台进程首先检索配置和正在使用的子网列表,然后选择一个可用的子网,然后尝试去注册它。etcd也存储这个每个主机对应的ip。flannel 使用etcd的watch机制监视/coreos.com/network/subnets下面所有元素的变化信息,并且根据它来维护一个路由表。为了提高性能,flannel优化了Universal TAP/TUN设备,对TUN和UDP之间的ip分片做了代理。

在这里插入图片描述

  • 数据从源容器中发出后,经由所在主机的docker0虚拟网卡转发到flannel0虚拟网卡,这是个P2P的虚拟网卡,flanneld服务监听在网卡的另外一端。
  • Flannel通过Etcd服务维护了一张节点间的路由表,该张表里保存了各个节点主机的子网网段信息。
  • 源主机的flanneld服务将原本的数据内容UDP封装后根据自己的路由表投递给目的节点的flanneld服务,数据到达以后被解包,然后直接进入目的节点的flannel0虚拟网卡,然后被转发到目的主机的docker0虚拟网卡,最后就像本机容器通信一样的由docker0路由到达目标容器。
部署etcd
## 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
部署flannel

所有要串连起来的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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
关联docker和flannel
[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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Dcoker跨主机容器通信之overlay


在这里插入图片描述

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
  • 1

设置容器的主机名

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

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实现容器访问外网

Docker跨主机容器之间的通信macvlan


默认一个物理网卡,只有一个物理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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/258267
推荐阅读
相关标签
  

闽ICP备14008679号