七.Docker网络

七.Docker网络

1. 概述

Docker 网络是容器间以及容器与外部网络通信的基础架构,提供了多种网络模式来满足不同的应用场景

Docker 提供多种网络驱动来适应不同需求:

bridge: 默认网络模式

host: 共享主机网络

none: 无网络

overlay: 跨主机网络

macvlan: 物理网络连接

Docker启动后会产生一个名称为docker0的虚拟网络

查看docker网络模式:默认创建3种网络模式

bash 复制代码
docker network ls

2.常见命令

bash 复制代码
查看网络:docker network Is
#基本用法,列出所有网络
docker network Is
# 过滤显示
docker network ls --filter driver=bridge
docker network ls --filter name=my-network
docker network ls --filter label=env=production

查看网络详细信息:docker network inspect 网络名字
# 查看默认 bridge 网络
docker network inspect bridge

# 查看指定网络
docker network inspect my-network

创建一个网络:docker network create 网络名字
# 创建默认 bridge 网络
docker network create my-network
# 创建自定义 subnet 网络
docker network create --subnet=192.168.1.0/24 my-network
# 创建带 IP 范围的网络
docker network create \
  --subnet=192.168.1.0/24 \
  --ip-range=192.168.1.128/25 \
my-network
# 创建不同驱动的网络
docker network create --driver bridge my-bridge
docker network create --driver overlay my-overlay

删除网络:docker network rm网络名字
# 删除单个网络
docker network rm my-network
# 删除多个网络
docker network rm network1 network2
# 删除所有未使用的网络
docker network prune
# 删除时确认提示
docker network prune -f

连接容器到网络:docker network connect
# 连接运行中的容器到网络
docker network connect my-network my-container
# 连接时指定别名
docker network connect --alias web my-network my-container
# 连接时指定 IP 地址
docker network connect --ip 192.168.1.10 my-network my-container

断开容器网络连接:docker network disconnect
# 断开容器网络连接
docker network disconnect my-network my-container
# 强制断开连接
docker network disconnect -f my-network my-container

端口映射相关
# 发布多个端口
docker run -p 8080:80 -p 8443:443 nginx
# 发布所有暴露端口
docker run -P nginx
# 绑定到特定 IP
docker run -p 127.0.0.1:8080:80 nginx
# 发布 UDP 端口
docker run -p 53:53/udp bind

自定义网络创建示例
# 创建生产环境网络
docker network create \
  --driver bridge \
  --subnet=172.20.0.0/16 \
  --ip-range=172.20.240.0/20 \
  --gateway=172.20.0.1 \
  --label env=production \
  --opt com.docker.network.bridge.name=prod-bridge \
  prod-network

# 创建开发环境网络
docker network create \
  --driver bridge \
  --subnet=172.21.0.0/16 \
  dev-network
  
网络连通性测试
# 在容器内测试网络
docker exec container-name ping google.com
docker exec container-name curl http://service-name:8080
# 查看容器网络配置
docker exec container-name ip addr
docker exec container-name route -n
# 查看容器网络统计
docker exec container-name netstat -i

端口检查
# 查看容器端口映射
docker port container-name
# 在主机上检查端口占用
netstat -tlnp | grep :8080
ss -tlnp | grep :8080

Docker 网络调试
# 查看 Docker 网络详细日志
docker info | grep -i network
# 查看网络驱动信息
docker info --format '{{.Plugins.Network}}'
# 检查网络配置
docker network ls -q | xargs docker network inspect

网络性能和安全
# 创建网络时设置 MTU, 是网络接口能够传输的最大数据包大小,以字节为单位
docker network create \
  --opt com.docker.network.driver.mtu=1454 \
  my-network
# 在 daemon.json 中全局设置
{
  "mtu": 1454
}

# 创建内部网络(无外网访问)
docker network create \
  --internal \
  internal-network

# 禁用网络服务发现
docker network create \
  --opt com.docker.network.bridge.enable_icc=false \
  isolated-network

3.网络模式

