容器的网络默认与宿主机及其他容器之间是隔离的,但有时也需要与宿主机和容器进行通信。
Docker的网络架构是一个复杂而强大的系统,它基于容器网络模型(Container Network Model,CNM)、Libnetwork以及一系列驱动来实现。
CNM:全名Container Network Model,容器网络模型,旨在标准化和简化容器网络的管理。
CNM主要包含以下三个组件:
Libnetwork是CNM的一个标准实现,也是Docker网络架构的核心组件。它是开源库,采用Go语言编写,实现了CNM中定义的全部三个组件,并提供了以下额外功能:
驱动是Docker网络架构中实现数据层相关内容的组件,它负责处理网络的连通性和隔离性等核心任务。Docker内置了多种驱动,以满足不同的网络需求:
创建自定义网络
语法:
docker network create [OPTIONS] NETWORK
关键参数
例子:
docker network create --driver=bridge --subnet=192.168.0.0/16 br0
查看网络详情
语法:
docker network inspect [OPTIONS] NETWORK [NETWORK...]
例子:
docker network inspect br0
将容器连接到网络
语法:
docker network connect [OPTIONS] NETWORK CONTAINER
例子:
docker network connect br0 mynginx1
断开网络
语法:
docker network disconnect [OPTIONS] NETWORK CONTAINER
例子:
docker network disconnect br0 mynginx
删除不同的网络
语法:
docker network prune [OPTIONS]
例子:
删除1个或多个网络
语法:
docker network rm NETWORK [NETWORK...]
例子:
查看网络
创建网络并查看:
docker network create --subnet=172.18.0.0/16 mynetwork
创建一个容器并加入网络:
docker run -itd --name mynginx2 --network mynetwork nginx:1.23.4
查看容器详情:
docker inspect mynginx2
没有加入网络的情况下:
docker run -itd --name mynginx3 nginx:1.23.4
docker inspect mynginx
连接网络后多出一个网络:
docker network connect mynetwork mynginx3
断开连接后再查看就没有了:
docker network disconnect mynetwork mynginx3
此时无法删除该网络,因为创建的两个容器都跟这网络连接着,必须先删除掉相关的容器:
docker network rm mynetwork
Docker Bridge网络采用内置的bridge驱动,bridge驱动底层采用的是Linux内核中Linux bridge技术。
下面介绍几个操作实例:
使用busybox创建两个容器,并且保持于后台运行
docker run -itd --name c1 busybox:latest
docker run -itd --name c2 busybox:latest
查看两个容器的通信情况:
docker exec -it c1 ip a
docker exec -it c2 ip a
尝试c1能否与c2互通
docker exec -it c1 ping 172.17.0.4
查看网络bridge详情:
docker network inspect bridge
该网络已经连接了两个容器,即 c1 和 c2。
当把c1容器停止运行,会发现bridge会少一个容器连接
docker stop c1
通过 create 命令来创建新的 bridge:
docker network create -d bridge new-bridge
查看新网络的详情:
docker network inspect new-bridge
运行新容器时,指定一个网络:
docker run -itd --name c3 --network new-bridge busybox:latest
docker inspect c3 | grep "Networks"-A 17
查看网络的详情
docker network inspect new-bridge
让c1、c2连接默认的bridge,c3、c4连接new-bridge
docker run -itd --name c4 --network new-bridge busybox:latest
docker network inspect bridge | grep "Containers"-A 20
docker network inspect new-bridge | grep "Containers"-A 20
查看c1、c2的ip:
docker exec -it c1 ip a
docker exec -it c2 ip a
看能不能互通
docker exec -it c1 ping 172.17.0.4
docker container exec -it c1 ping c2
c1 容器 ping c2 容器名发现找不到 IP 地址, 确定默认 bridge 网络不支持DNS
验证 c3 和 c4 是否能够使用 DNS 解析服务:
docker exec -it c3 ping 172.18.0.3
docker container exec -it c3 ping c4
c3 容器 ping c4 容器名 可通 确定自定义 bridge 支持 DNS
docker容器运行默认都会分配独立的Network NameSpace隔离子系统;
如果基于host网络模式,容器将不会获得一个独立的Network NameSpace,而是和宿主机共用一个Network NameSpace
我们可以验证下:
让容器c1连接bridge网络模式、c2连接host网络模式
docker run --name c1 -itd busybox:latest
docker run --name c2 -itd --network=host busybox:latest
分别查看c1和c2的ip
docker exec c1 ip a
docker exec c2 ip a
可以看到 c1 容器是独立的网络配置, 而 c2 容器是和宿主机共享网络配置。
Docker Container 的 other container 网络模式是 Docker 中一种较为特别的网络的模式。
在这个模式下容器的网络隔离性会处于bridge和host模式之间。
Docker Container共享其他容器的网络环境,则至少这两个容器之间不存在隔离
下面我们来验证下:
创建一个busybox容器
docker run -itd --name netcontainer1 busybox:latest
使用netcontainer1的网络创建一个新的容器
使用 netcontainer1 的网络创建另外一个容器
docker run -itd --name netcontainer2 --network container:netcontainer1 busybox
查看netcontainer1和netcontainer2 的网络配置:
docker exec -it netcontainer1 ifconfig
docker exec -it netcontainer2 ifconfig
如果我们停止netcontainer1的容器运行,再查看netcontainer2的网络配置:
会发现少了eth0网卡,只有一个本地的网卡
我们对两个容器都重启一下(先启动netcontainer1):
docker restart netcontainer1
docker restart netcontainer2
网络配置恢复
none network就是没有网络。
挂在这个网络下,除了本地lo,没有其他我网卡
下面我们来验证下:
docker run -itd --name c1 --network none busybox:latest
docker exec -it c1 ip a
提示:请勿发布广告垃圾评论,否则封号处理!!