3.2 网络配置(下篇)

摘要
本实验将深入探讨Docker的高级网络配置选项,包括传统的容器连接方式、container网络模式和host网络模式。通过这些不同的网络模式,你将了解Docker如何在不同场景下提供灵活的网络解决方案,以满足各种应用需求。这些知识对于构建复杂的容器化应用架构至关重要。
实验内容

本实验要求学生了解Docker的三种特殊网络连接方式:

  1. Container网络模式(共享网络命名空间)
  2. Host网络模式(使用主机网络)
  3. 传统的容器连接(--link参数)

这些网络模式各有特点和适用场景,掌握它们将帮助你更灵活地设计容器化应用的网络架构。

删除以下内容:

  • 所有容器(包括运行中的和已停止的)
  • 所有镜像
  • 所有自建网络(alpine-web)

关于删除的命令:

  • docker rm 删除容器
  • docker rmi 删除镜像
  • docker network rm 删除网络

Container网络模式允许新创建的容器共享现有容器的网络命名空间,包括网络接口、IP地址、路由表等。这对于需要共享网络但保持其他资源隔离的场景非常有用。

1.创建 alpine1 容器,默认连接到 bridge 网络

bash

docker run -dit --name alpine1 alpine

sHUiSL

2.创建 alpine2 容器,通过 container 网络模式和现有容器 alpine1 共享网络

使用--network container:<容器名>参数创建共享网络的容器:

bash

docker run -dit --network container:alpine1 --name alpine2 alpine

9aAXZG

3.验证两个容器的状态是否正常

roe6IS

4.进入 alpine2 的 ash 终端,并验证是否可以访问网络

bash

docker exec -it alpine2 ash

bash

ping -c 3 baidu.com
  • -c 指定次数

N8Np3h

5.比较网络配置

bash

ifconfig

ifconfig 命令用来查看网卡信息

退出 alpine2

bash

exit

进入 alpine1 并查看网络信息

bash

docker exec -it alpine1 ash
ifconfig

对比两个容器的网络配置,可以看到它们的网卡MAC地址、IP地址等网络信息完全一致。这证明它们确实共享同一个网络命名空间。

alpine1和alpine2的拓扑图

在container网络模式下,第二个容器不会创建自己的网络接口,而是共享第一个容器的网络栈。这意味着:

  • 两个容器共享同一个IP地址
  • 它们共享同一套端口空间(不能使用相同的端口)
  • 它们之间可以通过 localhost 互相访问
  • 它们共享同一个路由表和防火墙规则
技巧

Container网络模式特别适用于以下场景:

  1. 需要容器间高效通信的应用组件
  2. 监控或调试容器网络
  3. 需要共享网络但保持其他资源隔离的场景

Host 网络模式让容器直接使用宿主机的网络命名空间,没有网络隔离。容器可以直接使用主机的网络接口,无需端口映射。

1.以 mysite 镜像运行容器,并指定 –network 为 host

bash

docker run -d --name mysite --network host  harbor.seahi.me/stu/mysite:v0.2

2.访问网站

在浏览器中访问验证:

Gt7B6T

3.运行使用host网络的httpd容器

bash

docker run -d --name httpd --network host  httpd

查看是否运行成功,为什么?

思考:

刚才使用的命令

bash

docker run -d --name httpd --network host  httpd

与下面的命令,效果一样的么?

bash

docker run -d --name httpd2 -p 80:80  httpd
docker run -d --name httpd3 -P  httpd

三种方式的区别
  1. –network host
    • 容器直接使用主机网络
    • 没有网络隔离
    • 不需要端口映射
    • 性能最好(没有NAT开销)
    • 安全性较低(容器可以访问主机所有网络接口)
  2. -p 80:80
    • 容器使用独立的网络命名空间
    • 通过端口映射将容器端口暴露给主机
    • 明确指定主机端口和容器端口的映射关系
    • 如果主机端口已被占用,容器将无法启动
  3. -P
    • 容器使用独立的网络命名空间
    • Docker自动分配主机上的随机高位端口映射到容器暴露的端口
    • 适合不关心具体端口号的场景
    • 避免端口冲突

在上一实验中,我们发现连接到默认bridge网络的容器无法通过容器名互相访问。这是因为默认的bridge网络不支持容器名称的DNS解析,而自定义的桥接网络则支持这一功能。

Docker提供了一种传统的解决方案:使用--link参数在容器间建立连接,实现容器名解析。

text

--link <容器名:容器别名>

1.先启动3号容器

首先,创建一个名为alpine3的容器:

bash

docker run -dit --name alpine3 alpine

2.启动4号容器并连接到3号容器

使用--link参数将4号容器链接到3号容器:

bash

docker run -dit --link alpine3:alp --name alpine4 alpine

这个命令创建了一个名为alpine4的容器,并将它链接到alpine3容器,链接别名为"alp"。

3.进入4号容器验证

进入alpine4容器,尝试通过别名和原名ping alpine3:

bash

docker exec -it alpine4 ash
ping -c 3 alp

bash

ping -c 3 alpine3

可以看到,alpine4容器既可以通过别名"alp"也可以通过原名"alpine3"访问第一个容器。

4.退出4号容器

bash

exit

5.进入3号容器验证

bash

docker exec -it alpine3 ash
ping alpine4

如上图所示,alpine3无法通过容器名访问alpine4。这说明--link参数创建的连接是单向的

警告
--link参数已被Docker官方标记为遗留功能,不推荐在新项目中使用。推荐使用自定义网络来实现容器间的名称解析。

Docker提供了多种网络模式,以满足不同的应用场景需求:

  • 容器拥有独立的网络命名空间
  • 通过虚拟网桥连接到主机网络
  • 需要端口映射才能从外部访问容器服务
  • 默认bridge网络不支持容器名解析
  • 自定义bridge网络支持容器名解析和更好的隔离性
  • 容器共享主机的网络命名空间
  • 没有网络隔离
  • 直接使用主机的网络接口和端口
  • 性能最好(没有NAT开销)
  • 可能导致端口冲突
  • 安全性较低
  • 容器共享另一个容器的网络命名空间
  • 共享IP地址、端口空间和网络配置
  • 容器间可通过localhost通信
  • 适用于紧密耦合的应用组件
  • 容器有自己的网络命名空间
  • 没有网络接口(除了loopback)
  • 完全隔离的网络环境
  • 适用于不需要网络的场景或自定义网络设置

在选择Docker网络模式时,可以参考以下指南:

  1. 使用自定义bridge网络
    • 适用于大多数容器应用
    • 提供良好的隔离性和容器名解析
  2. 使用host网络模式的场景
    • 需要最佳网络性能的应用
    • 网络密集型应用
    • 需要使用主机特定网络功能的应用
    • 单机部署且不关心网络隔离的场景
  3. 使用container网络模式的场景
    • 需要共享网络但保持其他资源隔离的应用组件
    • 辅助容器(如监控、日志收集)
    • 微服务架构中紧密耦合的服务
  4. 使用none网络模式的场景
    • 批处理任务
    • 不需要网络的计算任务
    • 需要完全自定义网络配置的场景

相关内容