容器网络配置——从互联到自定义桥接

容器网络配置------从互联到自定义桥接


🎯 系列介绍

🔔 本文是 《Docker实战入门与部署指南:从核心概念到网络与数据管理》 系列的第七篇!

本系列将从零开始,带你系统性地学习 Docker 的核心概念、安装部署、容器管理、镜像制作、数据持久化与网络配置,最终具备构建和运维容器化应用的能力。

⚠️ 该系列所有涉及的配置脚本、Dockerfile示例和离线安装包都可以私信博主免费获取。


📚 系列篇章总览


🚀 系列最终成果
当你完整学完并实操本系列,你将拥有:

✅ 扎实的Docker理论基础,清晰理解容器、镜像、仓库等核心概念。
✅ 独立部署Docker环境的能力,并完成常用配置优化(如镜像加速)。
✅ 熟练的容器与镜像管理技能,能够进行日常的运维操作。
✅ 制作自定义业务镜像的能力,为应用容器化打下基础。
✅ 解决数据持久化问题的方案,确保应用数据安全。
✅ 配置复杂容器网络的能力,实现容器内外的灵活通信。

真正实现: 概念理解 → 环境搭建 → 日常操作 → 镜像定制 → 数据管理 → 网络配置,一站式掌握Docker核心技能。


一:互相访问

容器互联访问 = 一个容器,直接访问另一个容器的 IP:端口
与端口映射 (-p) 没有关系
✅ 正确理解(容器 ↔ 容器)

bash 复制代码
容器B  ──>  容器A:8888
  • 走的是 容器网络

  • 不经过宿主机

  • 不需要 -p

❌ 错误理解(新手常犯)

bash 复制代码
容器B → 宿主机:8888 → 容器A
模式 有没有自己 IP 容器互联 是否常用 一句话定位
bridge ⭐⭐⭐⭐⭐ 标准容器网络
host 直接用宿主 ⭐⭐⭐ 高性能
none 完全隔离

查看 docker 网络

bash 复制代码
[root@hadoop108 ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
808c81d6bb9b   bridge    bridge    local
f64567e6c961   host      host      local
9ea699c170ca   none      null      local

1)bridge

每个容器有自己 IP,通过虚拟交换机互联

  1. 创建容器

    --network:指定网络模式,默认为 bridge

    bash 复制代码
    [root@hadoop108 ~]# docker run -it -h hadoop102 --name hadoop102 --network bridge -d centos-jdk-ssh:1.0 /bin/bash
    
    [root@hadoop108 ~]# docker run -it -h hadoop103 --name hadoop103 --network bridge -d centos-jdk-ssh:1.0 /bin/bash
  2. 查看 bridge 网络

    172.17.0.2 等这些ip地址不能固定, 每次启动容器的时候有可能会变化, 如果组建集群的话很不方便.可以自定义bridge网络, 实现容器间稳定通讯

    bash 复制代码
    [root@hadoop108 ~]# docker network inspect bridge 
  3. 网络测试

    bash 复制代码
    [root@hadoop108 ~]# docker exec -it hadoop102 /bin/bash
    bash 复制代码
    # 容器 Hadoop102 内
    [root@hadoop102 /]# cat /etc/hosts
    127.0.0.1       localhost
    ::1     localhost ip6-localhost ip6-loopback
    fe00::0 ip6-localnet
    ff00::0 ip6-mcastprefix
    ff02::1 ip6-allnodes
    ff02::2 ip6-allrouters
    172.17.0.2      hadoop102
    
    [root@hadoop102 /]# ping 172.17.0.3
    PING 172.17.0.3 (172.17.0.3) 56(84) bytes of data.
    64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.147 ms
    64 bytes from 172.17.0.3: icmp_seq=2 ttl=64 time=0.053 ms
    ^C
    --- 172.17.0.3 ping statistics ---
    2 packets transmitted, 2 received, 0% packet loss, time 999ms
    rtt min/avg/max/mdev = 0.053/0.100/0.147/0.047 ms
    
    [root@hadoop102 /]# ping hadoop103 
    ping: hadoop103: Name or service not known
    
    [root@hadoop102 /]# ping www.baidu.com
    PING www.a.shifen.com (36.152.44.132) 56(84) bytes of data.
    64 bytes from 36.152.44.132 (36.152.44.132): icmp_seq=1 ttl=127 time=22.9 ms
    64 bytes from 36.152.44.132 (36.152.44.132): icmp_seq=2 ttl=127 time=23.1 ms
    ^C
    --- www.a.shifen.com ping statistics ---
    3 packets transmitted, 2 received, 33% packet loss, time 2005ms
    rtt min/avg/max/mdev = 22.900/23.005/23.110/0.105 ms
    [root@hadoop102 /]# 

