【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的四种原生网络介绍完毕

相关推荐
我叫洋洋1 小时前
涂鸦 T5+ hashcat 自动化破解 WPA2:从单缺 M2 到全自动值守的踩坑实录 破解wifi 密码
运维·单片机·自动化
troy1283 小时前
K8s 平台测试清单:深度分析与实战指南
云原生·容器·kubernetes
Henry-SAP8 小时前
SAP PP核心引擎计划策略业务解析
人工智能·云原生·sap·erp
左手の明天8 小时前
SLIP 协议封装与解析详解:原理、C 代码与实战案例
linux·c语言·开发语言·c++
꯭自꯭闭꯭8 小时前
达梦SQL优化相关
linux·运维·数据库·sql
ZhangJun959 小时前
在 32GB 内存电脑上本地搭建 Qwen3.6-35B-A3B 大模型踩坑实录
运维·人工智能·阿里云·ai·软件构建
一条破秋裤9 小时前
Linux 共享内存通信:POSIX 共享内存与 mmap
linux·运维·服务器
贵州山魈羡民9 小时前
【玩转手机】通过 Podroid 上的 Alpine 部署 1Panel,把微型服务器装进口袋
运维·服务器
小白的码BUG之路10 小时前
Docker -- 构建nacos镜像
运维·docker·容器
谷哥的小弟11 小时前
CentOS Stream浴火重生
linux·运维·centos