Docker 网络使用了 Linux 的 network namespace 机制,隔离了网络设备, ip 协议栈,路由表以及防火墙规则。
每一个安装了 Docker 的 Linux 主机都会创建一个名为 docker0 的虚拟网桥,该虚拟网桥作为所有容器的默认网关。
在默认的网络模式下,虚拟网桥的工作方式和物理交换机类似,主机上的所有容器通过 docker0 连接在了一个二层网络中。
每启动一个容器,Docker 都会创建一个虚拟网卡, 并根据 Docker 网桥所在的网段来分配给容器一个未使用的 ip 地址,称之为容器 ip。在宿主机和容器内分别创建了一个虚拟接口,它们彼此连通,这对接口称之为 veth pair。
默认情况下的网络模式称之为 bridge 模式,该模式为 docker 的默认模式。在启动 docker 时可以使用--net
指定容器的网络模式
sudo docker run -it --net=bridge -p 9001:6379 redis:alpine
bridge 模式的网络转发如下图所示
除了 brideg 模式,docker 还支持 container, host, none 模式
网络模式 | 配置 | 说明 |
---|---|---|
bridge | --net=bridge | 默认模式 |
container | --net=container:name或id | 容器和另外一个容器共享 network namespacek8s 中的 pod 就是多个容器共享一个 network namespace |
host | --net=host | 容器和宿主机共享 network namespace |
none | --net=none | 不配置网络,用户可以稍后进入容器,自行配置 |
默认主机中创建了三个网络, 可通过network ls
命令查看
sudo docker network ls
用户可通过network create
命令创建自定义网络
# 创建自定义网络 指定 bridge 模式,网段为 192.168.0.0/16, 网关为 192.168.0.0/16, 命名为 mynet
sudo docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
启动容器可以指定连接到自定义网络
# 启动两个 redis 容器,分别命名为 redis1, redis2
sudo docker run -it -d --name redis1 -P --net mynet redis:alpine
sudo docker run -it -d --name redis2 -P --net mynet redis:alpine
通过network inspect
命令可以查看一个网络的详情
# 查看 mynet 网络详细信息,参数为网络 id 或网络名,参数可通过 network ls 命令查到
sudo docker inspect e37aeda5814a
可以看到该网络下连接了两个容器
在以前可使用 --link
参数来使容器互联,但在自定义网络下默认就可以使用容器名进行容器的互联,内部已经维护好了容器名和 ip 的对应关系
# 在 redis1 容器中访问 redis2 容器
sudo docker exec -it redis1 ping redis2
注:默认的 bridge 网络不支持通过容器名进行互联
默认情况下两个网络是隔离的,如果需要让两个网络下的容器能够互相访问,可以使用network connect
命令将容器连接到另一个网络
在默认的 bridge 网络下创建一个 redis3 容器用于演示
sudo docker run -it -d -P --name redis3 --net bridge redis:alpine
默认情况下,两个不同网络的容器无法访问
将 redis3 容器加入到 mynet 网络中
# docker network connect 网络名或id 容器名或id
sudo docker network connect mynet redis3
加入后就可以成功访问了
查看 mynet 网络信息和 ip 信息后发现,redis3 容器被分配了一个 mynet 的网络接口和 ip 地址
本文作者: Ifan Tsai (菜菜)
本文链接: https://cloud.tencent.com/developer/article/2164601
版权声明: 本文采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!