docker network 命令(一文讲透)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观

前言

在容器化技术中,网络配置是连接服务、实现容器间通信的核心环节。Docker Network 命令为开发者提供了一套标准化的工具,能够快速定义和管理容器网络拓扑。无论是搭建微服务架构,还是模拟复杂网络环境,掌握 Docker Network 的核心命令都是开发者的必备技能。本文将从基础概念到实战案例,系统讲解 Docker Network 命令的使用逻辑,并通过类比和代码示例帮助读者建立直观认知。


一、Docker Network 的核心概念

1.1 网络模型:容器通信的“交通系统”

Docker 网络可以类比为城市的交通系统:每个容器是“车辆”,网络是“道路”,而 IP 地址则是“车牌号”。Docker 内置了多种网络驱动(如 bridge、host、none),它们定义了容器如何与外部或彼此之间交互。

常见网络类型

网络类型工作原理典型场景
bridge默认网络,通过虚拟网桥实现容器间隔离通信通用容器间通信
host容器直接复用主机网络,无网络隔离性能敏感的服务
none完全禁用网络,容器无法与其他容器或主机通信需要手动配置网络的场景
overlay跨主机通信,用于 Docker Swarm 等集群环境分布式服务部署

1.2 网络命名空间:隔离的“虚拟道路”

每个 Docker 网络都会创建独立的命名空间(Network Namespace),确保容器间的通信不会干扰其他网络环境。例如,两个不同网络中的容器即使使用相同 IP,也能安全运行。


二、Docker Network 命令的核心功能

2.1 列出网络:查看现有的“道路布局”

使用 docker network ls 可以查看所有网络及其状态:

docker network ls

过滤与筛选

通过 --filter 参数可按名称或驱动类型筛选:

docker network ls --filter "driver=bridge"  

2.2 创建自定义网络:设计“专属道路”

通过 docker network create 可定义具有特定属性的网络。例如,指定子网和网关:

docker network create \  
  --driver bridge \  
  --subnet 192.168.100.0/24 \  
  --gateway 192.168.100.1 \  
  my_custom_net  

动态分配 vs 固定 IP

  • 动态分配:默认由 Docker 自动分配 IP(如 172.18.0.2)。
  • 固定 IP:通过 --ip 参数指定容器 IP,避免服务重启后地址变化:
    docker run -d \  
      --name web-app \  
      --network my_custom_net \  
      --ip 192.168.100.10 \  
      nginx  
    

2.3 连接与断开容器:车辆驶入/驶出道路

连接容器到网络

docker run -d \  
  --name db_container \  
  --network my_custom_net \  
  mysql:latest  

后连接操作

若容器已运行,可使用 docker network connect 动态加入网络:

docker network connect my_custom_net existing_container  

断开容器

docker network disconnect my_custom_net db_container  

2.4 深入网络细节:查看“道路地图”

docker network inspect 可查看网络配置详情,包括 IP 分配和路由规则:

docker network inspect my_custom_net  

三、高级用法:构建复杂网络拓扑

3.1 跨宿主机通信:搭建“高速公路”

通过 overlay 网络实现 Docker Swarm 集群内的跨主机通信:

docker network create \  
  --driver overlay \  
  --attachable \  
  my_global_net  

3.2 服务发现:容器间的“导航系统”

在自定义网络中,容器可通过名称直接访问其他容器。例如:

curl http://db_container:3306  

3.3 混合网络:多“道路”并行

一个容器可同时连接多个网络:

docker run -d \  
  --name hybrid_app \  
  --network my_custom_net \  
  --network another_net \  
  nginx  

四、实战案例:电商系统的网络配置

4.1 场景描述

搭建一个包含 Web 服务、数据库和 Redis 缓存的电商系统,要求:

  • Web 服务通过 Nginx 公开访问
  • 数据库与 Redis 仅在私有网络内通信

4.2 实现步骤

1. 创建隔离网络

docker network create \  
  --driver bridge \  
  --subnet 192.168.200.0/24 \  
  backend_net  

2. 运行数据库和 Redis

docker run -d \  
  --name mysql_db \  
  --network backend_net \  
  mysql:8.0  

docker run -d \  
  --name redis_cache \  
  --network backend_net \  
  redis:latest  

3. 部署 Web 服务

docker run -d \  
  --name web_server \  
  --network backend_net \  
  -p 80:80 \  
  nginx  

4. 验证通信

在 Web 容器内尝试访问数据库:

docker exec -it web_server \  
  curl mysql_db:3306  

五、常见问题与注意事项

5.1 网络命名规范

  • 避免使用保留名称(如 hostnone)。
  • 推荐使用 myapp_net 等语义化名称。

5.2 IP 冲突与规划

  • 避免手动分配 IP 与子网范围重叠。
  • 使用 docker network prune 清理废弃网络。

5.3 安全性配置

  • 通过 --ip 参数固定关键服务 IP。
  • 在生产环境启用防火墙规则限制端口访问。

结论

Docker Network 命令是容器化系统设计的核心工具,通过灵活的网络配置,开发者可以构建高可用、可扩展的服务架构。本文从基础到高级用法,结合案例和代码示例,展示了如何通过 docker network 系列命令实现容器间的高效通信。掌握这些技能后,读者可以更自信地设计复杂的微服务拓扑,或在 DevOps 流程中优化容器网络性能。

建议读者通过实际操作加深理解,例如尝试创建自定义网络并部署多容器应用。Docker Network 的强大功能远不止于此,后续可进一步探索覆盖网络(Overlay)、IPv6 支持等进阶主题。

最新发布