【Docker】Docker的原生网络介绍

前情提要:本篇博客将详细介绍docker的原生四种网络:bridge,host,none,container(joined)的原理和示例,通过本篇博客你可以学会这些网络的原理和相关的配置

一、原生网络简介

docker的镜像是令人称道的地方,但网络功能还是相对薄弱的部分

docker安装后会自动创建3种网络:bridge、host、none

cpp 复制代码
# 使用以下命令查看
[root@docker harbor]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
2a93d6859680   bridge    bridge    local
4d81ddd9ed10   host      host      local
8c8c95f16b68   none      null      local

Docker提供了5种主要网络模式,每种模式适用于不同的场景

网络模式 隔离级别 端口映射 与宿主机关系 适用场景
Bridge 支持 通过网桥通信 默认模式,单机容器通信
Host 不需要 共享宿主机网络 高性能需求场景
None 最高 不支持 完全隔离 安全隔离场景
Container 继承 共享另一容器网络 特殊协作场景
Overlay 支持 跨主机通信 多主机/集群环境

二、Docker原生bridge网络

原理:

  • Docker 服务默认创建 `docker0` 网桥
  • 每个容器启动时会创建一对虚拟网卡(veth pair)
  • 一端在容器内,另一端连接到 docker0 网桥
  • 容器通过 NAT 访问外部网络

特点

  • 容器间可通过 IP 直接通信
  • 支持端口映射(-p 参数)
  • 网络隔离性好
  • 默认不支持容器名解析(需自定义网络)

docker安装时会创建一个名为 docker0 的Linux bridge,新建的容器会自动桥接到这个接口

cpp 复制代码
[root@docker mnt]# ip link show type bridge
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default
    link/ether 02:42:5f:e2:34:6c brd ff:ff:ff:ff:ff:ff
  • bridge模式下容器没有一个公有ip,只有宿主机可以直接访问,外部主机是不可见的。

  • 容器通过宿主机的NAT规则后可以访问外网

示例

cpp 复制代码
# 运行容器
[root@docker-node2 ~]# docker run -d --name web -p 80:80 nginx:1.26

