docker网络

容器网络模式,bridge 桥接模式、host 模式和 none 模式,启动容器时可以使用 --net 参数指定,默认是桥接模式。

  • 网络基本管理

    ~]# docker network ls       # docker 默认网络
    NETWORK ID     NAME      DRIVER    SCOPE
    066097f14e78   bridge    bridge    local
    379b92d96bfe   host      host      local
    12c805935e1f   none      null      local
    
  • --net参数说明

    • --net=bridge: 默认值,在Docker网桥docker0上为容器创建新的网络栈;
    • --net=none: 让Docker将新容器放到隔离的网络栈中,但不进行网络配置,之后由用户自行配置;
    • --net=container NAME or ID:与已存在的容器共享网络资源、但存在自己文件系统、进程列表和资源限制, 两者可以直接通过lo环境接口通信;
    • --net=host: 告诉Docker不要将容器网络放到隔离的命名空间中,即不要容器化容器内的网络, 如果进一步使用了 --privileged=true参数,容器甚至会允许直接配置主机的网络栈;
    • --net=user_defined_network: 用户自行用network相关命令创建一个网络,通过这种方式将容器连接到指定的已创建网络上去;

bridge桥接模式

Bridge 桥接模式的实现步骤主要如下:

  • 实现步骤

    1. Docker Daemon 利用 veth pair 技术,在宿主机上创建两个虚拟网络接口设备,假设为veth0 和 veth1。而 veth pair 技术的特性可以保证无论哪一个 veth 接收到网络报文,都会将报文传输给另一方。

    2. Docker Daemon 将 veth1 添加到 Docker Container 所属的 namespace 下,并被改名为 eth0。如此一来,保证宿主机的网络报文若发往 veth0,则立即会被 eth0 接收,实现宿主机到Docker Container 网络的联通性;同时,也保证 Docker Container 单独使用 eth0,实现容器网络环境的隔离性。

    3. bridge 桥接模式下的 Docker Container 在使用时,并非为开发者包办了一切。最明显的是,该模式下 Docker Container 不具有一个公有 IP,即和宿主机的 eth0 不处于同一个网段。导致的结果是宿主机以外的世界不能直接和容器进行通信。

    4. 虽然 NAT 模式经过中间处理实现了这一点,但是 NAT 模式仍然存在问题与不便,如:容器均需要在宿主机上竞争端口,容器内部服务的访问者需要使用请添加图片描述
      服务发现获知服务的外部端口等。另外 NAT 模式由于是在三层网络上的实现手段,故肯定会影响网络的传输效率。

  • 示例

    ]# docker run -d -P edf
    
    ]# brctl show  <---  当添加容器之后,会立即生成一条网卡信息
    bridge name	bridge id		STP enabled	interfaces
    docker0		8000.0242f9e2058f	no		veth0188a6f
    
    # 假设我们将容器删除,bridge信息也会立即被清理。
    

host网络

容器名称空间只需要 User, Mount, pid ,网络部分 UTS, PID, NET使用主机

  • 实现步骤

    • host 模式是 bridge 桥接模式很好的补充。

    • 采用 host 模式的 Docker Container,可以直接使用宿主机的 IP 地址与外界进行通信,若宿主机的 eth0 是一个公有 IP,那么容器也拥有这个公有 IP。

    • 同时容器内服务的端口也可以使用宿主机的端口,无需额外进行 NAT 转换。当然,有这样的方便,肯定会损失部分其他的特性,最明显的是 Docker Container 网络环境隔离性的弱化,即容器不再拥有隔离、独立的网络栈。

    • 使用 host 模式的 Docker Container 虽然可以让容器内部的服务和传统情况无差别、无改造的使用,但是由于网络隔离性的弱化,该容器会与宿主机共享竞争网络栈的使用;另外,容器内部将不再拥有所有的端口资源,原因是部分端口资源已经被宿主机本身的服务占用,还有部分端口已经用以 bridge 网络模式容器的端口映射。
      请添加图片描述

  • 示例

    ]# docker run -d -P --name tomh1 -v share1:/usr/local/tomcat/webapps --net=host edf
    
    ]# docker ps
    PORTS:        <-- 注意看这,ports是为空的,它占用的是本地宿主机的端口
    NAMES: tomh1
    
    ]# docker inspect  ce8d4f|grep Pid
                "Pid": 14265,
    
    ]# ss -tnlp|grep 8080   <-- 直接监听在本机上
    LISTEN     0      100          *:8080  users:(("java",pid=14265,fd=54))
    

none网络

网络环境为 none,即不为 Docker Container 任何的网络环境

  • 实现步骤

    • 一旦 Docker Container 采用了none 网络模式,那么容器内部就只能使用 loopback 网络设备,不会再有其他的网络资源

    • none 模式为 Docker Container 做了极少的网络设定,但是俗话说得好“少即是多”在没有网络配置的情况下,作为 Docker 开发者,才能在这基础做其他无限多可能的网络定制开发,这也恰巧体现了 Docker 设计理念的开放。

    • 在 none 网络模式下分配固定 ip:netns 是在 linux 中提供网络虚拟化的一个项目,使用 netns 网络空间虚拟化可以在本地虚拟化出多个网络环境,目前 netns 在 lxc 容器中被用来为容器提供网络。请添加图片描述

    • 使用 netns 创建的网络空间独立于当前系统的网络空间,其中的网络设备以及 iptables 规则等都是独立的,就好像进入了另外一个网络一样。

  • 示例 - 加入到 none网络

    ~]# docker run -d -P --name tomcatnone1 --net none -v share1:/usr/local/tomcat/webapps edf
    
    ~]# brctl show    <-- 跟host网络一样,并不会加入到桥接网络当中
    bridge name		bridge id			STP enabled	interfaces
    docker0			8000.0242f9e2058f	no		
    
    # docker network connect bridge 容器名
    

