Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。
1.原生网络
查看原生网络docker network ls
自动生成桥接docker0 ip addr show docker0
安装查看桥街工具yum install -y bridge-utilsbrctl show
查看docker0桥接brctl show docker0
启动容器会生成虚拟网卡,自动分配ip
删除容器,虚拟网卡释放
–network host 表示虚拟机与宿主机同时使用IP和端口。不会生成虚拟网卡。
查看已经启动的nginx80端口
–network none指定关闭容器的网路功能,只留下回环接口。
当容器停掉时,资源会释放,重新启动按照启动顺序分配动态ip
docker run -d --name demo1 nginx
docker run -d --name demo2 nginx
docker inspect demo1
docker inspect demo2
2.自定义网络
自定义网络网桥mynet1
docker network create net1
使用自定义桥接拉起容器demo1,镜像为nginx,查看配置IP
docker run -d --name demo1 --network net1 nginx
再次使用自定义桥接拉起容器centos,docker run -it --rm --network net1 centos
自定义网段和ip
docker network create --subnet 172.10.0.0/24 --gateway 172.10.0.1 mynet1
docker inspect mynet1
容器添加双网卡实现彼此不同网段通信
按照之前的操作,不同网桥分配的IP网段是不同的,所以彼此之间也不能通信。
创建两个网卡mynet1、mynet2
docker network create --subnet 172.18.0.0/24 --gateway 172.18.0.1 net1
docker network create --subnet 172.19.0.0/24 --gateway 172.19.0.1 net2
使用net1网卡,拉起容器nginx
docker run -d --name nginx --network net1 --ip 172.18.0.10 nginx
使用net2拉起容器centos,查看分配的ip
docker run -it --rm --network mynet1 busybox
为添加第二个网卡
docker network connect net2 nginx
再次打开后台的容器,发现可以ping通nginx
3.容器通信
从docker1.10版本开始,内嵌了DNS server,自带DNS解析功能。
在容器创建时使用–network=container:v1指定
处于这个模式下的 Docker 容器会共享一个网络栈,这样两个容器之间可以使用localhost高效快速通信。
外网访问容器用到了docker-proxy和iptables DNAT
宿主机访问本机容器使用的是iptables DNAT
外部主机访问容器或容器之间的访问是docker-proxy实现
4.跨主机容器网络–macvlan
docker原生的overlay和macvlan
第三方的flannel、weave、calico
众多网络方案是如何与docker集成在一起的
libnetwork docker容器网络库
CNM (Container Network Model)这个模型对容器网络进行了抽象
CNM分三类组件
Sandbox:容器网络栈,包含容器接口、dns、路由表。(namespace)
Endpoint:作用是将sandbox接入network (veth pair)
Network:包含一组endpoint,同一network的endpoint可以通信
Linux kernel提供的一种网卡虚拟化技术。无需Linux bridge,直接使用物理接口,性能极好。
打开网卡混杂模式
使用macvlan 创建网卡net3,-o指定物理网卡
docker network create -d macvlan --subnet 172.30.0.0/24 --gateway 172.30.0.1 -o parent=eth0 net1
查看net3信息docker network inspect net3
使用net3拉起busybox容器,指定ipdocker run -it --rm --network macvlan1 --ip 172.30.0.10 centos
server2虚拟机与server1操作相同
docker network create -d macvlan --subnet 172.30.0.0/24 --gateway 172.30.0.1 -o parent=eth1 net3
docker run -it --rm --name centos --network net3 --ip 172.30.0.11 centos
server1中可以ping通。
macvlan会独占主机网卡,但可以使用vlan子接口实现多macvlan网络
vlan可以将物理二层网络划分为4096个逻辑网络,彼此隔离.
使用vlan子接口,-o parent=eth1.1
docker network create -d macvlan --subnet 172.21.0.0/24 --gateway 172.21.0.1 -o parent=eth1.1 net4
server2操作与server1相同,分别打开一个终端,可以ping通。
文章评论