单一主机docker容器网络
CNM(container network model)模型
CNM模型- Sandbox代表容器的网络命名空间,包含了容器的完整网络栈,不同的容器之间可以完全隔离。在宿主机上,就表现为独立的网络命名空间。
- Endpoint代表容器接入网络的端点,可以形象地认为一个Endpoint对容器来说,就是一张物理网卡。
- Network代表一组可以直接相互通信的Endpoint集合,可以基于LinuxBridge或者VLAN实现。在宿主机上,每个网络都是一个独立的网络命名空间,宿主机上同一网络的的容器,都通过veth pair链接到这个网络命名空间上。
Docker提供了多种网络工作模式
通过 docker network ls
可以查看
scope为local表示网络模式只能用于单个主机,不能用于集群
The brige network
当 docker daemon 启动后,在linux系统中,可以使用ifconfig
命令查看到有一个名为docker0的网桥(在mac中,docker是启动在虚拟机中,所以不存在docker0的网桥)
默认网络模式,此模式下,容器有自己的独立的Network Namespace。简单来说,Docker在宿主机上虚拟了一个子网络,宿主机上所有容器均在这个子网络中获取IP,这个子网通过网桥挂在宿主机网络上。Docker通过NAT技术确保容器可与宿主机外部网络交互。
bridge
eth:以太网卡
veth:虚拟以太网卡
新创建一个bridge
$ docker network create --driver bridge sample-net
再次查看docker network,就会多出一个实例
查看子网范围
$ docker network inspect sample-net |grep Subnet
查看子网范围,发现不同bridge子网范围不一致
指定子网范围(/16表示子网掩码)
$ docker network create --driver bridge --subnet "10.1.0.0/16" test-net
启动容器c1
$ docker container run --name c1 -it -d jenkins
查看默认bridge信息
$ docker network inspect bridge
发现此时包含容器c1信息
启动容器c3
$ docker container run --name c3 -d --network test-net jenkins
查看test-net的bridge信息
docker network inspect test-net
发现此时包含容器c3信息
连续两次声明network,以最后一个为准
$ docker container run --name c5 -d --network sample-net --network test-net jenkins
删除network
docker network rm test-net
docker network rm sample-net
The host network
启动容器
$ docker container run --rm -it --network host jenkins /bin/bash
执行ip addr
发现看到的都是宿主机上的信息
The null network
启动容器
$ docker container run --rm -it --network none jenkins /bin/sh
执行ip addr show ehto
发现找不到eth0网卡信息
container:web
创建bridge
$ docker network create --driver bridge test-net
创建镜像为nginx的容器web
$ docker container run --name web -d --network test-net nginx
创建容器alpine
$ docker container run -it --rm --network container:web alpine /bin/sh
上述容器共享同一namespace,可互相访问
$ wget localhost:80
port management
$ docker container run --name web -P -d nginx
-P表示所有的容器端口均暴露给主机的32XXX端口范围
查看端口
$ docker container port web
以参数的形式暴露端口
$ docker container run --name web2 -p 8079:80 -d nginx
网友评论