三种网络模式对比

来源AI

网络模式核心特点对比
网络模式 核心特点 IP 分配 网络隔离性 性能表现
bridge 默认模式,通过虚拟网桥(docker0)实现容器间通信,依赖 NAT 与外部网络交互。 独立 IP(如 172.17.x.x) 容器间默认隔离,需手动配置端口映射 中等(虚拟设备转发引入延迟)
host 共享宿主机网络命名空间,直接使用宿主机 IP 和端口。 无独立 IP,复用宿主机 IP 无隔离,与宿主机共享网络资源 极高(接近宿主机原生性能)
none 完全禁用网络,容器无网络接口 。 无 IP 分配 完全隔离,无法与外部通信 无(无网络交互)
优缺点对比

bridge模式

  • 优点
    • 容器间默认隔离,安全性较高;
    • 支持多容器协同(如微服务架构),配置灵活 ;
    • 无需额外配置,开箱即用 。
  • 缺点
    • 虚拟网络转发导致性能损耗,延迟较高 ;
    • 容器数量多时,网络管理复杂度增加 。

Host模式

  • 优点
    • 性能最优,适合高并发场景(如大数据处理、高性能计算) ;
    • 配置简单,无需端口映射 。
  • 缺点
    • 安全性低,容器直接暴露宿主机网络风险 ;
    • 端口冲突风险高(多容器需手动管理端口) 。

None模式

  • 优点
    • 完全隔离,适合敏感数据处理或离线任务;
    • 极简配置,排除网络干扰。
  • 缺点
    • 无法与外部通信,适用场景极窄
适用场景
网络模式 典型适用场景 示例场景
bridge 微服务架构、多容器协作应用、开发环境。 电商系统(前端、后端、数据库容器通信)。
host 高性能需求场景(如实时数据处理)、单容器应用 。 日志收集器、高性能 API 服务。
none 离线计算、数据加密任务、安全隔离测试。 本地文件处理、密码哈希计算。
  1. 性能优先:选择 host 模式(如高频网络交互场景)。
  2. 安全性与隔离:选择 bridge 模式(如多容器共享环境)。
  3. 完全离线需求:选择 none 模式(如纯本地计算任务)。

扩展-创建自定义网络

  • 语法

    ]# docker network --help
    Usage:	docker network COMMAND
    Commands:
      connect     Connect a container to a network
      create      Create a network
      disconnect  Disconnect a container from a network
      inspect     Display detailed information on one or more networks
      ls          List networks
      prune       Remove all unused networks
      rm          Remove one or more networks
    
    # 选取的几个常用选项, 多按tab键也能补出来命令或者多help
     ]# docker network create --help
    Usage:	docker network create [OPTIONS] NETWORK
    Options:
      -d, --driver string        Driver to manage the Network (default "bridge")
          --gateway strings      IPv4 or IPv6 Gateway for the master subnet
          --ingress              Create swarm routing-mesh network
          --internal             Restrict external access to the network
          --ip-range strings     Allocate container ip from a sub-range
          --label list           Set metadata on a network
      -o, --subnet strings       Subnet in CIDR format that represents a network segment
    
  • 示例

    --network network Connect a container to a network # 指定容器网络

    # 1、创建  类型 bridge类型的网络
    ]# docker network create -d bridge --subnet '172.20.0.0/16' --gateway '172.20.0.1' mybridge
    
    # 2、查看
    ~]# docker network ls
    NETWORK ID     NAME       DRIVER    SCOPE
    813cc879ec84   mybridge   bridge    local
    
    ~]# ip a
    50: br-813cc879ec84: <...> mtu 1500 qdisc noqueue state DOWN group default 
        link/ether 02:42:50:e4:26:2b brd ff:ff:ff:ff:ff:ff
        inet 172.20.0.1/16 brd 172.20.255.255 scope global br-813cc879ec84
           valid_lft forever preferred_lft forever
    
    ~]# brctl show
    bridge name	bridge id		STP enabled	interfaces
    br-813cc879ec84		8000.024250e4262b	no	
    
    # 3、运行一个容器并加入mybrigde网络中,加-v是有个静态页面
     ~]# docker run -d -P -v share1:/usr/local/tomcat/webapps --network=mybridge --name=tomcatmyb1 edf8233555ae
     
    # 4、如果想看到有哪些容器在该网络中可查看, 截取了一部分, 可以看到我这里搞了三个容器
    ~]# docker network inspect mybridge 
            "Name": "mybridge",
            "Id": "813cc879ec8454f185fb82bead816b2caf0211c6d4e1d55b843141e8bf4e5607",
            "Scope": "local",
            "Driver": "bridge",
    
            "Containers": {
                "6ad0cb6c463d6c0911151c2e3453bdc59e38bf7cf51489429ac2e1d218a37a73": {
                    "Name": "tomcatmyb3",
                    "IPv4Address": "172.20.0.4/16",
                },
                "98d0e7b9d5e260f0bfafd8ed781f9e831dcd5d39c99c7b4c4926cf8fdde83637": {
                    "Name": "tomcatmyb1",
                    "IPv4Address": "172.20.0.2/16",
                },
                "c4a6a04d1088d1bebe0be19244456661dbe46509bd45456dbef2c790fab2f2d2": {
                    "Name": "tomcatmyb",
                    "IPv4Address": "172.20.0.3/16",
                }
            },
    
    # 5、查看某一台的容器信息
    
Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