探索Docker网络配置和管理
目录
1.docker网络类型有几种?
2.自定义网络管理
1.查看网络信息
2.查看网络的详细信息
3.创建四种网络容器
3.none类型
1.验证
4.host类型
1.验证
5. bridge类型
1.验证
2.设备对
6. container类型
1.验证
2.详解
7.科普下docker的网络名称空间
“如果您在解决类似问题时也遇到了困难,希望我的经验分享对您有所帮助。如果您有任何疑问或者想分享您的经历,欢迎在评论区留言,我们可以一起探讨解决方案。祝您在编程路上顺利前行,不断突破技术的难关,感谢您的阅读!”
1.docker网络类型有几种?
-
none:
- 作用: 不为容器创建网络接口,容器内部只有本地回环接口(lo)。
- 适用场景: 对网络要求较低,容器不需要与外部或其他容器通信的场景。
- 大白话:没有网卡,只有一个本地回环网卡lo。
-
host:
- 作用: 容器与宿主机共享网络命名空间,不会创建新的网络接口。
- 优势: 最高的网络性能,容器直接使用宿主机的网络,无额外的网络地址转换。
- 风险: 容器与宿主机的网络资源可能发生冲突,尤其是端口冲突。
- 大白话:不会产生新的网络名称空间。直接使用宿主机的网络名称空间。效率极高。缺陷就是宿主机和监听端口和容器可能会存在冲突的风险。
-
bridge:
- 作用: 创建一个Linux网桥,容器连接到这个桥上,从而与宿主机的网络进行通信。
- 适用场景: 多个容器需要与宿主机和其他容器通信时,使用桥接网络最为常见。
- 大白话:桥接网卡,相当于VM的NAT网络,会产生一块新的网卡,会生成一对设备对,一端在容器里,另一端在宿主机上。
-
container:
- 作用: 与指定的已存在容器共享网络命名空间,即两个容器可以共享相同的网络配置和接口。
- 适用场景: 需要实现一些特定的网络拓扑或者容器之间需要直接通信而不经过宿主机的场景。
- 大白话:不会创建新的网卡,和指定的容器共享网络名称空间。
-
custom:
- 作用: 允许用户自定义网络配置,可以使用Docker网络插件来实现不同的网络驱动和设置。
- 适用场景: 需要更复杂的网络拓扑或者特定网络策略的场景,比如多主机通信、跨云服务的容器通信等。
- 大白话:自定义网络名称空间。
每种网络模式都有其适用的场景和特点,选择合适的网络模式可以根据容器的需求和安全性要求来决定。
2.自定义网络管理
1.查看网络信息
docker network ls
2.查看网络的详细信息
docker network inspect bridge
3.创建四种网络容器
docker run -id --name 1-none --network none alpine docker run -id --name 2-host --network host alpine docker run -id --name 3-bridge --network bridge alpine docker run -id --name 4-container --network container:3-bridge alpine
4.查看容器运行状态
docker ps -a
3.none类型
-
none:
- 作用: 不为容器创建网络接口,容器内部只有本地回环接口(lo)。
- 适用场景: 对网络要求较低,容器不需要与外部或其他容器通信的场景。
1.验证
查看容器状态
docker inspect 1-none
首先他是没有IP地址的
进入容器查看
docker exec -it 1-none sh ifconfig
4.host类型
-
host:
- 作用: 容器与宿主机共享网络命名空间,不会创建新的网络接口。
- 优势: 最高的网络性能,容器直接使用宿主机的网络,无额外的网络地址转换。
- 风险: 容器与宿主机的网络资源可能发生冲突,尤其是端口冲突。
1.验证
docker exec -it 2-host sh ifconfig
5. bridge类型
-
bridge:
- 作用: 创建一个Linux网桥,容器连接到这个桥上,从而与宿主机的网络进行通信。
- 适用场景: 多个容器需要与宿主机和其他容器通信时,使用桥接网络最为常见。
- 大白话:桥接网卡,相当于VM的NAT网络,会产生一块新的网卡,会生成一对设备对,一端在容器里,另一端在宿主机上。
1.验证
docker exec -it 3-bridge sh ifconfig
桥接网卡,相当于VM的NAT网络,会产生一块新的网卡,会生成一对设备对,一端在容器里,另一端在宿主机上。
2.设备对
宿主机产生的
容器产生的
6. container类型
-
container:
- 作用: 与指定的已存在容器共享网络命名空间,即两个容器可以共享相同的网络配置和接口。
- 适用场景: 需要实现一些特定的网络拓扑或者容器之间需要直接通信而不经过宿主机的场景。
- 大白话:不会创建新的网卡,和指定的容器共享网络名称空间。
1.验证
docker exec -it 4-container sh ifconfig
2.详解
因为他指定的是 3-的所有他们两个公用了同一个网络
7.科普下docker的网络名称空间
这些是 /proc/$$/ns 目录下的符号链接,每个符号链接代表了不同的 Linux 命名空间类型。下面解释每个的含义以及如何使用命令来查看它们:
-
cgroup (cgroup:[4026531835]):
- 含义: 控制组命名空间,用于限制和控制进程组的资源使用。
- 命令: 查看当前进程的 cgroup 命名空间:
ls -l /proc/$$/ns/cgroup
-
ipc (ipc:[4026531839]):
- 含义: 进程间通信命名空间,管理进程间通信资源如消息队列、信号量等。
- 命令: 查看当前进程的 ipc 命名空间:
ls -l /proc/$$/ns/ipc
-
mnt (mnt:[4026531840]):
- 含义: 挂载点命名空间,管理文件系统挂载点。
- 命令: 查看当前进程的挂载点命名空间:
ls -l /proc/$$/ns/mnt
-
net (net:[4026531992]):
- 含义: 网络命名空间,用于隔离网络设备、IP 地址等网络资源。
- 命令: 查看当前进程的网络命名空间:
ls -l /proc/$$/ns/net
-
pid (pid:[4026531836]):
- 含义: 进程命名空间,隔离进程 ID 号码。
- 命令: 查看当前进程的进程命名空间:
ls -l /proc/$$/ns/pid
-
pid_for_children (pid:[4026531836]):
- 含义: 为子进程指定的进程命名空间,Linux 内核版本 5.6 之后引入。
- 命令: 查看当前进程的进程命名空间(与 pid 相同):
ls -l /proc/$$/ns/pid_for_children
-
time (time:[4026531834]):
- 含义: 时间命名空间,隔离 clock_gettime 和 clock_settime 等时间操作。
- 命令: 查看当前进程的时间命名空间:
ls -l /proc/$$/ns/time
-
time_for_children (time:[4026531834]):
- 含义: 为子进程指定的时间命名空间,Linux 内核版本 5.6 之后引入。
- 命令: 查看当前进程的时间命名空间(与 time 相同):
ls -l /proc/$$/ns/time_for_children
-
user (user:[4026531837]):
- 含义: 用户命名空间,用于隔离用户 ID 和组 ID。
- 命令: 查看当前进程的用户命名空间:
ls -l /proc/$$/ns/user
-
uts (uts:[4026531838]):
- 含义: UTS 命名空间,用于隔离主机名和域名。
- 命令: 查看当前进程的 UTS 命名空间:
ls -l /proc/$$/ns/uts
每个命名空间都通过 /proc/$$/ns 目录下的符号链接表示,其中 $$ 是当前 Shell 或进程的 PID。这些命名空间用于实现 Linux 的进程隔离和资源管理,允许不同进程在各自独立的环境中运行。