目录
前言
一、Docker原生网络
1.bridge网络
2.host网络
3.none网络
4.网络ip分配规则
二、Docker自定义网络
1.自定义网络创建
2.不同网桥的容器进行通信
三、容器通信
1.使用容器名称通信
2.容器访问外网
3.外网访问容器
四、跨主机容器网络
1.跨主机同网段容器通信
2.跨主机不同网段容器通信
Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。
网络模式 | 含义 |
–network host | 容器与真实主机共享IP和端口 |
–network none | 指定关闭容器的网络功能,只保留内部的回环接口 |
birdge | 桥接模式会为每一个容器分配IP,容器通过docker0网桥以及iptables nat表配置与真实主机通信 |
container | 容器与另外一个容器共享IP和端口 |
docker安装后会自动创建3种原生网络:bridge、host、none。
docker安装时会创建一个名为 docker0 的Linux bridge,新建的容器会自动桥接到这个接口
(1)安装查看桥接工具
yum install -y bridge-utils
(2)查看docker0桥接
brctl show docker0
(1)关闭harbor仓库,使用host网络模式运行容器
可看到ip地址与test2相同
(1) 使用none网络模式运行容器
(1)先运行两个容器
(2)分别查看两个容器的ip
docker inspect demo1
docker inspect demo2
demo1:
demo2:
(3)关闭demo1和demo2,再重启,启动顺序为先demo2再demo1
(4)再次查看两个容器的ip
demo1:
demo2:
可以看到,当容器stop时,ip地址将会被收回,在开启时重新分配,分配的ip地址按照开启顺序依次递增
(1)创建自定义网桥
(2)使用自定义桥接拉起容器demo1,镜像为nginx,查看配置IP
(3)使用自定义桥接拉起容器busybox,查看IP
在终端中ping demo1,可以ping通,内置DNS自动做了解析
(1)删除demo1和自定义网络mynet1,使用带参数的方法重新创建新的自定义网络,使用新的自定义网络mynet1运行demo容器
- –subnet: 子网掩码
镜像信任功能能够保证镜像的安全,只有打了信任标签的镜像才能被拉取- –gateway: 网关
(2)使用自定义网络mynet1再启动busybox镜像容器,测试连通性
(3)再创建一个新的自定义网络mynet2,使用自定义网络mynet2再启动busybox镜像容器并尝试ping demo
此时无法ping通
(4)Ctrl+P+Q将busybox打入后台,为容器busybox配置第二块网卡mynet1
此时busybox可以ping通demo ,再查看其ip,已经有了172.10.0.0网段的ip
Container 网络模式是 Docker 中一种较为特别的网络的模式。
Docker 容器会共享一个网络栈,这样两个容器之间可以使用localhost高效快速通信。
在容器创建时使用–network=container:vm指定(vm指定的是运行的容器名)
–link 可以用来链接2个容器
–link的格式:
--link:alias
name和id是源容器的name和id,alias是源容器在link下的别名。
(1)ipforward开启
(2)在容器内ping外网
(1)生成demo容器,-p指定映射端口
宿主机把80端口映射到Docker容器上,访问宿主机的80端口就相当于访问Docker的80端口
(2)查看目的地转换规则
(3)查看网络状态
采用了双冗余机制,目的地转换规则第4条链或docker-proxy任意一个存在都可以从外网访问到容器
- 跨主机网络解决方案: 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可以通信。
macvlan网络方案实现
Linux kernel提供的一种网卡虚拟化技术。
无需Linux bridge,直接使用物理接口,性能极好。
(1)test1和test2新加一块网卡eth1
(2)编写两台虚拟机eth1的配置文件
配置文件内容如下
(3)两台虚拟机启用eth1网卡并开启混杂模式
(4)两台虚拟机中都创建macvlan1网络(10.0.0.0)
(5)在teat1和test2上,使用macvlan1网络运行busybox镜像容器
(1)在上一章基础上,在两台虚拟机上再创建macvlan2网络(192.168.0.0)
(2)在test1上使用macvlan1网络运行busybox镜像容器 ,再为该容器添加macvlan2网络
查看test1上busybox的ip 可看到已有192.168.0网段的ip
(3) 在test2上使用macvlan2网络运行busybox镜像容器
(4)在test1上的busybox中ping test2中的busybox
可看到成功ping通