docker容器内部的ip是有可能会发生改变的

  • bridge模式:使用-network bridge指定,默认使用docker0

    Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络,让主机和容器之间可以通过网桥相互通信。

    Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。

    网桥docker0创建一堆虚拟设备接口叫veth,每个容器实例内部也有一块网卡,每个接口叫eth0;docker0上面的每个veth匹配某个容器实例内部的eth0,两两配对,一一匹配。

  • host模式:使用-network host指定

    直接使用宿主机的 IP 地址与外界进行通信,不再需要额外进行NAT 转换。

    容器将不会获得一个独立的Network Namespace, 而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡而是使用宿主机的IP和端口。

  • none模式:使用-network none指定

    在none模式下(禁用网络),不为Docker容器进行任何网络配置。即Docker容器没有网卡、IP、路由等信息,只有一个lo(127.0.0.1)。

    例:docker run -d -p 8084:8080 --network none --name tomcat84 billygoo/tomcat8-jdk8

  • container模式:使用--network container:容器NAME或者容器ID

    新建的容器和已经存在的一个容器共享一个网络ip配置而不是和宿主机共享。两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。

    例:docker run -it -network container:name1 --name name2 centos /bin/sh

  • 自定义网络

    自定义网络的核心作用

    1. 网络隔离与安全
      实现不同应用间的网络隔离
      控制容器间的通信权限
      提供更安全的网络环境
    2. 服务发现与DNS解析
      容器间可通过容器名直接通信
      自动DNS解析,无需手动配置IP
      支持网络别名实现负载均衡
    3. 灵活的网络拓扑
      可动态连接/断开网络
      支持多网络连接
      可自定义IP地址和子网
    4. 跨主机通信
      Overlay网络支持集群环境
      实现分布式应用部署

    不同场景的解决方案

    场景一:单主机多应用隔离

    适用情况:同一台主机上运行多个独立应用

    bash 复制代码
    # 为每个应用创建独立网络
    docker network create app1-network
    docker network create app2-network
    
    # 应用1的容器组
    docker run -d --name app1-db --network app1-network mysql:8.0
    docker run -d --name app1-web --network app1-network nginx:alpine
    
    # 应用2的容器组
    docker run -d --name app2-db --network app2-network postgres:13
    docker run -d --name app2-web --network app2-network nginx:alpine

    优势:

    完全隔离不同应用的网络通信

    防止意外的网络访问

    简化应用管理

    场景二:微服务架构部署

    适用情况:前后端分离的微服务应用

    bash 复制代码
    # 创建分层网络
    docker network create frontend-network
    docker network create backend-network
    
    # 数据库层(仅后端网络)
    docker run -d --name database --network backend-network mysql:8.0
    
    # 应用服务层(连接前后端网络)
    docker run -d --name api-server \
      --network backend-network \
      --network-alias api \
      my-api:latest
    
    # Web前端(仅前端网络)
    docker run -d --name web-server \
      --network frontend-network \
      nginx:alpine
    
    # 反向代理(连接前端网络,可访问API)
    docker run -d --name reverse-proxy \
      --network frontend-network \
      --network backend-network \
      nginx:alpine

    优势:

    明确的服务边界

    控制数据流向

    提高安全性

    场景三:开发测试环境

    适用情况:为不同开发团队或项目创建独立环境

    bash 复制代码
    # 为不同团队创建网络
    docker network create teamA-dev-network
    docker network create teamB-dev-network
    
    # 团队A的开发环境
    docker run -d --name teamA-mysql --network teamA-dev-network mysql:8.0
    docker run -d --name teamA-redis --network teamA-dev-network redis:alpine
    docker run -d --name teamA-app --network teamA-dev-network my-app:dev
    
    # 团队B的开发环境
    docker run -d --name teamB-mysql --network teamB-dev-network mysql:8.0
    docker run -d --name teamB-redis --network teamB-dev-network redis:alpine
    docker run -d --name teamB-app --network teamB-dev-network my-app:dev

    优势:

    环境完全隔离

    避免资源冲突

    便于并行开发

    场景四:负载均衡与高可用

    适用情况:需要实现服务负载均衡

    bash 复制代码
    # 创建服务网络
    docker network create service-network
    
    # 多个应用实例
    docker run -d --name web1 --network service-network --network-alias web nginx:alpine
    docker run -d --name web2 --network service-network --network-alias web nginx:alpine
    docker run -d --name web3 --network service-network --network-alias web nginx:alpine
    
    # 负载均衡器
    docker run -d --name load-balancer \
      --network service-network \
      -p 80:80 \
      haproxy:alpine

    优势:

    自动服务发现

    内置负载均衡

    动态扩展支持

    场景五:跨主机集群部署

    适用情况:Docker Swarm或Kubernetes集群环境

    bash 复制代码
    # 创建overlay网络(适用于Swarm)
    docker network create -d overlay \
      --subnet=192.168.1.0/24 \
      --attachable \
      cluster-network
    
    # 在不同节点部署服务
    docker service create \
      --name database \
      --network cluster-network \
      mysql:8.0
    
    docker service create \
      --name web \
      --network cluster-network \
      --replicas 3 \
      nginx:alpine

    优势:

    跨主机通信

    服务编排支持

    高可用性

    场景六:网络调试与监控

    适用情况:需要监控网络流量或调试网络问题

    bash 复制代码
    # 创建监控网络
    docker network create monitoring-network
    
    # 应用容器
    docker run -d --name app --network monitoring-network my-app:latest
    
    # 网络监控容器(连接同一网络)
    docker run -d --name network-monitor \
      --network monitoring-network \
      --cap-add NET_ADMIN \
      nicolaka/netshoot \
      tcpdump -i any -w /data/capture.pcap

    优势:

    便于网络问题排查

    支持流量监控

    不影响应用容器

相关推荐
小坏讲微服务2 小时前
五分钟使用 Docker-compose搭建 Redis 8.0 中间件
运维·redis·docker·中间件·容器·kubernetes·k8s
Aimyon_363 小时前
MinerU Docker自定义版本部署
运维·docker·容器
梁正雄5 小时前
19、docker跨主机网络 Overlay\Underlay
网络·docker·容器
Hover_Z_快跑8 小时前
Docker 部署 Elasticsearch 8.12 + Kibana + Nginx 负载均衡
nginx·elasticsearch·docker
爱宇阳9 小时前
Vue3 前端项目 Docker 容器化部署教程
前端·docker·容器
帅帅梓10 小时前
docker 资源限制
运维·docker·容器
可乐大数据12 小时前
Docker安装(基于云服务器ECS实例 CentOS 7.9系统)
服务器·docker·centos
一只大耗子。13 小时前
Mac M系列芯片制作Oracle19镜像使用docker-compose运行
docker·docker-compose·mac·oracle19c
梁正雄14 小时前
18、docker-macvlan-2-示例
运维·docker·容器·macvlan