3. docker网络

1. Docker 网络基础

Docker 容器本质上是进程 + 隔离环境,需要通过网络互联。常见模式:

  1. bridge(默认)
    Docker 默认给容器分配一个虚拟网卡 eth0,接到一个网桥 docker0 上。
    容器之间通过 docker0 通信;容器和外部通过 NAT 转发。
容器内          宿主机
+---------+     +-------------------+
|  eth0   | <-- | vethxxxx          |
|         |     |       \           |
|   容器   |     |        \          |
+---------+     |         docker0   |
                |           |       |
                |         eth0外网   |
                +-------------------+

  1. host
    容器直接使用宿主机网络(没有独立 IP,性能最好,但隔离性差)。

  2. none
    容器无网络,只能通过 loopback。

  3. overlay
    跨主机的网络,需要 Docker Swarm 或 K8s 支持。实现多机容器互联。

  4. macvlan
    给容器直接分配物理网络 IP,就像一台独立机器。
    重点:Docker 网络解决的是容器内外通信问题,但它局限在单机或小规模集群。

2. Kubernetes (K8s) 基本概念

1. K8s 是什么?

Kubernetes 是 Google 开发的 容器编排系统,用于 自动化部署、扩展和管理容器化应用。
一句话:
Docker 负责一个容器,K8s 负责一群容器。

2. K8s 能做什么?
  1. 容器编排:启动、停止、调度容器。
  2. 服务发现和负载均衡:不用手动写 IP,自动为服务分配地址。
  3. 自动扩缩容:流量大时增加副本,流量小时缩减。
  4. 自愈能力:容器挂了自动重启。
  5. 滚动升级和回滚:无停机更新。
  6. 跨主机部署:支持多机、多集群。
3. 技术边界

K8s 解决的问题:
容器编排 + 调度 + 自动化管理

不负责:
应用逻辑(你得写代码)
持续集成/持续交付(CI/CD,需要配合 Jenkins/GitLab CI/ArgoCD)
监控/日志(需要 Prometheus, ELK 等)
服务网格(通常用 Istio/Linkerd 补充)

4. Docker Swarm vs K8s
  1. Docker Swarm
    Docker 官方的集群编排工具。
    上手简单(docker swarm init 就能玩),适合小规模。
    功能有限(负载均衡、简单扩展)。

  2. K8s
    更复杂(需要 etcd, kube-apiserver, kube-scheduler 等组件)。
    生态更强大(存储、网络、监控、服务网格)。
    支持大规模集群(几千节点)。

  3. 有了 Swarm 还要 K8s?
    因为 Swarm 在功能和生态上不够强大,企业级生产环境基本都转向 K8s。

3. K8s 重要概念

概念 解释
Pod 最小调度单位,包含一个或多个容器
Node 工作节点(运行容器的机器)
Cluster 一组 Node 组成集群
Service 对 Pod 的抽象,提供固定访问方式和负载均衡
Deployment 定义应用如何运行、扩展、升级
Namespace 资源隔离(比如 dev/test/prod)
ConfigMap / Secret 配置和敏感信息管理
Ingress 外部访问入口(相当于 API 网关)

4. 如何扩展 K8s

  1. 水平扩展(scale out)
    增加 Pod 副本数:
    kubectl scale deployment myapp --replicas=5
    自动扩缩容(HPA):根据 CPU/内存负载自动调整副本数。

  2. 垂直扩展(scale up)
    增加 Pod 的资源限制:
    resources:
    requests:
    cpu: “500m”
    memory: “512Mi”
    limits:
    cpu: “1”
    memory: “1Gi”

  3. 集群扩展
    加更多节点(Node Pool)。
    云上可以自动弹性扩容(EKS, GKE, AKS)。

5. 哪些情况下需要 K8s

单机 or 小团队 → Docker Compose / Swarm 足够
多机部署,追求高可用、自动扩缩容 → K8s 必须
场景示例:
电商网站大促,流量突增,需要自动扩容
金融系统需要零宕机更新,滚动升级
多团队协作,需要命名空间隔离和权限控制
企业要统一平台管理应用(微服务、批处理、事件驱动)

