docker(3)网络
文章目录
3. docker网络
1. Docker 网络基础
Docker 容器本质上是进程 + 隔离环境,需要通过网络互联。常见模式:
- bridge(默认)
Docker 默认给容器分配一个虚拟网卡 eth0,接到一个网桥 docker0 上。
容器之间通过 docker0 通信;容器和外部通过 NAT 转发。
容器内 宿主机
+---------+ +-------------------+
| eth0 | <-- | vethxxxx |
| | | \ |
| 容器 | | \ |
+---------+ | docker0 |
| | |
| eth0外网 |
+-------------------+
-
host
容器直接使用宿主机网络(没有独立 IP,性能最好,但隔离性差)。 -
none
容器无网络,只能通过 loopback。 -
overlay
跨主机的网络,需要 Docker Swarm 或 K8s 支持。实现多机容器互联。 -
macvlan
给容器直接分配物理网络 IP,就像一台独立机器。
重点:Docker 网络解决的是容器内外通信问题,但它局限在单机或小规模集群。
2. Kubernetes (K8s) 基本概念
1. K8s 是什么?
Kubernetes 是 Google 开发的 容器编排系统,用于 自动化部署、扩展和管理容器化应用。
一句话:
Docker 负责一个容器,K8s 负责一群容器。
2. K8s 能做什么?
- 容器编排:启动、停止、调度容器。
- 服务发现和负载均衡:不用手动写 IP,自动为服务分配地址。
- 自动扩缩容:流量大时增加副本,流量小时缩减。
- 自愈能力:容器挂了自动重启。
- 滚动升级和回滚:无停机更新。
- 跨主机部署:支持多机、多集群。
3. 技术边界
K8s 解决的问题:
容器编排 + 调度 + 自动化管理
不负责:
应用逻辑(你得写代码)
持续集成/持续交付(CI/CD,需要配合 Jenkins/GitLab CI/ArgoCD)
监控/日志(需要 Prometheus, ELK 等)
服务网格(通常用 Istio/Linkerd 补充)
4. Docker Swarm vs K8s
-
Docker Swarm
Docker 官方的集群编排工具。
上手简单(docker swarm init 就能玩),适合小规模。
功能有限(负载均衡、简单扩展)。 -
K8s
更复杂(需要 etcd, kube-apiserver, kube-scheduler 等组件)。
生态更强大(存储、网络、监控、服务网格)。
支持大规模集群(几千节点)。 -
有了 Swarm 还要 K8s?
因为 Swarm 在功能和生态上不够强大,企业级生产环境基本都转向 K8s。
3. K8s 重要概念
| 概念 | 解释 |
|---|---|
| Pod | 最小调度单位,包含一个或多个容器 |
| Node | 工作节点(运行容器的机器) |
| Cluster | 一组 Node 组成集群 |
| Service | 对 Pod 的抽象,提供固定访问方式和负载均衡 |
| Deployment | 定义应用如何运行、扩展、升级 |
| Namespace | 资源隔离(比如 dev/test/prod) |
| ConfigMap / Secret | 配置和敏感信息管理 |
| Ingress | 外部访问入口(相当于 API 网关) |
4. 如何扩展 K8s
-
水平扩展(scale out)
增加 Pod 副本数:
kubectl scale deployment myapp --replicas=5
自动扩缩容(HPA):根据 CPU/内存负载自动调整副本数。 -
垂直扩展(scale up)
增加 Pod 的资源限制:
resources:
requests:
cpu: “500m”
memory: “512Mi”
limits:
cpu: “1”
memory: “1Gi” -
集群扩展
加更多节点(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网络命令
- 查看网络
# 查看所有 Docker 网络
docker network ls
# 查看某个网络详情
docker network inspect <network_name_or_id>
- 创建网络
# 创建自定义桥接网络
docker network create my-bridge
# 创建 overlay 网络(用于 Swarm 集群)
docker network create -d overlay my-overlay
- 删除网络
docker network rm <network_name_or_id>
- 连接容器到网络
# 运行容器时指定网络
docker run -it --name mycontainer --network my-bridge ubuntu
# 将已有容器加入网络
docker network connect my-bridge mycontainer
- 从网络断开容器
docker network disconnect my-bridge mycontainer
- 查看容器的网络配置
docker inspect <container_name_or_id> | grep -i ipaddress
或者直接查看 IP:
docker exec -it mycontainer ip addr
- 端口映射(容器对外通信)
# 容器端口映射到宿主机端口
docker run -d -p 8080:80 --name mynginx nginx
8080:宿主机端口
80:容器内端口
9. 常见网络操作
- 发布端口(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
- 修改 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. 示意图
容器 A、B、C 分布在不同主机,但因为在同一个 overlay 网络,所以它们能像同机通信。
5. 自定义的 Ingress 网络 vs docker_gwbridge
-
Ingress 网络
Docker Swarm 默认创建的 overlay 网络,用于负载均衡和入口流量。
当你用 docker service create -p 8080:80 nginx,外部访问会先进入 ingress 网络,再转发到实际的容器。 -
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. 案例:
- 与宿主机通信
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 路由互通容器。
- 不同子网间通信
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. 案例:
- 与外部网络通信(同网段)
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 其他主机直接访问。
-
跨主机通信
多台主机同一 VLAN 网段,Macvlan 容器直接通过 L2 交换机互通。 -
宿主机通信(宿主机默认不能直接访问)
# 创建 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 与容器通信
更多推荐



所有评论(0)