咨询热线:4006-75-4006

售前:9:00-23:30    备案:9:00-18:00    技术:7*24h

Docker 网络进阶:构建自定义桥接网络实现容器隔离与互通

2026-02-10 17:36:57 676次

Docker 网络进阶:构建自定义桥接网络实现容器隔离与互通

欢迎来到8455线路检测中心技术小课堂,每天分享一个技术小知识。

在容器化部署中,网络配置是核心挑战之一。Docker 默认的 bridge网络虽然简单易用,但所有容器共享同一网段,缺乏隔离性,且容器间只能通过 IP 地址访问。为了解决多服务应用的网络需求,Docker 提供了强大的自定义网络功能,允许你创建独立的网络沙盒,实现精细化的服务发现和访问控制。本文将深入探讨如何创建和使用自定义 Docker 桥接网络。

一、为什么需要自定义网络?

默认的 bridge网络存在以下限制:

· 无自动服务发现:容器间无法通过容器名直接通信。

· 共享命名空间:所有容器在同一网络,安全性较低。

· 配置僵化:子网、网关、DNS 等参数固定,难以调整。

自定义桥接网络的优势

· 隔离环境:为不同项目或微服务组创建独立的网络。

· 内置 DNS 解析:同一网络内的容器可以通过容器名自定义网络别名直接互相访问。

· 更好的控制:可指定子网、网关、IP 地址范围,并配置网络驱动选项。

二、创建与配置自定义桥接网络

1. 基础创建

使用 docker network create命令创建一个名为 my-app-net的自定义桥接网络。

docker network create my-app-net

此命令会创建一个使用默认桥接驱动的新网络,并自动分配一个子网(如 172.18.0.0/16)。

2. 高级创建(指定子网与网关)

在生产环境中,建议明确指定 IP 地址范围,避免与现有网络冲突,并方便防火墙规则配置。

docker network create \\

  --driver bridge \\

  --subnet 10.10.0.0/24 \\

  --gateway 10.10.0.1 \\

  --ip-range 10.10.0.128/25 \\

  --label environment=production \\

  my-prod-net

参数解析

· --driver bridge:指定网络驱动为桥接(默认即是,可省略)。

· --subnet 10.10.0.0/24:定义网络的 CIDR 范围。

· --gateway 10.10.0.1:指定网关地址,通常是子网中的第一个可用 IP。

· --ip-range 10.10.0.128/25:可选的 IP 地址分配池。此例中,容器 IP 将从 10.10.0.128 10.10.0.254中分配。

· --label:为网络添加元数据标签,便于管理和过滤。

3. 验证与查看

# 列出所有 Docker 网络

docker network ls

 

# 查看 `my-prod-net` 的详细配置和已连接的容器

docker network inspect my-prod-net

三、实战应用:部署一个多服务应用

假设我们有一个简单的 Web 应用,包含一个 Nginx 前端容器和一个 MySQL 数据库容器。我们希望它们在一个私有网络中通信,同时 Nginx 需要暴露端口给宿主机访问。

步骤 1:创建专用网络

docker network create --subnet 172.20.0.0/24 app-network

步骤 2:启动 MySQL 容器并加入网络

使用 --network参数将容器连接到自定义网络,并使用 --network-alias为其设置一个网络内 DNS 别名。

docker run -d \\

  --name mysql-db \\

  --network app-network \\

  --network-alias db \\

  -e MYSQL_ROOT_PASSWORD=secret \\

  -v mysql_data:/var/lib/mysql \\

  mysql:8.0

关键点:现在,在此网络内的其他容器可以通过主机名 mysql-db或别名 db来访问这个数据库容器。

步骤 3:启动 Nginx 应用容器并加入同一网络

创建一个简单的 Nginx 配置文件 default.conf,其中 proxy_pass指令使用 MySQL 容器的别名。

server {

    listen 80;

    location / {

        proxy_pass http://www.landui.com:3306; # 使用网络别名 'db' 进行内部通信

        # ... 其他代理配置

    }

}

运行 Nginx 容器,并将配置文件挂载进去,同时映射宿主机端口。

docker run -d \\

  --name web-app \\

  --network app-network \\

  -p 8080:80 \\

  -v $(pwd)/default.conf:/etc/nginx/conf.d/default.conf \\

  nginx:alpine

步骤 4:测试连通性

1. 

进入 web-app容器内部,测试是否能通过容器名或别名解析并连接到数据库。

2. 

docker exec -it web-app sh

# 在容器内执行:

ping db           # 应该能成功 Ping 通

nc -zv db 3306    # 测试是否能连接到 MySQL 的 3306 端口

3. 

4. 

在宿主机上,访问 http://www.landui.com:8080来验证 Nginx 服务是否正常。

5. 

步骤 5:实现网络隔离(可选)

如果后续需要启动一个仅供管理使用的容器(如 phpMyAdmin),但不希望它直接暴露在应用网络中,可以创建第二个网络。

# 创建管理网络

docker network create admin-network

 

# 启动管理工具,同时连接到两个网络

docker run -d \\

  --name phpmyadmin \\

  --network admin-network \\

  --network app-network \\ # 连接到应用网络以访问 MySQL

  -p 8081:80 \\

  -e PMA_HOST=db \\       # 仍然使用别名 ‘db’

  phpmyadmin/phpmyadmin

 

# 将 MySQL 容器也连接到管理网络(如果需要从管理网络直接访问)

docker network connect admin-network mysql-db

这样,phpmyadmin既能通过 app-network访问数据库,又能通过独立的 admin-network与其他管理服务通信,实现了网络层面的职责分离。

四、管理与清理

# 将正在运行的容器从某个网络断开

docker network disconnect app-network phpmyadmin

 

# 删除一个自定义网络(确保没有容器连接在其中)

docker network rm my-prod-net

总结

通过创建自定义 Docker 桥接网络,你能够:

· 实现服务分组与隔离:为不同项目或环境(开发、测试、生产)创建专属网络。

· 简化服务间通信:利用内置的 DNS 服务发现,用容器名替代易变的 IP 地址。

· 构建复杂拓扑:一个容器可以连接多个网络,为实现微服务架构中的边车模式或管理平面/数据平面分离提供了基础。

将网络配置视为应用部署的一部分,并在 docker-compose.yml Kubernetes 清单文件中进行声明式管理,是迈向生产级容器化部署的重要一步。

8455线路检测中心官网上拥有完善的技术支持库可供参考,大家可自行查阅,更多技术问题,可以直接咨询。同时,8455线路检测中心整理了运维必备的工具包免费分享给大家使用,需要的朋友可以直接咨询。

更多技术知识,8455线路检测中心期待与你一起探索。

 

 


首页
最新活动
个人中心
XML 地图