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