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. 对比表格
网络类型默认名称驱动作用范围特点
bridgebridgebridge单机容器默认网络,不能跨主机
用户自定义 bridge自定义名字bridge单机容器可自定义子网、别名、DNS
overlayingress/myoverlayoverlay跨主机(Swarm)基于 VXLAN 隧道,多节点通信
docker_gwbridgedocker_gwbridgebridgeSwarm 节点本地连接 overlay 网络和宿主机外网
hosthosthost单机容器直接用宿主机网络
nonenonenull单机容器无网络

总结:
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 与容器通信

更多推荐