云计算之 docker 05_ 网络_macvlan_overlay

++++++++++++++++++++

# 12. Docker本地网络类型

## 12.1查看支持网络类型
docker network ls


## 12.2 测试使用种类网络类型
docker run network=xxx
none: 无网络模式,容器网络只有一个127.0.0.1
++++++++++++++++++++++++++++++++++++

bridge: 默认模式,相当于NAT (单机中用得最多)

bridge网络,默认只提供了,内部容器间互访内部容器和宿主机之间的访问以及容器内部上外网的问题,但是没有提供外部网络访问内部网络功能,只能通过一些映射好的端口,访问到容器内部的一个端口。
++++++++++++++++++++++++++++++++
host: 公用宿主机Network Namespace
docker run -it --name="c_host2" --network=host centos:6.9 /bin/bash

容器的主机名,IP地址,端口,都是用的是宿主机上面的。只隔离部分资源,不隔离网络资源,这种网络用的很少。

进程是独立的,文件系统是独立的。
++++++++++++++++++++++++++++++++++
container: 与其他容器公用Network Namespace 在单机中用得很少。

与其他容器共用,在K8s 中,实现自愈功能,一种网络模型,谁先占用算谁的。
++++++++++++++++++++++++++++++++++
# 13. Docker跨主机网络介绍

两台宿主机的容器间互访
macvlan
## docker 自带的,轻量级
不能上外网,在macvlan 指定的段里面的容器,可以互相访问。

在两台宿主机上面建立一个大家都认识的一个通道(两边都需要创建),使得两台宿主机的容器可以互访。
macvlan 不能防止有相同的IP

overlay
类似于bridge ,在 bridge 上面加了一些功能
原有的docker0 还会继续使用,用来访问外网,再新增一卡网卡,用来与对端容器建立通道



# 14. Docker跨宿主机访问-macvlan实现
docker network create --driver macvlan --subnet=10.0.0.0/24
--gateway=10.0.0.254 -o parent=eth0 macvlan_1
--subnet=10.0.0.0/24 ### 专用的地址段,可以是其他的。
--gateway=10.0.0.254 ### 网关
-o parent=eth0 ## 在宿主机上面的那个网卡上建立

macvlan_1 ##名称可以任意
++++++++++++++
docker rm $(docker ps -q -f status=exited) ##删除状态为退出的容器



需要这个网络上面,没有运行的容器。
+++++++++++++++++

两台宿主机上面都要运行

宿主机A:
docker run -it --network macvlan_1 dfsc/c6.9_ping:v1 /bin/bash
也可以启动容器的时候指定IP
docker run -it --network macvlan_1 --ip 10.0.0.11 c69:ping /bin/bash





宿主机B:

docker run -it --network macvlan_1 c69:ping /bin/bash


两台宿主机的容器要指定不同的IP
docker run -it --network macvlan_1 --ip 10.0.0.15 c69:ping /bin/bash




# 15. Docker 跨主机访问--overlay实现

(1)、启动consul 服务,实现网络的统一配置管理(在一台宿主机上启动就可了)

docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap
docker run -d -p 8500:8500 -h consul --name consul consul:1.5.2 -server -bootstrap

docker run -di -h consul -p 8500:8500 --name=consul consul:1.5.2

consul: kv类型的存储数据库 (key:value)
(两个宿主机上面都要修改daemon.json,内容是一样的。)

让各个主机能够访问到consul,修改配置文件。
vim /etc/docker/daemon.json
{

"host": ["tcp://0.0.0.0:2376","unix:///var/run/docker.sock"],

"cluster-store": "consul://192.168.20.211:8500",

"cluster-advertise": "192.168.20.211:2376"

}



systemctl restart docker

(2)、创建overlay网络(在consul这台宿主机上创建就可以了)

docker network create -d overlay --subnet 172.16.0.0/24 --gateway 172.16.0.254 overlay1 ##这个是网络名称,可以任意。
--subnet 172.16.0.0/24 ##子网
--gateway 172.16.0.254 ##子网的网关


另外的宿主机上面,也能看到这个overlay1 的网络


(3)、启动容器测试(宿主机A)
docker run -it --network ol1 busybox /bin/sh
docker run -it --network overlay1 dfsc/c6.9_ping:v1 /bin/bash



另一台宿主机B上面,启动一个容器,使用overlay1 网络
docker run -it --network overlay1 c69:ping /bin/bash


++++++++++++++++++


查找原因:最后发现是,docker 的配置文件有问题

vim /etc/docker/daemon.json
{

"host": ["tcp://0.0.0.0:2376","unix:///var/run/docker.sock"],
"cluster-store": "consul://192.168.20.211:8500",
"cluster-advertise": "192.168.20.211:2376"
## 这里要写每个宿主机的IP,最方便的写法,直接 网卡:2376

"cluster-advertise": "eth0:2376" ## 宿主机主网卡的地址

}
--cluster-advertise 是用来指定与其他node通信的地址

重新修改两台宿主机 docker 的 配置文件(两台宿主机配置一样)

vim /etc/docker/daemon.json


保存退出,重启docker 服务。systemctl restart docker

登录consul















测试两台宿主机中的容器 是否能通信





与外网通信:




每个容器有两块网卡,eth0实现容器间的通讯,eth1实现容器访问外网