[root@docker-node2 ~]# docker ps -a
CONTAINER ID   IMAGE        COMMAND                   CREATED         STATUS         PORTS                                 NAMES
61fe1dfcd025   nginx:1.26   "/docker-entrypoint...."   2 seconds ago   Up 2 seconds   0.0.0.0:80->80/tcp, [::]:80->80/tcp   web
[root@docker-node2 ~]# ifconfig 
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        inet6 fe80::6484:9eff:fe23:5fa3  prefixlen 64  scopeid 0x20<link>
        ether 66:84:9e:23:5f:a3  txqueuelen 0  (Ethernet)
        RX packets 44  bytes 13164 (12.8 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 48  bytes 11845 (11.5 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.25.254.20  netmask 255.255.255.0  broadcast 172.25.254.255
        inet6 fe80::2360:d7ac:9af2:bb39  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:b7:c0:af  txqueuelen 1000  (Ethernet)
        RX packets 2505  bytes 232739 (227.2 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1953  bytes 232250 (226.8 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

veth3e65a2f: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500		# 这个是容器使用的网卡
        inet6 fe80::e490:e0ff:fe9e:13c2  prefixlen 64  scopeid 0x20<link>
        ether e6:90:e0:9e:13:c2  txqueuelen 0  (Ethernet)
        RX packets 3  bytes 126 (126.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 9  bytes 806 (806.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
cpp 复制代码
[root@docker-node2 ~]# brctl show		# 需要下载bridge-utils
bridge name	bridge id		STP enabled	interfaces
docker0		8000.66849e235fa3	no		veth3e65a2f

三、Docker原生host网络

原理

  • 容器直接使用宿主机的网络命名空间

  • 不创建虚拟网卡,无网络隔离

特点

  • 网络性能最优(无NAT开销)

  • 无需端口映射

  • 无网络隔离,端口可能冲突

  • Linux 专属(Mac/Windows不支持)

host网络模式需要在容器创建时指定 --network=host

host模式可以让容器共享宿主机网络栈,这样的好处是外部主机与容器直接通信,但是容器的网络缺少隔离性

示例

cpp 复制代码
# 运行busybox
# 如果公用一个网络,那么所有的网络资源都是公用的,比如启动了nginx容器那么真实主机的80端口被占用,在启动第二个nginx容器就会失败
[root@docker-node2 ~]# docker run -it --name test --network host busybox:latest

/ # ifconfig 
docker0   Link encap:Ethernet  HWaddr 66:84:9E:23:5F:A3  
          inet addr:172.17.0.1  Bcast:172.17.255.255  Mask:255.255.0.0
          inet6 addr: fe80::6484:9eff:fe23:5fa3/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:61 errors:0 dropped:0 overruns:0 frame:0
          TX packets:66 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:15041 (14.6 KiB)  TX bytes:13579 (13.2 KiB)

eth0      Link encap:Ethernet  HWaddr 00:0C:29:B7:C0:AF  
          inet addr:172.25.254.20  Bcast:172.25.254.255  Mask:255.255.255.0
          inet6 addr: fe80::2360:d7ac:9af2:bb39/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:2999 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2284 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:312084 (304.7 KiB)  TX bytes:270654 (264.3 KiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

veth3e65a2f Link encap:Ethernet  HWaddr E6:90:E0:9E:13:C2  
          inet6 addr: fe80::e490:e0ff:fe9e:13c2/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:20 errors:0 dropped:0 overruns:0 frame:0
          TX packets:33 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:2241 (2.1 KiB)  TX bytes:2960 (2.8 KiB)

四、Docker原生none网络

原理:

  • 容器拥有独立的 Network Namespace

  • 但不配置任何网络接口(只有lo回环)

特点

  • 最高安全隔离

  • 可手动配置网络

  • 无法访问外部网络(需手动配置)

none模式是指禁用网络功能,只有lo接口,在容器创建时使用 --network=none指定。

示例

cpp 复制代码
[root@docker ~]# docker run -it --name test --rm --network none  busybox
/ # ifconfig
lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

五、Docker原生网络Container(Joined)模式

原理

  • 新容器共享已存在容器的网络命名空间

  • 两个容器使用相同的网络接口和IP

特点

  • 容器间通信通过localhost

  • 适合Sidecar模式(如服务网格)

  • 依赖主容器生命周期

Joined容器一种较为特别的网络模式,在容器创建时使用--network=container:vm1指定。(vm1指定的是运行的容器名)

处于这个模式下的 Docker 容器会共享一个网络栈,这样两个容器之间可以使用localhost高效快速通信。

示例

cpp 复制代码
[root@docker ~]# docker run  -it --rm  --network container:web1 busybox
/ # ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:12:00:02
          inet addr:172.18.0.2  Bcast:172.18.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:28 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:3046 (2.9 KiB)  TX bytes:280 (280.0 B)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)


[root@docker ~]# docker run  -it --rm  --network container:web1 centos:7
[root@efae66874371 /]# curl localhost
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

综上,docker的四种原生网络介绍完毕

相关推荐
Lonely 净土6 小时前
Linux 运维文件写入操作
linux·运维·服务器·文件管理
飞英思特无线充电7 小时前
严苛场景巡检机器人的无线补能设计:点位、BMS、认证与运维边界
运维·机器人
Jimmy_jimi7 小时前
利用nginx代理完成url重定位
运维·nginx
卷无止境8 小时前
Windows 上丝滑开发 Python,并稳定构建 Docker 镜像
后端·python·docker
liuyicenysabel8 小时前
多服务上线日记三:
运维·服务器·笔记·学习
吠品9 小时前
Wine 在 Linux 上运行 Windows 软件完整指南
java·linux·服务器
一只鹿鹿鹿9 小时前
大数据中心安全系统解决方案(Word文件)
大数据·运维·物联网·安全·政务
万里侯11 小时前
GitOps 2026年演进趋势:从配置管理到环境即代码的范式转移及Pull vs Push模型的再思考
微服务·容器·k8s
acd1200911 小时前
一次线上OOM排查实录:从jmap到代码重构,我踩过的坑全在这了
容器·重构·kubernetes
深念Y11 小时前
从 Windows 迁移到 Linux 开发环境的记录
linux·windows·链接·bun·ram·imdisk