Docker网络
Docker网络实现原理
Docker使用namespaces
技术来提供称为容器的隔离工作区,运行一个容器时,Docker为该容器创建一组命名空间,这些名称空间提供了一层隔离,容器的所有进程都在单独的名称空间中运行,其访问仅限于该名称空间,其中就包括network namespaces
使用ip netns list
命令可以看到当前Linux系统中的网络命名空间,通过向两个不同的网络命名空间中插一对虚拟网卡,这两个网络命名空间就可以相互通信了,大致原理如下:
- 使用
ip netns add
和ip netns delete
命令可对网络命名空间进行增删操作,使用该命令增加两个不同的网络命名空间
ip netns add netns1 #添加名为netns1的网络命名空间
ip netns add netns2 #添加名为netns2的网络命名空间
ip netns list #查看网络命名空间是否创建成功
- 使用
ip netns exec
命令可在某个网络命名空间中执行命令
ip netns exec netns1 ip addr #查看netns1网络命名空间的ip信息
ip netns exec netns2 ip addr #查看netns2网络命名空间的ip信息
ip netns exec netns1 ip link set dev lo up #发现该命名空间下的回环端口为启动,启动回环口
ip netns exec netns2 ip link set dev lo up #发现该命名空间下的回环端口为启动,启动回环口
- 创建一对虚拟网卡,相当于一根网线,插入到两个不同的网络命名空间中
ip link add veth-netns1 type veth peer name veth-netns2 #添加一对虚拟网卡,名为veth-netns1和veth-netns2
ip link #查看虚拟网卡是否创建成功
ip link set veth-netns1 netns netns1 #将veth-netns1虚拟网卡添加到netns1网络命名空间中
ip link set veth-netns2 netns netns2 #将veth-netns2虚拟网卡添加到netns2网络命名空间中
ip link #查看虚拟网卡是否添加成功,发现消失了,就添加成功了
- 为虚拟网卡设置IP,并分别启动在不同网络命名空间中的虚拟网卡
ip netns exec netns1 ip addr add 192.168.1.1/24 dev veth-netns1 #为netns1网络命名空间添加的veth-netns1虚拟网卡设置ip
ip netns exec netns2 ip addr add 192.168.1.2/24 dev veth-netns2 #为netns2网络命名空间添加的veth-netns2虚拟网卡设置ip
ip netns exec netns1 ip link set dev veth-netns1 up #启动netns1网络命名空间添加的veth-netns1虚拟网卡
ip netns exec netns2 ip link set dev veth-netns2 up #启动netns2网络命名空间添加的veth-netns2虚拟网卡
- 测试两个网络命名空间是否可以ping通
ip netns exec netns1 ping 192.168.1.2 #测试两个命名空间是否可以ping通
ip netns exec netns1 ping 192.168.1.1 #测试两个命名空间是否可以ping通
单机Docker网络
默认情况下,同一个系统下的Docker容器是可以互相通信的,因为默认情况下(桥接模式bridge
)网络连接状态如下图所示
docker run -d --name=container1 centos /bin/bash -c "while true; do sleep 3600; done"
docker run -d --name=container2 centos /bin/bash -c "while true; do sleep 3600; done"
#后台运行两个容器,名字为container1和container2,后面的命令和参数是为了让容器一直处于运行状态
ip addr #此时查看宿主机的ip会发现多出两个虚拟网卡
docker exec container1 ip addr
docker exec container2 ip addr
#查看两个容器的ip地址
docker exec container1 ping 172.17.0.3
docker exec container1 ping 172.17.0.2
#测试两个容器之间是否可以互相通信
网络管理
docker network ls
:列出当前Docker中的所有网络,以列表的形式显示(默认情况下有三个网络),具体如下- bridge网络驱动:桥接网络,通过宿主机的docker0网卡进行网络连接
- host网络驱动:共享宿主机的网络
- null网络驱动:未使用网络,单机容器,也无法连接外网,通常用于工具类的容器
docker network ls
NETWORK ID NAME DRIVER SCOPE
3637f7abbd59 bridge bridge local
3ea46bceee2e host host local
246372f3bb06 none null local
docker network inspect
:查看某个网络的详细信息docker network connect
:将网络连接到某个容器上,一个容器可以连接多个网络docker network disconnect
:将网络从某个容器上移除
构建网络
docker network create
:创建一个自定义网络- 使用
-d
参数指定该网络驱动,默认网络驱动是bridge
- 对于自定义网络中所有容器都已经link好了,即都可以通过容器名互相访问
- 使用
docker network rm
:删除一个自定义网络- 在运行容器
docker container run
命令时使用--network
参数指定要连接的网络- 不指定默认连接网络是
bridge
- 不指定默认连接网络是
- 在运行容器
docker container run
命令时使用--link
参数指定要连接的容器名,就可以不使用ip访问连接容器,而通过容器名访问其他容器- 该连接是单向的,另一个容器不可以通过容器名访问该容器
容器端口映射
- 在运行容器
docker container run
命令时使用-p
参数指定要映射的端口 - 参数值的格式为
宿主机端口:容器端口
,若宿主机有多个网卡还可指定网卡IP映射到端口,默认是0.0.0.0
- 多个端口映射可使用多个
-p
参数进行指定 - 映射端口之后外界在访问宿主机的该端口时,会被转发到容器的端口
- 底层是使用的防火墙工具实现端口转发功能的
多机Docker网络
利用隧道技术(vxlan虚拟局域网)连接多个不同主机中的Docker容器,隧道技术简单的理解就是将真实的数据包包裹在真正发送的数据包中进行传输
Comments NOTHING