docker网络模式

Docker有五种网络模式,它们分别是bridgehostoverlayipvlanmacvlan还有None。每种网络模式都有自己的特点和用途,下面分别简单介绍一下。

网络模式

None

Docker 的 None 网络模式是一种特殊的网络模式,它不为容器创建任何网络接口或连接到任何网络。在 None 网络模式下,容器不会有任何网络连接,无法使用网络通信,也无法访问外部网络或其他容器。

该模式通常用于安全性或测试目的,例如在容器中执行敏感操作,而不希望容器与任何其他网络进行通信,或者在测试过程中模拟网络隔离场景。

以下是一些使用 Docker None 网络模式的示例:

# 创建一个使用 None 网络模式的容器
docker run --network=none <IMAGE>

# 进入使用 None 网络模式的容器
docker exec -it <CONTAINER> /bin/bash

# 在使用 None 网络模式的容器中执行敏感操作

需要注意的是,使用 None 网络模式的容器无法通过网络进行通信,包括与宿主机的通信,因此需要在容器中手动安装必要的软件包和工具,以便在容器内进行操作。

bridge
  • bridge:这是默认的网络模式,它会在主机和容器之间创建一个软件桥接。连接到这个网络的容器可以互相通信,也可以与外部网络通信,但是它们与其他网络隔离。每个容器都会分配一个自己的IP地址。这种网络模式适合于单机上运行的需要相互通信的容器。一个简单的例子是:
# 创建一个bridge网络
docker network create -d bridge my_bridge

# 启动两个容器并连接到这个网络
docker run -d --name container1 --network my_bridge busybox sleep 3000
docker run -d --name container2 --network my_bridge busybox sleep 3000

# 在container1中ping container2
docker exec -it container1 ping container2

这个例子中,我们创建了一个名为my_bridge的bridge网络,并在这个网络上启动了两个容器container1和container2。然后我们在container1中执行ping命令,可以看到它能够成功地ping通container2,说明它们之间可以通信。

host
  • host:这种网络模式会让容器共享主机的网络栈,没有任何隔离。容器不会分配自己的IP地址,而是直接使用主机的IP地址和端口。这种网络模式适合于需要高性能或者不需要隔离的容器。一个简单的例子是:
# 启动一个容器并使用host网络模式
docker run -d --name container3 --network host busybox sleep 3000

# 查看容器的IP地址,发现与主机一致
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container3

这个例子中,我们启动了一个名为container3的容器,并使用了host网络模式。然后我们查看了它的IP地址,发现它与主机的IP地址一样,说明它没有自己的IP地址,而是共享了主机的网络栈。

overlay
  • overlay:这种网络模式是分布式的,可以跨越多个Docker主机。这个网络允许在不同主机上运行的容器互相通信,而不需要操作系统级别的路由支持。overlay网络是Docker Swarm集群的网络实现,但是你也可以在两个独立的Docker Engine上使用它来让容器直接联系。这种网络模式适合于需要跨主机通信或者构建集群的容器。一个简单的例子是:
# 在两台主机上安装Docker Engine,并初始化Swarm集群
docker swarm init --advertise-addr <MANAGER-IP>
docker swarm join --token <TOKEN> <MANAGER-IP>:2377

# 在管理节点上创建一个overlay网络
docker network create -d overlay my_overlay

# 在管理节点上启动一个服务,并连接到这个网络
docker service create --name service1 --network my_overlay busybox sleep 3000

# 在工作节点上启动一个容器,并连接到这个网络
docker run -d --name container4 --network my_overlay busybox sleep 3000

# 在服务中ping容器
docker exec -it $(docker ps -q -f name=service1) ping container4

这个例子中,我们在两台主机上安装了Docker Engine,并初始化了一个Swarm集群。然后我们在管理节点上创建了一个名为my_overlay的overlay网络,并在这个网络上启动了一个名为service1的服务。接着我们在工作节点上启动了一个名为container4的容器,并连接到这个网络。最后我们在service1中执行ping命令,可以看到它能够成功地ping通container4,说明它们之间可以跨主机通信。

ipvlan
  • ipvlan:这是一种高级的网络模式,它可以让用户完全控制容器的IPv4和IPv6地址,以及层2和层3的VLAN标签和路由。这种驱动适用于需要将容器化服务与现有物理网络集成的场景。ipvlan网络会分配自己的接口,相比bridge网络有性能优势²。一个简单的例子是:
# 创建一个ipvlan网络,并指定父接口和子网
docker network create -d ipvlan \
  --subnet=192.168.210.0/24 \
  --gateway=192.168.210.1 \
  -o parent=eth0 \
  my_ipvlan

