运维-docker-docker网络和跨主机通信

455 阅读2分钟

1 Docker网络

1.1 bridge模式(默认)

所有容器连接到桥,通过使用NAT让容器可以访问外网(和VMware的NAT网络类似)

查看桥

image.png

查看主机在docker0网段的地址(docker的默认网段都是172.17.0.0/16)

image.png

个人理解docker的整个网络结构 主机:172.17.0.1 容器:172.17.0.2 容器......:172.17.0.x

image.png

1.2 host

所有容器都与docker主机在同一个网络,共用同主机的IP地址,非常方便访问外界网络,也会导致争抢端口的问题。

1.3 none

容器仅与lo网卡,不能和外部界连接,在高级应用中。(k8s会有另外的技术工具来连接,所以反而需要简单的模式即可)

1.4 容器网络或联盟网络

容器间共享同一个网络命名空间,实现容器间数据传输

2 跨主机通信

2.1 跨主机容器间通信的工具

Pipework

Flannel(k8s早期使用)

Weave

Open V Switch OVS

Calico (适合k8s复杂的功能)

2.2 Flannel工作原理

  • 是Overlay网络,覆盖型网络(类似于VPN的构建网络之间的隧道
  • 通过etcd保存子网信息及网络分配信息(一个分布式键值存储系统)
  • 给每台Docker Host分配置一个网段
  • 通过UDP传输数据包(类似隧道信息流)

image.png

2.3 配置flannel

步骤1 克隆两台安装有docker的VMware的CentOS7主机

两台主机之间项目ping通

步骤2 主机配置名称和本地DNS

主机192.168.255.132
hostnamectl set-hostname node1

主机192.168.255.131
hostnamectl set-hostname node2

两台主机都设置如下
vim /etc/hosts

添加如下
192.168.255.132 node1
192.168.255.132 etcd
192.168.255.131 node2

两台主机都关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
sed -ri 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

步骤3 安装etcd和flannel

node1

yum -y install etcd flannel

node2

yum -y install flannel

步骤4 配置etcd和flannel

node1 etcd配置与验证

vim /etc/hosts

systemctl enable etcd

systemctl start etcd

检查进程
ss -anput | grep ":2379"

修改配置如下 image.png

通过命令对etcd数据库进行set get操作

etcdctl set testdir/testkey0 1000
etcdctl get testdir/testkey0

flannel配置(node1主机和node2主机都要操作)

vim /etc/sysconfig/flanneld

启动flannel
systemctl enable flanneld

systemctl start flanneld


配置如下 image.png

步骤5 配置flannel与docker结合

nod1和node2都操作

1 查询subnet信息(子网信息)

cat /run/flannel/subnet.env

2 修改docker daemon配置文件

cat /etc/docker/daemon.json

{

"insecure-registries": ["http://192.168.122.33"],

"bip": "172.20.13.1/24",

"mtu": 1472

}

3 重启docker

{

"insecure-registries": ["http://192.168.122.33"],

"bip": "172.20.13.1/24",

"mtu": 1472

}

结果:最后进入容器后即可ping通另外主机的容器

image.png

最后 如发现各容器内分配的ip之间相互ping不通,可能由于防火墙问题引起的,执行下面操作即可:

image.png