2)host

  1. 创建容器

    bash 复制代码
    [root@hadoop108 ~]# docker run -it -h hadoop104 --name hadoop104 --network host -d centos-jdk-ssh:1.0 /bin/bash
  2. 查看 host 网络

    和宿主机公用

    bash 复制代码
    [root@hadoop108 ~]# docker network inspect host
  3. 网络测试

    bash 复制代码
    [root@hadoop108 ~]# docker exec -it hadoop104 /bin/bash
    bash 复制代码
    # 容器 Hadoop103 内
    [root@hadoop104 /]# cat /etc/hosts
    127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
    ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
    
    192.168.2.100 hadoop100
    192.168.2.101 hadoop101
    192.168.2.102 hadoop102
    192.168.2.103 hadoop103
    192.168.2.104 hadoop104
    192.168.2.105 hadoop105
    192.168.2.106 hadoop106
    192.168.2.107 hadoop107
    192.168.2.108 hadoop108
    192.168.2.109 hadoop109
    192.168.2.110 hadoop110
    
    172.16.1.100 hp100
    172.16.1.101 hp101
    172.16.1.102 lb01
    172.16.1.103 lb02
    172.16.1.104 web01
    172.16.1.105 web02
    172.16.1.106 web03
    172.16.1.107 nfs01
    172.16.1.108 backup
    172.16.1.109 db01
    172.16.1.110 master
    
    [root@hadoop104 /]# ping hadoop109
    PING hadoop109 (192.168.2.109) 56(84) bytes of data.
    64 bytes from hadoop109 (192.168.2.109): icmp_seq=1 ttl=64 time=0.754 ms
    64 bytes from hadoop109 (192.168.2.109): icmp_seq=2 ttl=64 time=0.488 ms
    ^C
    --- hadoop109 ping statistics ---
    2 packets transmitted, 2 received, 0% packet loss, time 1002ms
    rtt min/avg/max/mdev = 0.488/0.621/0.754/0.133 ms
    
    [root@hadoop104 /]# ping 172.17.0.2
    PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
    64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.042 ms
    64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.043 ms
    64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.044 ms
    ^C
    --- 172.17.0.2 ping statistics ---
    3 packets transmitted, 3 received, 0% packet loss, time 1999ms
    rtt min/avg/max/mdev = 0.042/0.043/0.044/0.000 ms

二:自定义 bridge 网络

为什么一定要用「自定义 bridge」?

先给结论:只要涉及容器互相访问,默认 bridge 就不够用,必须用自定义 bridge
默认 bridge 的 3 个硬伤

  1. 没有 DNS
    • 容器名不能当主机名
  2. IP 不稳定
    • 容器重启 IP 会变
  3. 没有隔离
    • 所有容器全互通
      一个网络 = 一个独立子网 + 内置 DNS + 网络隔离
  1. 创建自定义网络

    docker network create --driver/-d <网络模式> <网络名称>

    bash 复制代码
    [root@hadoop108 ~]# docker network create --driver bridge lmc
    
    [root@hadoop108 ~]# docker network ls
    NETWORK ID     NAME      DRIVER    SCOPE
    808c81d6bb9b   bridge    bridge    local
    f64567e6c961   host      host      local
    8da42e727662   lmc       bridge    local
    9ea699c170ca   none      null      local
  2. 创建容器

    bash 复制代码
    [root@hadoop108 ~]# docker run -it -h hadoop102-lmc --name hadoop102 --network lmc -d centos-jdk-ssh:1.0 /bin/bash
    
    [root@hadoop108 ~]# docker run -it -h hadoop103-lmc --name hadoop103 --network lmc -d centos-jdk-ssh:1.0 /bin/bash
  3. 查看 自定义 网络

    bash 复制代码
    [root@hadoop108 ~]# docker network inspect lmc
  4. 网络测试

    bash 复制代码
    [root@hadoop108 ~]# docker exec -it hadoop102 /bin/bash
    bash 复制代码
    [root@hadoop102-lmc /]# cat /etc/hosts
    127.0.0.1       localhost
    ::1     localhost ip6-localhost ip6-loopback
    fe00::0 ip6-localnet
    ff00::0 ip6-mcastprefix
    ff02::1 ip6-allnodes
    ff02::2 ip6-allrouters
    172.18.0.2      hadoop102-lmc
    
    [root@hadoop102-lmc /]# ping hadoop103-lmc
    PING hadoop103-lmc (172.18.0.3) 56(84) bytes of data.
    64 bytes from hadoop103.lmc (172.18.0.3): icmp_seq=1 ttl=64 time=0.060 ms
    64 bytes from hadoop103.lmc (172.18.0.3): icmp_seq=2 ttl=64 time=0.090 ms
    ^C
    --- hadoop103-lmc ping statistics ---
    2 packets transmitted, 2 received, 0% packet loss, time 1001ms
    rtt min/avg/max/mdev = 0.060/0.075/0.090/0.015 ms
    
    [root@hadoop102-lmc /]# ping 172.18.0.3   
    PING 172.18.0.3 (172.18.0.3) 56(84) bytes of data.
    64 bytes from 172.18.0.3: icmp_seq=1 ttl=64 time=0.046 ms
    64 bytes from 172.18.0.3: icmp_seq=2 ttl=64 time=0.053 ms
    ^C
    --- 172.18.0.3 ping statistics ---
    2 packets transmitted, 2 received, 0% packet loss, time 1002ms
    rtt min/avg/max/mdev = 0.046/0.049/0.053/0.007 ms
    
    [root@hadoop102-lmc /]# ping 192.168.2.108
    PING 192.168.2.108 (192.168.2.108) 56(84) bytes of data.
    64 bytes from 192.168.2.108: icmp_seq=1 ttl=64 time=0.086 ms
    64 bytes from 192.168.2.108: icmp_seq=2 ttl=64 time=0.067 ms
    ^C
    --- 192.168.2.108 ping statistics ---
    2 packets transmitted, 2 received, 0% packet loss, time 1000ms
    rtt min/avg/max/mdev = 0.067/0.076/0.086/0.012 ms