# 启动两个容器并连接到这个网络
docker run -d --name container5 --network my_ipvlan busybox sleep 3000
docker run -d --name container6 --network my_ipvlan busybox sleep 3000

# 在container5中ping container6
docker exec -it container5 ping container6

这个例子中,我们创建了一个名为my_ipvlan的ipvlan网络,并指定了父接口eth0和子网192.168.210.0/24。然后我们在这个网络上启动了两个容器container5和container6。然后我们在container5中执行ping命令,可以看到它能够成功地ping通container6,说明它们之间可以通信。

macvlan
  • macvlan:这是另一种高级的网络模式,它可以让容器在网络上表现为物理设备。Docker守护进程会根据容器的MAC地址来路由流量。使用macvlan驱动有时是处理那些期望直接连接到物理网络,而不是通过Docker主机的网络栈路由的遗留应用程序的最佳选择²。一个简单的例子是:
# 创建一个macvlan网络,并指定父接口和子网
docker network create -d macvlan \
  --subnet=192.168.1.0/24 \
  --gateway=192.168.1.1 \
  -o parent=eth0 \
  my_macvlan

# 启动两个容器并连接到这个网络
docker run -d --name container7 --network my_macvlan busybox sleep 3000
docker run -d --name container8 --network my_macvlan busybox sleep 3000

# 在container7中ping container8
docker exec -it container7 ping container8

这个例子中,我们创建了一个名为my_macvlan的macvlan网络,并指定了父接口eth0和子网192.168.1.0/24。然后我们在这个网络上启动了两个容器container7和container8。然后我们在container7中执行ping命令,可以看到它能够成功地ping通container8,说明它们之间可以通信。

网络隔离机制

Docker 的网络隔离机制是通过使用 Linux 内核的网络命名空间和 Linux bridge 技术来实现的。Docker 默认会为每个容器创建一个独立的网络命名空间,每个网络命名空间包含一个独立的网络栈和网络接口。这种网络隔离机制可以确保容器之间的网络互相隔离,从而避免容器之间的网络冲突和干扰。

以下是一些 Docker 的网络隔离机制的细节:

  1. Bridge 网络模式

Docker 默认使用 Bridge 网络模式来实现容器之间的网络隔离。在这种模式下,Docker 会创建一个名为 docker0 的虚拟网桥,所有容器的网络接口都会连接到这个网桥上。每个容器都会被分配一个独立的 IP 地址,并且容器之间可以通过 IP 地址相互通信。Docker 还可以为每个容器分配一个独立的 DNS 名称,从而使得容器之间可以通过 DNS 名称相互通信。

以下是一些 Docker 命令,可以用来查看和管理 Docker 的 Bridge 网络模式:

  • docker network ls - 列出所有 Docker 网络。
  • docker network inspect <NETWORK> - 查看指定 Docker 网络的详细信息。
  • docker network create <NETWORK> - 创建一个新的 Docker 网络。
  • docker network connect <NETWORK> <CONTAINER> - 将指定容器连接到指定 Docker 网络上。
  • docker network disconnect <NETWORK> <CONTAINER> - 将指定容器从指定 Docker 网络上断开连接。
  1. Host 网络模式

除了 Bridge 网络模式,Docker 还支持 Host 网络模式。在 Host 网络模式下,容器和宿主机共享同一个网络栈和网络接口,从而使得容器可以直接使用宿主机的网络接口和 IP 地址。这种模式可以提高容器的网络性能,但是容器之间的网络隔离会变得更加脆弱。

以下是一些 Docker 命令,可以用来启动一个使用 Host 网络模式的容器:

docker run --network=host <IMAGE>
  1. 其他网络模式

除了 Bridge 和 Host 网络模式之外,Docker 还支持一些其他的网络模式,例如 None 网络模式和 Overlay 网络模式。在 None 网络模式下,容器没有任何网络接口,从而使得容器无法与其他容器或宿主机通信。在 Overlay 网络模式下,可以在多个 Docker 主机之间创建一个虚拟的 Overlay 网络,从而使得不同主机上的容器可以相互通信。

以下是一些 Docker 命令,可以用来启动一个使用其他网络模式的容器:

docker run --network=none <IMAGE>
docker network create --driver=overlay <NETWORK>
docker run --network=<NETWORK> <IMAGE>

总之,Docker 的网络隔离机制是通过使用 Linux 内核的网络命名空间和 Linux bridge 技术来实现的。通过这种机制,Docker 可以确保每个容器都有自己独立的网络栈和网络接口,从而避免容器之间的网络冲突和干扰。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tlqwanttolearnit

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值