Docker Compose:网络配置
accttodo 12/31/2025 运维容器Docker
目录
参考:
- docker Compose-网络设置 (opens new window)
- Docker Compose网络系列--网络的配置 (opens new window)
- Docker Compose网络配置完全指南 (opens new window)
- 容器诊断工具之netshoot (opens new window)
# Docker Compose:网络配置
# 常用命令
# 创建自定义网络
docker network create -d bridge mynet ##-d 指定模式(默认桥接)
1
2
2
docker network create
:Docker 中创建新网络的子命令。-d bridge
:指定网络驱动类型为bridge
(桥接模式)。桥接网络是 Docker 默认的本地网络驱动,允许同一网络内的容器通过容器名称直接通信,同时与宿主机及其他外部网络隔离。mynet
:用户自定义的网络名称,用于标识新创建的桥接网络。
# 查看已存在的网络
docker network list
1
2
2
# Docker网络类型
- bridge(桥接网络)
- 这是Docker安装后自动创建的默认网络驱动,所有未指定自定义网络的容器都会连接到该网络。它通过NAT机制实现容器与宿主机及外部的通信,容器间可通过内部IP地址互相访问,但需手动配置端口映射才能对外暴露服务。
- host(主机网络)
- 使用该网络的容器直接共享宿主机的网络命名空间,无需端口映射即可通过宿主机IP访问。这种模式性能更高,但牺牲了网络隔离性,适用于对网络延迟敏感的场景。
- none(无网络)
- 该网络完全禁用容器的网络栈,适用于需要严格隔离网络的环境(如安全测试场景)。容器仅保留本地回环接口(
lo
),无法与外部通信。
- 该网络完全禁用容器的网络栈,适用于需要严格隔离网络的环境(如安全测试场景)。容器仅保留本地回环接口(
# 网络测试排查
netshoot (opens new window)是一款开源的容器网络诊断工具,本质上是一个容器,里面默认安装了一些常用网络诊断工具,如tcpdump
、netstat
等。
# 调试某个目标容器网络
# 启动一个netshoot容器,共享目标容器的网络命令空间
docker run -it --net container:<container_name> nicolaka/netshoot
1
2
2
该命令用于诊断目标容器的网络,其核心是通过共享目标容器的网络命名空间,实现对目标容器网络环境的直接调试。
-it
:使容器以交互模式运行,用户可直接通过终端与容器内的 Shell 交互。--net container:<container_name>
:指定容器共享目标容器<container_name>
的网络命名空间。这意味着:- 新容器与目标容器使用相同的网络接口、IP 地址、端口等配置;
- 两者可通过
localhost
直接通信,无需通过外部网络暴露端口。
nicolaka/netshoot
:netshoot镜像。
示例操作
调试名为 web-server
的目标容器:
docker run -it --net container:web-server nicolaka/netshoot
1
进入容器后,可直接执行:
curl http://localhost:80 # 测试访问目标容器内端口为80服务
netstat -tulpn # 查看端口监听状态
tcpdump -i eth0 port 80 # 抓取80端口的流量
1
2
3
2
3
# 调试宿主机络
# 启动一个netshoot容器,共享目标宿主机网络
docker run -it --net host nicolaka/netshoot
1
2
2
# 通过Docker Compose方式调试
示例1:netshoot
容器通过networker_mode: service:nginx
与nginx
容器进行网络共享,实现对nginx容器的网络抓包(tcpdump)。
services:
# netshoot服务
netshoot:
container_name: netshoot_nginx
image: nicolaka/netshoot
# 依赖nginx容器启动
depends_on:
- nginx
# 启动时自动执行抓包命令
command: "tcpdump -i eth0 -w /data/nginx.pcap"
# 共享nginx容器的网络命令空间
network_mode: "service:nginx"
# 将宿主机当前目录下的data目录挂载到容器内/data路径,实现抓包结果的持久化存储
volumes:
- $PWD/data:/data
# nginx服务
nginx:
image: nginx:alpine
ports:
- "80:80"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
tcpdump -i eth0 -w /data/nginx.pcap
抓包命令:
-i eth0
:监听eth0网卡-w /data/nginx.pcap
:将抓包结果保存到容器内/data目录。
示例2:通过保活进程+宿主网络特权的组合,构建一个高效的实时网络诊断环境。
services:
# netshoot服务
netshoot:
container_name: netshoot_host
image: nicolaka/netshoot
# 启动无限休眠进程作为主进程,阻止容器因无活跃进程而自动退出
command: "sleep infinity"
# 共享宿主机网络命令空间
network_mode: "host"
# 资源限制
deploy:
resources:
limits:
cpus: "0.5"
memory: 50M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15