[root@server1 ~]# docker network create --driver bridge my_net1
[root@server1 ~]# docker network ls
由上图我们可以看到创建的网络ID为4554d78082da ,使用ip addr查看本机网络:
查看docker自定义网络如下图,当我们创建好自定义网络后,自定义为其分配IP网段和网关。
docker的bridge自定义网络之间默认是有域名解析的;
docker的bridge自定义网络与系统自带的网桥之间默认是有解析的;
但是docker的系统自带的网桥之间默认是没有解析的。
[root@server1 ~]# docker network create --driver bridge --subnet 172.20.0.0/24 --gateway 172.20.0.1 my_net2
[root@server1 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
f3aff7e4dad5 bridge bridge local
c5f20e91b8ca host host local
4554d78082da my_net1 bridge local
28b91234a14b my_net2 bridge local
0e8b7355d807 none null local
[root@server1 ~]# docker network inspect my_net2
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.20.0.0/24",
"Gateway": "172.20.0.1"
}
]
},
使用–ip参数可以指定容器ip地址,但必须是在自定义网桥上(自定义的ip地址和网关地址),
默认的bridge模式不支持,同一网桥上的容器是可以通信的
[root@server1 ~]# docker run -it --name vm2 --network=my_net2 --ip=172.20.0.10 ubuntu
root@a77dd40e0a04:/# ip a
[root@server1 ~]# docker ps
[root@server1 ~]# docker network connect my_net1 vm2
[root@server1 ~]# docker attach vm2
root@a77dd40e0a04:/# ip a
在容器vm2内(IP=172.20.0.10)ping vm1(IP=172.19.0.2)
root@a77dd40e0a04:/# ping 172.19.0.2
以上我们实现了:使用自定义网络实现容器间的通信
注意:
外网如何访问容器?
外网访问容器用到了docker-proxy和iptables DNAT
宿主机访问本机容器使用的是iptables DNAT
外部主机访问容器或容器之间的访问是docker-proxy实现
示例:
[root@server1 ~]# iptables -t nat -nL
[root@server1 ~]# docker run -d --name nginx -p 80:80 nginx
[root@server1 ~]# docker port nginx
80/tcp -> 0.0.0.0:80
[root@server1 ~]# netstat -ntpl | grep 80
tcp6 0 0 :::80 :::* LISTEN 3901/docker-proxy
[root@server1 ~]# iptables -t nat -nL
我们可以在nat表的最后一行看到使用了端口转发。
组件 | 功能 |
---|---|
Sandbox | 容器网络栈,包含容器接口、dns、路由表。(namespace) |
Endpoint | 作用是将sandbox接入network (veth pair) |
Network | 包含一组endpoint,同一network的endpoint可以通信 |
(1)两台虚拟机
(2)两台虚拟机上添加两块虚拟网卡,并安装好相应的docker服务(因为我们模拟的时docker容器的跨主机访问)
[root@server1 ~]# docker network prune
[root@server1 ~]# docker network rm my_net1 my_net2
[root@server1 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
f3aff7e4dad5 bridge bridge local
c5f20e91b8ca host host local
0e8b7355d807 none null local
[root@server1 ~]# ip link set up eth1
[root@server1 ~]# ip add
macvlan本身是linxu kernel的模块,本质上是一种网卡虚拟化技术。其功能是允许在同一个物理网卡上虚拟出多个网卡,通过不同的MAC地址在数据链路层进行网络数据的转发,一块网卡上配置多个 MAC 地址(即多个 interface),每个interface可以配置自己的IP,Docker的macvlan网络实际上就是使用了Linux提供的macvlan驱 动。
因为多个MAC地址的网络数据包都是从同一块网卡上传输,所以需要打开网卡的混杂模式ip link set eth1 promisc on。
[root@server1 ~]# ip link set eth1 promisc on
[root@server1 ~]# ip addr show | grep eth1
注意:如果不开启混杂模式,会导致macvlan网络无法访问外界,具体在不使用vlan时,表现为无法ping通路由,无法ping通同一网络内其他主机。
创建macvlan网络不同于桥接模式,需要指定网段和网关(因为要保证跨主机上网段和网关是相同的),并且都得是真实存在的。
server1:
[root@server1 ~]# docker network create -d macvlan mac1 --subnet=172.22.0.0/24 --gateway=172.22.0.1 -o parent=eth1
[root@server1 ~]# docker network ls
server2:
[root@server2 ~]# docker network create -d macvlan mac1 --subnet=172.22.0.0/24 --gateway 172.22.0.1 -o parent=eth1
[root@server2 ~]# docker network ls
macvlan会独占主机网卡,但可以使用vlan子接口实现多macvlan网络
vlan可以将物理二层网络划分为4094个逻辑网络,彼此隔离,vlan id取值为1~4094
server1:
[root@server1 ~]# docker run -it --name vm1 --network=mac1 --ip=172.22.0.10 ubuntu
root@12542041d9de:/# ip a
server2:
root@12542041d9de:/# ping 172.22.0.20
[root@server1 ~]# brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.024290f2797b no
[root@server1 ~]# docker attach vm1
root@12542041d9de:/# ip a
[root@server1 ~]# ip addr show eth1
可见,容器的 eth0 就是宿主机的eth1通过macvlan虚拟出来的interface。容器的interface直接与主机的网卡连接,这种方案使得容器无需通过NAT和端口映射就能与外网直接通信(只要有网关),在网络上看起来与其他独立主机没有区别。
vlan可以将物理二层网络划分为4094个逻辑网络,彼此隔离,vlan id取值为1~4094
我们只需要在创建容器时使用vlan子接口就可以i解决:
server1:
[root@server1 ~]# docker run -it --name vm4 --network=mac1 --ip=172.22.0.30 ubuntu
root@4ce2fc7c4a5f:/# ip a
测试是否能ping通server2上的vm2容器。
root@4ce2fc7c4a5f:/# ping 172.22.0.20
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。