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

相关推荐
AzusaFighting2 小时前
Dify (Ubuntu 24.04 Noble x64)部署教程
linux·运维·ubuntu
xlp666hub2 小时前
一篇文章彻底搞懂Linux驱动的并发控制与中断上下半部机制
linux·面试
木心月转码ing2 小时前
三个小技巧(commit message规范、代码格式化技巧、WSL开启网络代理)
linux
jwlee012 小时前
Docker Compose
docker·容器·eureka
Agent产品评测局2 小时前
企业超自动化落地,如何打通全业务流程的数据孤岛?技术路径全景盘点与选型指南
运维·人工智能·ai·chatgpt·自动化
志栋智能2 小时前
安全自动化不烧钱:低成本实战策略
运维·网络·人工智能·安全·自动化
小的~~2 小时前
使用StreamLoad向Doris-4.0.3版本的聚合表导数据超时问题
运维·服务器·数据库
wang09072 小时前
Linux性能优化之上下文切换
linux·运维·性能优化
bellus-2 小时前
ubuntu24安装
linux