欢迎光临
我们一直在努力

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

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

  • 一:互相访问
    • 1)bridge
    • 2)host
  • 二:自定义 bridge 网络
  • 三:网络搭建
  • 总结

🎯 系列介绍

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

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

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


📚 系列篇章总览

  • 第一章:初识Docker——概念与优势 核心: 理解Docker是什么,它与传统虚拟机的本质区别,以及为何要使用容器化技术。

  • 第二章:环境准备与Docker安装 核心: 掌握在CentOS系统上搭建Docker运行环境,从操作系统准备到Docker CE的安装、配置与优化。

  • 第三章:Docker基础操作——镜像与容器管理 核心: 理解Docker是什么,它与传统虚拟机的本质区别,以及为何要使用容器化技术。

  • 第四章:深入Docker架构——C/S模式解析 核心: 理解Docker客户端与守护进程如何协同工作,这是掌握Docker运行原理和高级管理(如远程连接)的基础

  • 第五章:自定义镜像制作——从Dockerfile到镜像 核心: 掌握制作自定义镜像的四种方式,重点学习使用Dockerfile进行标准化、可复用的镜像构建。

  • 第六章:数据持久化——Volume与Bind Mount 核心:解决容器内数据易失性问题,学习如何通过Volume和绑定挂载实现数据的持久化存储与跨容器共享。

  • 第七章:容器网络配置——从互联到自定义桥接 核心: 掌握容器间的通信方式,学习默认Bridge、Host网络,并最终通过自定义网络和Pipework实现容器与宿主机网络的无缝集成。


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

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

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


一:互相访问

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

✅ 正确理解(容器 ↔ 容器)

容器B ──> 容器A:8888

  • 走的是 容器网络

  • 不经过宿主机

  • 不需要 -p

❌ 错误理解(新手常犯)

容器B → 宿主机:8888 → 容器A

模式有没有自己 IP容器互联是否常用一句话定位
bridge ⭐⭐⭐⭐⭐ 标准容器网络
host 直接用宿主 ⭐⭐⭐ 高性能
none 完全隔离

查看 docker 网络

[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,通过虚拟交换机互联

  • 创建容器

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

    [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

  • 查看 bridge 网络

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

    [root@hadoop108 ~]# docker network inspect bridge

    在这里插入图片描述

  • 网络测试

    [root@hadoop108 ~]# docker exec -it hadoop102 /bin/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

  • 创建容器

    [root@hadoop108 ~]# docker run -it -h hadoop104 –name hadoop104 –network host -d centos-jdk-ssh:1.0 /bin/bash

  • 查看 host 网络

    和宿主机公用

    [root@hadoop108 ~]# docker network inspect host

    在这里插入图片描述

  • 网络测试

    [root@hadoop108 ~]# docker exec -it hadoop104 /bin/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 个硬伤

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

  • 创建自定义网络

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

    [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

  • 创建容器

    [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

  • 查看 自定义 网络

    [root@hadoop108 ~]# docker network inspect lmc

    在这里插入图片描述

  • 网络测试

    [root@hadoop108 ~]# docker exec -it hadoop102 /bin/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。
  • 安装 pipwork

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

    场景:

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

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

    • 在线

      # 安装 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/

    • 离线

      # 上传离线包
      [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/

  • 安装 bridge-utils

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

    主要命令:

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

    场景:

    • 宿主机希望把物理网卡和虚拟机/容器桥接
    • 建立局域网平级通信

    [root@hadoop108 ~]# yum install -y bridge-utils

  • 查看宿主机信息

    eth0:192.168.2.108

    GATEWAY:192.168.2.2

    DNS:114.114.114.114

    [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
    ...

  • 在宿主机上实现桥接网络

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

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

  • 查看网络

    [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
    ...

  • 创建容器

    [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

  • 给容器添加 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 默认网关(通常是局域网路由器或宿主机的网关)

    [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

  • 网络测试

    [root@hadoop108 ~]# docker exec -it hadoop102 /bin/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
    • 被局域网其他主机直接访问
    • 多网卡、多网段规划

    实现步骤:

  • 宿主机创建 br0
  • 物理网卡加入桥
  • 使用 Pipework 为容器分配局域网 IP
  • 效果:

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

    赞(0)
    未经允许不得转载:171主机测评 » 容器网络配置——从互联到自定义桥接
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址