6. pull 轻量linux镜像

# dockerfile
FROM alpine:3.18
RUN apk add ethtool
RUN apk add ipvsadm
RUN apk add iptables

# 镜像构建
docker build -t myalpine .

7. docker网络解决了什么问题

问题 Docker 网络方案
容器与宿主机通信 通过 NAT(桥接模式)或 Host 网络模式实现
容器之间通信 使用 bridge 网络、overlay 网络、macvlan 等
容器访问外部网络 默认桥接网络和 NAT 实现对外访问
容器服务暴露给外部 通过端口映射 (-p 宿主机端口:容器端口)
多主机容器通信 使用 overlay 网络 + Docker Swarm / Kubernetes 网络插件
网络隔离与安全 每个网络可以隔离一组容器,配合防火墙规则控制通信

8. docker网络命令

  1. 查看网络
# 查看所有 Docker 网络
docker network ls

# 查看某个网络详情
docker network inspect <network_name_or_id>
  1. 创建网络
# 创建自定义桥接网络
docker network create my-bridge

# 创建 overlay 网络(用于 Swarm 集群)
docker network create -d overlay my-overlay
  1. 删除网络
docker network rm <network_name_or_id>
  1. 连接容器到网络
# 运行容器时指定网络
docker run -it --name mycontainer --network my-bridge ubuntu

# 将已有容器加入网络
docker network connect my-bridge mycontainer
  1. 从网络断开容器
docker network disconnect my-bridge mycontainer
  1. 查看容器的网络配置
docker inspect <container_name_or_id> | grep -i ipaddress
或者直接查看 IP:
docker exec -it mycontainer ip addr
  1. 端口映射(容器对外通信)
# 容器端口映射到宿主机端口
docker run -d -p 8080:80 --name mynginx nginx
8080:宿主机端口
80:容器内端口

9. 常见网络操作

  1. 发布端口(Port Publishing)
docker run -d -p <host_port>:<container_port> <image>

宿主机端口 → 容器端口
宿主机的请求会通过 NAT 转发 到容器内部服务。
示例

# 将容器的 80 端口映射到宿主机的 8080 端口
docker run -d -p 8080:80 nginx

访问:
http://localhost:8080
就会看到容器里的 Nginx 页面。
进阶用法

# 指定宿主机 IP(只监听 127.0.0.1,不对外暴露)
docker run -d -p 127.0.0.1:8080:80 nginx

# 映射多个端口
docker run -d -p 8080:80 -p 8443:443 nginx
  1. 修改 Hostname
    容器默认 hostname 是容器的 ID 前 12 位。
    可以通过 --hostname 修改。
# 创建容器时指定 hostname
docker run -it --name myubuntu --hostname=myhost ubuntu bash

在容器内执行:

hostname

输出结果就是:

myhost

10. 网络驱动

1. 什么是网桥(Bridge)

在 Docker 里,网桥就是一个虚拟交换机。
它运行在宿主机上,用来连接容器之间、以及容器和宿主机之间的通信。
容器连到网桥上,就像插到一个虚拟交换机的端口。
默认情况下,容器的网卡(veth pair)会接到这个网桥上。
Linux 本身也有网桥(brctl show 能看到),Docker 就是基于 Linux bridge 实现的。

2. Docker 默认网桥(bridge)

名字:bridge(Docker 默认会创建一个)
特性:
每次 docker run 没指定网络时,容器默认接到 bridge 上。
容器之间用 IP 地址 可以互通。
容器名 不能直接互相解析(需要 --link 才能用名字访问,已经不推荐)。
出口访问外部网络时,会通过 NAT(宿主机 IP 转发)。

3. 用户自定义网桥(自建 bridge 网络)

可以自己建:
docker network create mynet
特性:
容器可以用名字互相访问(有内置 DNS)。
例如:docker run --network=mynet --name=web nginx
另一个容器就能直接 ping web。

