Docker 入门之网络

2022-11-15 21:36:20 浏览数 (1)

Docker 网络使用了 Linux 的 network namespace 机制,隔离了网络设备, ip 协议栈,路由表以及防火墙规则。

默认网络模式

每一个安装了 Docker 的 Linux 主机都会创建一个名为 docker0 的虚拟网桥,该虚拟网桥作为所有容器的默认网关。

在默认的网络模式下,虚拟网桥的工作方式和物理交换机类似,主机上的所有容器通过 docker0 连接在了一个二层网络中。

每启动一个容器,Docker 都会创建一个虚拟网卡, 并根据 Docker 网桥所在的网段来分配给容器一个未使用的 ip 地址,称之为容器 ip。在宿主机和容器内分别创建了一个虚拟接口,它们彼此连通,这对接口称之为 veth pair。

默认情况下的网络模式称之为 bridge 模式,该模式为 docker 的默认模式。在启动 docker 时可以使用--net指定容器的网络模式

代码语言:javascript复制
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命令查看

代码语言:javascript复制
sudo docker network ls

用户可通过network create命令创建自定义网络

代码语言:javascript复制
# 创建自定义网络 指定 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

启动容器可以指定连接到自定义网络

代码语言:javascript复制
# 启动两个 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命令可以查看一个网络的详情

代码语言:javascript复制
# 查看 mynet 网络详细信息,参数为网络 id 或网络名,参数可通过 network ls 命令查到
sudo docker inspect e37aeda5814a

可以看到该网络下连接了两个容器

在以前可使用 --link 参数来使容器互联,但在自定义网络下默认就可以使用容器名进行容器的互联,内部已经维护好了容器名和 ip 的对应关系

代码语言:javascript复制
# 在 redis1 容器中访问 redis2 容器
sudo docker exec -it redis1 ping redis2

注:默认的 bridge 网络不支持通过容器名进行互联

默认情况下两个网络是隔离的,如果需要让两个网络下的容器能够互相访问,可以使用network connect命令将容器连接到另一个网络

在默认的 bridge 网络下创建一个 redis3 容器用于演示

代码语言:javascript复制
sudo docker run -it -d -P --name redis3 --net bridge redis:alpine

默认情况下,两个不同网络的容器无法访问

将 redis3 容器加入到 mynet 网络中

代码语言:javascript复制
# 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 国际许可协议 进行许可。转载请注明出处!

0 人点赞