容器网络配置------从互联到自定义桥接
🎯 系列介绍
🔔 本文是 《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) 没有关系
✅ 正确理解(容器 ↔ 容器)
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,通过虚拟交换机互联
-
创建容器
--network:指定网络模式,默认为bridgebash[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网络, 实现容器间稳定通讯bash[root@hadoop108 ~]# docker network inspect bridge
-
网络测试
bash[root@hadoop108 ~]# docker exec -it hadoop102 /bin/bashbash# 容器 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
-
创建容器
bash[root@hadoop108 ~]# docker run -it -h hadoop104 --name hadoop104 --network host -d centos-jdk-ssh:1.0 /bin/bash -
查看 host 网络
和宿主机公用
bash[root@hadoop108 ~]# docker network inspect host
-
网络测试
bash[root@hadoop108 ~]# docker exec -it hadoop104 /bin/bashbash# 容器 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 <网络模式> <网络名称>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 -
创建容器
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 -
查看 自定义 网络
bash[root@hadoop108 ~]# docker network inspect lmc
-
网络测试
bash[root@hadoop108 ~]# docker exec -it hadoop102 /bin/bashbash[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 和网关,适合实验或小规模网络自定义。
-
在线
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/
-
安装 bridge-utils
作用:Linux 上的桥接工具,用于创建和管理桥接接口(bridge)。
主要命令:
brctl addbr br0:创建桥接brctl addif br0 eth0:把物理网卡加入桥brctl show:查看桥接状态
场景:
- 宿主机希望把物理网卡和虚拟机/容器桥接
- 建立局域网平级通信
bash[root@hadoop108 ~]# yum install -y bridge-utils -
查看宿主机信息
eth0:192.168.2.108GATEWAY:192.168.2.2DNS:114.114.114.114bash[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表示出站数据包从桥接口出去。
- 添加默认路由,通过网关
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 -
查看网络
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 ... -
创建容器
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 -
给容器添加 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 -
网络测试
bash[root@hadoop108 ~]# docker exec -it hadoop102 /bin/bashbash# 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
效果:
容器 ≈ 局域网中的一台物理主机