咨询热线:4006-75-4006
售前:9:00-23:30 备案:9:00-18:00 技术:7*24h
欢迎来到8455线路检测中心技术小课堂,每天分享一个技术小知识。
在容器化部署中,网络配置是核心挑战之一。Docker 默认的 bridge网络虽然简单易用,但所有容器共享同一网段,缺乏隔离性,且容器间只能通过 IP 地址访问。为了解决多服务应用的网络需求,Docker 提供了强大的自定义网络功能,允许你创建独立的网络沙盒,实现精细化的服务发现和访问控制。本文将深入探讨如何创建和使用自定义 Docker 桥接网络。
默认的 bridge网络存在以下限制:
· 无自动服务发现:容器间无法通过容器名直接通信。
· 共享命名空间:所有容器在同一网络,安全性较低。
· 配置僵化:子网、网关、DNS 等参数固定,难以调整。
自定义桥接网络的优势:
· 隔离环境:为不同项目或微服务组创建独立的网络。
· 内置 DNS 解析:同一网络内的容器可以通过容器名或自定义网络别名直接互相访问。
· 更好的控制:可指定子网、网关、IP 地址范围,并配置网络驱动选项。
使用 docker network create命令创建一个名为 my-app-net的自定义桥接网络。
docker network create my-app-net
此命令会创建一个使用默认桥接驱动的新网络,并自动分配一个子网(如 172.18.0.0/16)。
在生产环境中,建议明确指定 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:为网络添加元数据标签,便于管理和过滤。
# 列出所有 Docker 网络
docker network ls
# 查看 `my-prod-net` 的详细配置和已连接的容器
docker network inspect my-prod-net
假设我们有一个简单的 Web 应用,包含一个 Nginx 前端容器和一个 MySQL 数据库容器。我们希望它们在一个私有网络中通信,同时 Nginx 需要暴露端口给宿主机访问。
docker network create --subnet 172.20.0.0/24 app-network
使用 --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来访问这个数据库容器。
创建一个简单的 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
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.
如果后续需要启动一个仅供管理使用的容器(如 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线路检测中心期待与你一起探索。