三:网络搭建

默认 Docker 或虚拟机网络使用 NAT/私有网段,容器/虚拟机无法像物理机一样直接在局域网通信,而桥接模式配合 Pipework 可以让它们获得局域网平级 IP,实现与其他主机自由通信和多网段自定义网络需求。

解决方案

  • 桥接模式:让容器/虚拟机像物理机一样直接上局域网。
  • Pipework:弥补 Docker 或 VM 默认网络的不足,手动添加桥接接口和自定义 IP。
  1. 安装 pipwork

    作用:给 Docker 容器或虚拟机添加自定义网络接口,并把它桥接到宿主机的网卡或桥上。

    场景

    • 容器需要固定局域网 IP
    • 多网卡或多网段
    • Docker 默认桥接网络不够灵活

    特点:操作简单,按容器/虚拟机手动分配 IP 和网关,适合实验或小规模网络自定义。

    • 在线

      bash 复制代码
      # 安装 git
      [root@hadoop108 software]# yum install -y git
      
      # 安装 pipework
      [root@hadoop108 software]# git clone \
      https://github.com/jpetazzo/pipework.git
      
      # 把 pipwork加到 path 中
      [root@hadoop108 software]# cp pipework/pipework /usr/local/bin/
    • 离线

      bash 复制代码
      # 上传离线包
      [root@hadoop108 software]# rz
      pipework.tar.gz
      
      # 解压
      [root@hadoop108 software]# tar -xzvf pipework.tar.gz
      
      # 把 pipwork加到 path 中
      [root@hadoop108 software]# cp pipework/pipework /usr/local/bin/
  2. 安装 bridge-utils

    作用:Linux 上的桥接工具,用于创建和管理桥接接口(bridge)。

    主要命令

    • brctl addbr br0:创建桥接
    • brctl addif br0 eth0:把物理网卡加入桥
    • brctl show:查看桥接状态

    场景

    • 宿主机希望把物理网卡和虚拟机/容器桥接
    • 建立局域网平级通信
    bash 复制代码
    [root@hadoop108 ~]# yum install -y bridge-utils
  3. 查看宿主机信息

    eth0:192.168.2.108

    GATEWAY:192.168.2.2

    DNS:114.114.114.114

    bash 复制代码
    [root@hadoop108 ~]# ifconfig
    ...
    eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 192.168.2.108  netmask 255.255.255.0  broadcast 192.168.2.255
            inet6 fe80::dbaa:44d4:9bf1:369a  prefixlen 64  scopeid 0x20<link>
            ether 00:0c:29:12:f8:66  txqueuelen 1000  (Ethernet)
            RX packets 361  bytes 35522 (34.6 KiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 435  bytes 90229 (88.1 KiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    ...
  4. 在宿主机上实现桥接网络

    把宿主机的物理网卡 eth0 放到桥 br0 上,并把原来的 IP 转移到桥上,让虚拟机或容器可以通过 br0 桥接到局域网,同时宿主机(虚拟机hadoop108)保持原 IP 上网。

    1. brctl addbr br0
      • 创建一个新的桥接接口 br0
      • 桥接接口就像一个虚拟交换机,可以把宿主机网卡和容器/虚拟机的网卡连在一起,实现同一局域网通信。
    2. ip link set dev br0 up
      • 激活桥接接口 br0,让它可以发送和接收数据包。
    3. ip addr del 192.168.2.108/24 dev eth0
      • 从物理网卡 eth0 上删除原来的 IP 地址。
      • 原因:网卡加入桥接后,IP 应该配置在桥接接口上,而不是物理网卡上,否则无法桥接生效。
    4. ip addr add 192.168.2.108/24 dev br0
      • 给桥接接口 br0 分配原来的 IP 地址。
      • 这样宿主机仍然可以使用原来的 IP 对外通信,但现在是通过桥 br0
    5. brctl addif br0 eth0
      • 把物理网卡 eth0 加入到桥 br0
      • 物理网卡实际上成为桥的一部分,桥转发数据包到 eth0。
      • 这样任何连接到 br0 的虚拟机/容器都会和局域网平级通信。
    6. ip route add default via 192.168.2.2 dev br0
      • 添加默认路由,通过网关 192.168.2.2 访问外网。
      • 指定 dev br0 表示出站数据包从桥接口出去。
    bash 复制代码
    [root@hadoop108 software]# brctl addbr br0; \
    ip link set dev br0 up; \
    ip addr del 192.168.2.108/24 dev eth0; \
    ip addr add 192.168.2.108/24 dev br0; \
    brctl addif br0 eth0; \
    ip route add default via 192.168.2.2 dev br0
  5. 查看网络

    bash 复制代码
    [root@hadoop108 ~]# ifconfig
    ...
    br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 192.168.2.108  netmask 255.255.255.0  broadcast 0.0.0.0
            inet6 fe80::f441:27ff:fe88:7d11  prefixlen 64  scopeid 0x20<link>
            ether 00:0c:29:12:f8:66  txqueuelen 1000  (Ethernet)
            RX packets 98  bytes 7832 (7.6 KiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 120  bytes 15976 (15.6 KiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    
    eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet6 fe80::dbaa:44d4:9bf1:369a  prefixlen 64  scopeid 0x20<link>
            ether 00:0c:29:12:f8:66  txqueuelen 1000  (Ethernet)
            RX packets 8359  bytes 729742 (712.6 KiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 9687  bytes 1346970 (1.2 MiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    ...
  6. 创建容器

    bash 复制代码
    [root@hadoop108 ~]# docker run -h hadoop102 --name hadoop102 -d centos-jdk-ssh:1.0
    [root@hadoop108 ~]# docker run -h hadoop103 --name hadoop103 -d centos-jdk-ssh:1.0
    [root@hadoop108 ~]# docker run -h hadoop104 --name hadoop104 -d centos-jdk-ssh:1.0
  7. 给容器添加 IP

    在容器 hadoop102 内创建一个新的虚拟网卡(通常叫 eth1),桥接到宿主机的 br0,并分配静态 IP 192.168.2.102,默认网关为 192.168.2.2。

    容器就像局域网中的一台物理机一样,可以直接和其他宿主机、虚拟机通信。

    部分 含义
    pipework 工具本身,用来给 Docker 容器或虚拟机添加自定义网络接口
    br0 宿主机上的桥接接口(之前我们创建的 br0),容器网卡会挂到这个桥上
    hadoop10x 目标容器或虚拟机的名字或 ID,Pipework 会在里面添加网卡
    192.168.2.10x/24 分配给容器的静态 IP 和掩码(同局域网网段)
    @192.168.2.2 默认网关(通常是局域网路由器或宿主机的网关)
    bash 复制代码
    [root@hadoop108 ~]# pipework br0 hadoop102 192.168.2.102/24@192.168.2.2
    [root@hadoop108 ~]# pipework br0 hadoop103 192.168.2.103/24@192.168.2.2
    [root@hadoop108 ~]# pipework br0 hadoop104 192.168.2.104/24@192.168.2.2
  8. 网络测试

    bash 复制代码
    [root@hadoop108 ~]# docker exec -it hadoop102 /bin/bash
    bash 复制代码
    # PING Hadoop103
    [root@hadoop102 /]# ping 192.168.2.103
    PING 192.168.2.103 (192.168.2.103) 56(84) bytes of data.
    64 bytes from 192.168.2.103: icmp_seq=1 ttl=64 time=0.136 ms
    64 bytes from 192.168.2.103: icmp_seq=2 ttl=64 time=0.053 ms
    ^C
    --- 192.168.2.103 ping statistics ---
    2 packets transmitted, 2 received, 0% packet loss, time 1002ms
    rtt min/avg/max/mdev = 0.053/0.094/0.136/0.042 ms
    
    # PING Hadoop104
    [root@hadoop102 /]# ping 192.168.2.104
    PING 192.168.2.104 (192.168.2.104) 56(84) bytes of data.
    64 bytes from 192.168.2.104: icmp_seq=1 ttl=64 time=0.122 ms
    64 bytes from 192.168.2.104: icmp_seq=2 ttl=64 time=0.057 ms
    ^C
    --- 192.168.2.104 ping statistics ---
    2 packets transmitted, 2 received, 0% packet loss, time 1001ms
    rtt min/avg/max/mdev = 0.057/0.089/0.122/0.033 ms
    
    # PING 宿主机
    [root@hadoop102 /]# ping 192.168.2.108
    PING 192.168.2.108 (192.168.2.108) 56(84) bytes of data.
    64 bytes from 192.168.2.108: icmp_seq=1 ttl=64 time=0.043 ms
    64 bytes from 192.168.2.108: icmp_seq=2 ttl=64 time=0.055 ms
    ^C
    --- 192.168.2.108 ping statistics ---
    2 packets transmitted, 2 received, 0% packet loss, time 1002ms
    rtt min/avg/max/mdev = 0.043/0.049/0.055/0.006 ms
    
    # PING Windows
    [root@hadoop102 /]# ping 192.168.2.1  
    PING 192.168.2.1 (192.168.2.1) 56(84) bytes of data.
    64 bytes from 192.168.2.1: icmp_seq=1 ttl=128 time=0.491 ms
    64 bytes from 192.168.2.1: icmp_seq=2 ttl=128 time=0.363 ms
    ^C
    --- 192.168.2.1 ping statistics ---
    2 packets transmitted, 2 received, 0% packet loss, time 1000ms
    rtt min/avg/max/mdev = 0.363/0.427/0.491/0.064 ms

总结

三种基础网络模式

模式 特点 适用场景
bridge(默认) 独立 IP,NAT 转发 常规容器通信
host 无独立 IP,共用宿主机网络 高性能场景
none 无网络 完全隔离测试

容器互访走的是容器网络,与 -p 端口映射无关。


为什么必须使用自定义 bridge?

默认 bridge 的问题

  • ❌ 无 DNS(不能使用容器名访问)
  • ❌ IP 不固定(重启可能变化)
  • ❌ 无网络隔离(所有容器互通)

自定义 bridge 的优势

  • ✅ 自动 DNS 解析(容器名直连)
  • ✅ 独立子网
  • ✅ 网络隔离
  • ✅ 适合集群部署

👉 结论:涉及多容器通信,推荐使用自定义 bridge。


桥接 + Pipework 的作用

适用于:

  • 容器需要局域网真实 IP
  • 被局域网其他主机直接访问
  • 多网卡、多网段规划

实现步骤:

  1. 宿主机创建 br0
  2. 物理网卡加入桥
  3. 使用 Pipework 为容器分配局域网 IP

效果:

容器 ≈ 局域网中的一台物理主机

相关推荐
珠穆峰2 小时前
linux find 命令使用
linux·运维·服务器
没有bug.的程序员2 小时前
服务网格(Istio)与传统微服务深度对垒:流量治理内核、代码侵入性博弈与运维收益实战指南
java·运维·微服务·istio·流量治理内核·代码侵入性
是Dream呀3 小时前
自动化打造信息影响力:用 Web Unlocker 和 n8n 打造你的自动化资讯系统
运维·前端·爬虫·自动化
蜜汁小强3 小时前
为 Github 创建本地 .ssh 关联 (RSA 以支持老系统)
运维·ssh·github
中草药z3 小时前
【Linux】拆解 Linux 容器化核心:Namespace 隔离 + cgroups 资源控制,附 LXC 容器生命周期实战
运维·docker·容器·虚拟化·namespace·lxc·cgroups
草莓熊Lotso3 小时前
Linux 程序地址空间深度解析:虚拟地址背后的真相
java·linux·运维·服务器·开发语言·c++·人工智能
猫头虎3 小时前
【汉化中文版】OpenClaw(Clawdbot/Moltbot)第三方开源汉化中文发行版部署全指南:一键脚本/Docker/npm 三模式安装+Ubuntu 环境配置+中文汉化界面适配开源版
docker·npm·开源·aigc·ai编程·远程工作·openclaw
Jinkxs3 小时前
【Linux】零基础入门:一篇吃透操作系统核心概念
linux·运维·服务器·网络·操作系统