隔离性更强:
不同自定义网络之间的容器默认不互通。
灵活性:
可以指定子网、网关,甚至和宿主机其他网络打通。
可以随时把容器 connect/disconnect 到某个自定义网络。

对比表格

特性 默认网桥(bridge) 用户自定义网桥(user-defined bridge)
网络名称 bridge(固定) 用户自己命名(如 mynet
容器互联方式 只能用 IP 或 --link(已过时) 支持内置 DNS,可用容器名互相访问
DNS 解析支持 无内置 DNS 有内置 DNS(127.0.0.11
隔离性 所有容器默认连在一起,隔离性差 不同自定义网络互相隔离,更安全
配置灵活性 不可配置 可指定子网、网关、驱动等参数
推荐使用场景 简单实验、临时运行容器 生产环境、需要服务发现和隔离的场景
4. docker0 网桥工作示意图
   [外网/宿主机 eth0]
            |
       192.168.1.1 (家庭网关)
            |
   ----------------------------
   |        Linux 内核        |
   |                         |
[ docker0 172.17.0.1 ] ---- veth0 <---> eth0 (容器1 172.17.0.2)
                        ---- veth1 <---> eth0 (容器2 172.17.0.3)
   ----------------------------

原理:
docker0 就像宿主机里的一个虚拟交换机
每启动一个容器,就创建一对 veth pair,一端接容器,另一端接入 docker0
容器之间能互相通信(通过docker0),访问外网通过 NAT 转发

5. 案例
#一个整体的网桥使用
# 自定义网络
docker network create mynet

# 启动一个 Nginx 容器(发布端口):
docker run -d -p 8080:80 --name mynginx --network mynet nginx
#→ 宿主机 localhost:8080 可访问容器 web1

#启动另一个 Alpine 容器,加入默认网桥:
docker run -it --rm --name myalpine --network mynet alpine sh
# 在 test1 容器里访问 web1:
apk add --no-cache curl
curl http://mynginx:80
# → 成功访问到 web1 的页面(说明容器间可互通)

#容器访问外网:
ping www.baidu.com
#→ 容器里的数据包通过 docker0 -> eth0 -> NAT -> 路由器 出网

11. overlay(覆盖网络)

Docker 在多主机容器通信和 Swarm 集群里最常用的网络驱动。

1. 什么是 Overlay 网络

Overlay 网络 是 Docker 提供的一种虚拟网络驱动,它运行在 多主机 场景下。
它基于 VXLAN 隧道技术(把容器的网络包封装成 UDP,跨主机传输,再在另一边解封)。
让分布在不同物理/虚拟机上的容器,就像在同一个二层网络里一样,能直接互相通信。
简单说:
bridge 网络:容器通信局限在 同一台宿主机。
overlay 网络:容器可以跨 多台宿主机 通信。

2. Overlay 网络使用案例(Swarm 模式)

Overlay 网络通常在 Docker Swarm 集群里用。

① 初始化 Swarm
在管理节点上:

docker swarm init

得到一条 docker swarm join 命令,用于把别的节点加入集群。
② 创建 overlay 网络

docker network create -d overlay myoverlay

③ 部署一个服务(使用 overlay 网络)

docker service create --name web --replicas 2 --network myoverlay nginx

这会在集群的不同节点上运行多个 nginx 实例,它们通过 myoverlay 网络通信。
④ 再创建一个服务(同网段能直接访问)

docker service create --name alpine --network myoverlay alpine sleep 1000

然后进入 alpine 容器:

docker exec -it $(docker ps -q -f name=alpine) sh
ping web

会发现,跨主机也能直接 ping 通 web 服务。

3. 常见 Overlay 网络操作
# 查看所有网络(会有 overlay)
docker network ls

# 创建 overlay 网络
docker network create -d overlay myoverlay

# 检查网络详情
docker network inspect myoverlay

# 删除网络
docker network rm myoverlay
4. 示意图

Host2

Host1

Overlay VXLAN

Overlay VXLAN

ContainerA

ContainerB

ContainerC

容器 A、B、C 分布在不同主机,但因为在同一个 overlay 网络,所以它们能像同机通信。

5. 自定义的 Ingress 网络 vs docker_gwbridge
  1. Ingress 网络
    Docker Swarm 默认创建的 overlay 网络,用于负载均衡和入口流量。
    当你用 docker service create -p 8080:80 nginx,外部访问会先进入 ingress 网络,再转发到实际的容器。

  2. docker_gwbridge 网络
    是一个 bridge 网络,作用是连接 overlay 网络 和宿主机网络(或外部网络)。
    它保证了 overlay 网络里的容器能访问外部世界。

6. 对比表格
网络类型 默认名称 驱动 作用范围 特点
bridge bridge bridge 单机 容器默认网络,不能跨主机
用户自定义 bridge 自定义名字 bridge 单机 容器可自定义子网、别名、DNS
overlay ingress/myoverlay overlay 跨主机(Swarm) 基于 VXLAN 隧道,多节点通信
docker_gwbridge docker_gwbridge bridge Swarm 节点本地 连接 overlay 网络和宿主机外网
host host host 单机 容器直接用宿主机网络
none none null 单机 容器无网络

总结:
overlay 网络 解决了跨主机容器通信的问题(Swarm/多机环境必备)。
ingress 网络 是 Docker 默认给 Swarm 服务做负载均衡的 overlay 网络。
docker_gwbridge 负责把 overlay 网络连到外部网络。

12. IPvlan

1. 概念:

IPvlan 是 Linux 内核的一种网络虚拟化技术,类似 Macvlan,但它保留了宿主机的 MAC 地址,允许多个容器使用同一个物理网卡。
容器通过 独立 IP 与外部网络通信,但共享宿主机的 MAC。
优势:比 Macvlan 更轻量,不需要大量 MAC 地址。
模式:
L2 模式:像 Macvlan,容器在二层,需在同一网段。
L3 模式:容器通过 IP 与宿主机或不同网段通信,三层路由,适合跨网段通信。

2. 案例:
  1. 与宿主机通信
docker network create -d ipvlan \
  --subnet=192.168.1.0/24 \
  --gateway=192.168.1.1 \
  -o parent=eth0 \
  my_ipvlan_net
docker run -it --network my_ipvlan_net alpine

容器可以访问宿主机(192.168.1.1)。
跨主机通信(需要 L3 或路由器)
每台主机配置同一 IPvlan 子网,并通过路由器互通。
Host1:

docker network create -d ipvlan --subnet=10.0.0.0/24 -o parent=eth0 ipvlan1
docker run -it --network ipvlan1 alpine

Host2 同理,通过 L3 路由互通容器。

  1. 不同子网间通信
    IPvlan L3 模式允许容器在不同子网之间通信,通过网关路由:
docker network create -d ipvlan \
  --subnet=172.16.1.0/24 \
  --gateway=172.16.1.1 \
  -o parent=eth0 \
  -o ipvlan_mode=l3 \
  ipvlan_l3

13. Macvlan

1. 概念:

Macvlan 给每个容器分配一个 独立 MAC 地址,容器在 L2 层像一个独立物理机。
容器可以直接被外部网络访问。
优势:外部网络像访问普通主机一样访问容器,不经过 NAT。
缺点:物理网卡需要支持多个 MAC,容器与宿主机默认不能直接通信(可用桥接或 VLAN 解决)。

2. 案例:
  1. 与外部网络通信(同网段)
docker network create -d macvlan \
  --subnet=192.168.1.0/24 \
  --gateway=192.168.1.1 \
  -o parent=eth0 \
  my_macvlan
docker run -it --network my_macvlan alpine

容器获得独立 IP,可被 LAN 其他主机直接访问。

  1. 跨主机通信
    多台主机同一 VLAN 网段,Macvlan 容器直接通过 L2 交换机互通。

  2. 宿主机通信(宿主机默认不能直接访问)

# 创建 macvlan 并允许宿主机访问
ip link add macvlan0 link eth0 type macvlan mode bridge
ip addr add 192.168.1.200/24 dev macvlan0
ip link set macvlan0 up

宿主机通过 macvlan0 与容器通信

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