docker single-host network

单一主机docker容器网络


CNM(container network model)模型

docker single-host network_第1张图片
CNM模型
  • Sandbox代表容器的网络命名空间,包含了容器的完整网络栈,不同的容器之间可以完全隔离。在宿主机上,就表现为独立的网络命名空间。
  • Endpoint代表容器接入网络的端点,可以形象地认为一个Endpoint对容器来说,就是一张物理网卡。
  • Network代表一组可以直接相互通信的Endpoint集合,可以基于LinuxBridge或者VLAN实现。在宿主机上,每个网络都是一个独立的网络命名空间,宿主机上同一网络的的容器,都通过veth pair链接到这个网络命名空间上。

Docker提供了多种网络工作模式
通过 docker network ls 可以查看

docker single-host network_第2张图片
docker网络

scope为local表示网络模式只能用于单个主机,不能用于集群


The brige network

当 docker daemon 启动后,在linux系统中,可以使用ifconfig命令查看到有一个名为docker0的网桥(在mac中,docker是启动在虚拟机中,所以不存在docker0的网桥)

默认网络模式,此模式下,容器有自己的独立的Network Namespace。简单来说,Docker在宿主机上虚拟了一个子网络,宿主机上所有容器均在这个子网络中获取IP,这个子网通过网桥挂在宿主机网络上。Docker通过NAT技术确保容器可与宿主机外部网络交互。


docker single-host network_第3张图片
bridge

eth:以太网卡
veth:虚拟以太网卡

新创建一个bridge
$ docker network create --driver bridge sample-net
再次查看docker network,就会多出一个实例

查看子网范围
$ docker network inspect sample-net |grep Subnet

docker single-host network_第4张图片
bridge 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

你可能感兴趣的:(docker single-host network)