Docker 网络

目录

​前言

[​1. Docker 网络模式​](#1. Docker 网络模式)

[​2. 默认 bridge 网络详解​](#2. 默认 bridge 网络详解)

​​(1)特点​

​​(2)操作示例​

[​3. host 网络模式​](#3. host 网络模式)

​​(1)特点​

​​(2)操作示例​

[​4. overlay 网络(跨主机通信)​​](#4. overlay 网络(跨主机通信))

​​(1)特点​

​​(2)操作示例​

[​5. macvlan 网络(物理网络集成)​​](#5. macvlan 网络(物理网络集成))

​​(1)特点​

​​(2)操作示例​

[​6. 网络调试命令​](#6. 网络调试命令)

[​7. 最佳实践​](#7. 最佳实践)

[​8. 常见问题​](#8. 常见问题)

​​(1)容器无法访问外网?​​

​​(2)端口映射失效?​​


​前言

Docker 提供了多种网络模式,用于管理容器之间、容器与宿主机以及外部网络的通信。不同的网络模式适用于不同的场景,如开发、测试、生产环境等。


​1. Docker 网络模式​

Docker 默认支持以下网络模式:

网络模式 描述 适用场景
​bridge 默认模式,容器通过虚拟网桥(docker0)通信,每个容器分配独立 IP 单机多容器通信(默认推荐)
​host 容器直接使用宿主机的网络栈,不隔离网络(性能最好,但安全性低) 高性能应用(如负载均衡、网络监控)
​none 禁用所有网络,容器仅能通过 localhost 访问 安全隔离环境(极少使用)
​overlay 跨主机的容器网络(用于 Docker Swarm/Kubernetes) 分布式集群(多主机通信)
​macvlan 为容器分配 MAC 地址,使其在物理网络中像独立设备运行 传统网络设备迁移(如 IoT、NFV)

​2. 默认 bridge 网络详解​

​​(1)特点​

  • Docker 默认创建 docker0 虚拟网桥(IP 通常为 172.17.0.1/16)。
  • 每个容器分配独立 IP(如 172.17.0.2)。
  • 容器间默认互通 (但不同主机的 bridge 网络不互通)。
  • 端口映射 (-p 宿主机端口:容器端口)使外部访问容器服务。

​​(2)操作示例​

java 复制代码
# 查看所有网络
docker network ls

# 创建自定义 bridge 网络(推荐)
docker network create my-bridge --driver=bridge --subnet=192.168.100.0/24

# 运行容器并指定网络
docker run -d --name web --network my-bridge nginx

# 查看容器 IP
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' web

​3. host 网络模式​

​​(1)特点​

  • 容器直接使用宿主机网络(无 NAT,性能最佳)。
  • 端口直接绑定到宿主机(无需 -p 映射)。
  • 缺点:端口冲突风险,安全性低。

​​(2)操作示例​

java 复制代码
# 使用 host 网络运行容器
docker run -d --name web --network host nginx

# 访问服务(直接使用宿主机 IP)
curl http://localhost:80

​4. overlay 网络(跨主机通信)​​

​​(1)特点​

  • 用于 Docker Swarm 或 Kubernetes,实现多主机容器通信。
  • 基于 VXLAN 封装,支持加密(--opt encrypted)。

​​(2)操作示例​

java 复制代码
# 初始化 Swarm 集群
docker swarm init

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

# 在 Swarm 中运行服务
docker service create --name web --network my-overlay nginx

​5. macvlan 网络(物理网络集成)​​

​​(1)特点​

  • 容器直接接入物理网络,拥有独立 MAC 和 IP。
  • 适用于需要直接暴露到局域网的场景(如 IoT 设备模拟)。

​​(2)操作示例​

java 复制代码
# 创建 macvlan 网络
docker network create -d macvlan \
  --subnet=192.168.1.0/24 \
  --gateway=192.168.1.1 \
  --ip-range=192.168.1.100/32 \
  -o parent=eth0 \
  my-macvlan

# 运行容器
docker run -d --name iot-device --network my-macvlan alpine

​6. 网络调试命令​

命令 作用
docker network ls 列出所有网络
docker network inspect 网络名 查看网络详情(IP 段、容器列表等)
docker exec -it 容器名 ping IP 测试容器间通信
tcpdump -i docker0 抓包分析 bridge 网络流量

​7. 最佳实践​

  1. 生产环境推荐
    • 使用自定义 bridge 网络(避免默认 docker0 的 IP 冲突)。
    • 限制容器间通信:docker network create --internal my-net。
  2. 跨主机通信
    • 选择 overlay 网络(Swarm/K8s)或 macvlan(物理网络集成)。
  3. 安全隔离
    • 敏感服务使用 --network none。
    • 防火墙规则限制容器访问:iptables -A DOCKER-USER -j DROP。

​8. 常见问题​

​​(1)容器无法访问外网?​​

java 复制代码
# 检查 DNS 配置
docker run --dns 8.8.8.8 alpine ping baidu.com

# 检查宿主机 iptables
sudo iptables -L -n | grep DROP

​​(2)端口映射失效?​​

java 复制代码
# 确认容器监听 0.0.0.0(而非 127.0.0.1)
docker exec nginx netstat -tuln | grep 80

# 检查宿主机端口占用
netstat -tuln | grep 8080
相关推荐
miaobinfei1 小时前
docker拉取dify镜像,执行docker compose up -d 报错
运维·docker·容器
kobe_OKOK_2 小时前
docker compose命名卷 映射到宿主机的路径
运维·docker·容器
晨陌y7 小时前
Flare自托管导航页教程:Docker部署、多用户、API与公网访问
运维·docker·容器
梅孔立9 小时前
Docker 容器网络不通:Tomcat 无法解析 MySQL、Nginx 无法反代 Tomcat 的生产级排查与治理
网络·docker·tomcat
螺蛳粉 螺蛳粉18 小时前
第 05 篇:etcd 深入:Raft 共识、watch 机制与快照备份恢复实战(底座认知 05)
docker·云原生·容器·kubernetes·etcd·分布式存储·kube-apiserver
PellyKoo21 小时前
【docker】cifs卷改smb密码后容器起不来的解决方法
运维·docker·容器
时早玖沐21 小时前
放弃 QQ 官方机器人:用 SnowLuma + AstrBot 自建 QQ 机器人
docker·开源·agent
阿标在干嘛1 天前
容器编排的“场景适配”:我们为什么在部分服务中回归了Docker Compose?
运维·docker·容器
IT19951 天前
Docker 快速部署 DM8 达梦数据库|完整踩坑笔记
笔记·docker·容器
wzg20161 天前
ubuntu通过docker镜像部署安装onlyoffice
linux·ubuntu·docker