Docker Compose:网络配置

12/31/2025 运维容器Docker

目录


参考:


# Docker Compose:网络配置

# 常用命令

# 创建自定义网络
docker network create -d bridge mynet    ##-d 指定模式(默认桥接)
1
2
  • docker network create:Docker 中创建新网络的子命令。
  • -d bridge:指定网络驱动类型为 bridge(桥接模式)。桥接网络是 Docker 默认的本地网络驱动,允许同一网络内的容器通过容器名称直接通信,同时与宿主机及其他外部网络隔离。
  • mynet:用户自定义的网络名称,用于标识新创建的桥接网络。
# 查看已存在的网络
docker network list
1
2

# Docker网络类型

  1. bridge(桥接网络)
    • 这是Docker安装后自动创建的默认网络驱动,所有未指定自定义网络的容器都会连接到该网络。它通过NAT机制实现容器与宿主机及外部的通信,容器间可通过内部IP地址互相访问,但需手动配置端口映射才能对外暴露服务。
  2. host(主机网络)
    • 使用该网络的容器直接共享宿主机的网络命名空间,无需端口映射即可通过宿主机IP访问。这种模式性能更高,但牺牲了网络隔离性,适用于对网络延迟敏感的场景。
  3. none(无网络)
    • 该网络完全禁用容器的网络栈,适用于需要严格隔离网络的环境(如安全测试场景)。容器仅保留本地回环接口(lo),无法与外部通信。

# 网络测试排查

netshoot (opens new window)是一款开源的容器网络诊断工具,本质上是一个容器,里面默认安装了一些常用网络诊断工具,如tcpdumpnetstat等。

# 调试某个目标容器网络

# 启动一个netshoot容器,共享目标容器的网络命令空间
docker run -it --net container:<container_name> nicolaka/netshoot
1
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

# 调试宿主机络

# 启动一个netshoot容器,共享目标宿主机网络
docker run -it --net host nicolaka/netshoot
1
2

# 通过Docker Compose方式调试

示例1:netshoot容器通过networker_mode: service:nginxnginx容器进行网络共享,实现对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

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
上次更新时间: 4/15/2025, 3:16:33 PM