Docker network网络管理入门教程

发布于:2025-08-15 ⋅ 阅读:(17) ⋅ 点赞:(0)
一、核心概念
  1. Docker 网络(Network)
    Docker 通过虚拟网络实现容器间、容器与主机间的通信。网络定义容器的 IP 地址、DNS 解析和端口映射规则。

  2. 网络驱动(Network Driver)
    Docker 支持多种网络驱动,决定网络的实现方式:

    • bridge:默认驱动,适用于单机容器间通信(类似物理交换机)。
    • host:容器直接使用主机网络,端口与主机共享。
    • overlay:跨主机容器通信(需 Swarm 或 Kubernetes 支持)。
    • none:禁用网络,容器无网络接口。
    • macvlan:为容器分配独立 MAC 地址,模拟物理设备。
  3. 默认网络
    Docker 安装后自动创建三个网络:

    • bridge:默认桥接网络。
    • host:主机网络模式。
    • none:无网络模式。
二、常用命令详解

1. 查看网络列表

docker network ls

2. 创建自定义网络

docker network create [OPTIONS] NETWORK
  • 常用选项
    • --driver:指定驱动(默认 bridge)。
    • --subnet:定义子网(如 192.168.1.0/24)。
    • --gateway:设置网关。

示例

docker network create --driver bridge --subnet 192.168.10.0/24 my_network

3. 连接容器到网络

# 启动时连接
docker run -d --name web_app --network my_network nginx

# 动态连接已运行容器
docker network connect my_network existing_container

4. 断开容器与网络的连接

docker network disconnect my_network existing_container

5. 查看网络详情

docker network inspect my_network

6. 删除网络

docker network rm my_network
三、网络模式详解

1. Bridge 模式(默认)

  • 特点
    • 容器通过虚拟网桥(docker0)互联。
    • 每个容器分配独立 IP 和端口,默认无法通过容器名解析(需自定义 DNS)。
  • 使用场景:单机环境下容器间隔离通信。

2. Host 模式

  • 特点
    • 容器直接使用主机网络,端口与主机共享。
    • 性能最高,但端口冲突风险大。
  • 示例
    docker run -d --name web_host --network host nginx
    

3. Overlay 模式

  • 特点
    • 支持跨主机容器通信(需 Swarm 集群或 Kubernetes)。
    • 使用 VXLAN 封装数据包。
  • 使用场景:分布式应用、微服务架构。

4. None 模式

  • 特点:容器无网络接口,仅保留 loopback 设备。
  • 示例
    docker run -d --name no_network --network none busybox sleep 3600
    

5. Macvlan 模式

  • 特点:为容器分配独立 MAC 地址,模拟物理设备。
  • 示例
    docker network create -d macvlan --subnet 192.168.1.0/24 --gateway 192.168.1.1 -o parent=eth0 mac_net
    
四、容器间通信

1. 同一网络内的通信

  • 自动 DNS 解析:同一网络内的容器可通过容器名互相访问。
  • 示例
    # 创建网络
    docker network create my_net
    
    # 启动两个容器并连接网络
    docker run -d --name web1 --network my_net nginx
    docker run -d --name web2 --network my_net nginx
    
    # 进入 web1 容器测试
    docker exec -it web1 curl http://web2
    

2. 跨网络通信

  • 方案:通过路由或代理实现。
  • 示例:使用 nginx 反向代理:
    # 创建两个网络
    docker network create net_a
    docker network create net_b
    
    # 启动代理容器并连接两个网络
    docker run -d --name proxy --network net_a --network net_b nginx
    
    # 启动两个服务容器
    docker run -d --name app1 --network net_a httpd
    docker run -d --name app2 --network net_b httpd
    
    # 配置代理规则,将 net_a 的请求转发到 app1,net_b 的请求转发到 app2
    
五、端口映射

1. 发布容器端口到主机

docker run -d --name web -p 8080:80 nginx  # 主机8080映射到容器80

2. 随机端口映射

docker run -d --name web -P nginx  # 随机映射暴露的端口

3. 查看端口绑定

docker port web
六、最佳实践

1. 使用自定义网络代替默认 bridge

  • 默认 bridge 网络不支持自动 DNS 解析,建议创建自定义网络:
    docker network create my_app_net
    

2. 合理规划子网和 IP 范围

  • 避免与主机或物理网络冲突:
    docker network create --subnet 172.18.0.0/16 my_private_net
    

3. 隔离不同环境的网络

  • 开发、测试、生产环境使用独立网络:
    docker network create dev_net
    docker network create prod_net
    

4. 使用 Compose 管理网络

  • 通过 docker-compose.yml 定义网络:
    services:
      web:
        networks:
          - frontend
      db:
        networks:
          - backend
    
    networks:
      frontend:
      backend:
    

5. 监控网络性能

  • 使用 docker stats 或第三方工具(如 ctop)监控网络流量。
七、常见问题

1. 容器无法通信

  • 原因:未连接同一网络或防火墙限制。
  • 解决
    • 检查网络连接:docker network inspect
    • 临时关闭防火墙测试:systemctl stop firewalld(CentOS)。

2. 端口冲突

  • 原因:主机端口已被占用。
  • 解决
    • 修改容器映射端口:-p 8081:80
    • 查找占用端口的进程:lsof -i :8080

3. DNS 解析失败

  • 原因:容器未连接自定义网络或 Docker DNS 配置错误。
  • 解决
    • 创建自定义网络并连接容器。
    • 检查 Docker DNS 配置(/etc/docker/daemon.json)。

4. Macvlan 无法获取 IP

  • 原因:物理网卡不支持或未启用混杂模式。
  • 解决
    • 启用混杂模式:ip link set eth0 promisc on
    • 检查网卡驱动兼容性。
八、总结
  • 核心命令docker network create/connect/disconnect/inspect
  • 网络模式:根据场景选择 bridge(默认)、host(高性能)、overlay(跨主机)。
  • 通信规则:同一网络内通过容器名解析,跨网络需路由或代理。
  • 最佳实践:自定义网络、合理规划子网、使用 Compose 管理。

网站公告

今日签到

点亮在社区的每一天
去签到