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

相关推荐
AOwhisky12 小时前
Ceph系列第三期:Ceph 集群核心配置与管理
linux·运维·数据库·笔记·ceph
香气袭人知骤暖12 小时前
人大金仓(KingbaseES)Docker 容器自动备份方案
运维·docker·容器
天疆说12 小时前
在 Ubuntu 上安装 NASA GMAT R2026a 轨道设计软件
linux·运维·ubuntu
铅笔小新z12 小时前
【Linux】线程同步与互斥
linux·服务器
武雄(小星Ai)13 小时前
Gemini CLI 免费用户6月18日停服,Google Antigravity 2.0 深度解读
运维·人工智能·agent
大熊程序猿13 小时前
MarkItDown Docker安装
运维·docker·容器
Hello_worlds13 小时前
Kafka InconsistentClusterIdException 导致容器无限重启,磁盘打满排查与修复
docker·kafka·磁盘·排障
AI行业学习13 小时前
CC-Switch 下载、安装windows\macOS \Linux 安装
linux·运维·macos
江南风月13 小时前
WGCLOUD监控系统的Restful Http接口一览
运维·zabbix·运维开发·prometheus
一拳一个娘娘腔13 小时前
【SRC漏洞挖掘系列】第15期:自动化与AI赋能 —— 打造你的专属“漏洞挖掘机”
运维·人工智能·自动化