dokku Network 插件完全指南:Docker 网络管理与容器间通信实战
发布时间:2026/9/11 14:19:53 锦皓数字建站

dokku Network 插件完全指南Docker 网络管理与容器间通信实战【免费下载链接】dokkuA docker-powered PaaS that helps you build and manage the lifecycle of applications项目地址: https://gitcode.com/GitHub_Trending/do/dokku本篇技术指南围绕 dokku 的 Network 插件核心源码位于 plugins/network展开系统讲解 Docker 网络的生命周期管理创建、销毁、查询、信息展示、应用与自定义网络的三种挂接时机attach-post-create、attach-post-deploy、initial-network、网络别名与自定义 TLD、bind-all-interfaces端口绑定策略以及network:report报告体系。读完本文你将能够在不修改应用代码的前提下为 dokku 应用搭建安全的容器间通信链路、将内部管理工具通过 dokku 代理暴露并能在 CI/CD 中自动化管理与校验网络状态。Network 插件能做什么Network 插件plugins/network将 Docker 的容器网络管理抽象为一组 dokku 子命令允许开发者改变某个容器所挂接的网络挂接时机、挂接数量均可控在运行期按需重建网络配置例如 Docker 升级导致容器 IP 重置时通过全局属性与应用级属性的两级配置模型统一管理所有应用的网络行为。该功能自 dokku 0.11.0 引入并在 0.20.0 得到增强新增网络创建/销毁/列出/挂接能力。插件提供的完整命令集合如下network:create network # Creates an attachable docker network network:destroy network # Destroys a docker network network:exists network # Checks if a docker network exists network:info network [--format text|json] # Outputs information about a docker network network:list [--format text|json] [--dokku-managed] # Lists all docker networks network:report [app] [flag] # Displays a network report for one or more apps network:rebuild app # Rebuilds network settings for an app network:rebuildall # Rebuild network settings for all apps network:set app key (value) # Set or clear a network property for an app这些命令的底层实现分别对应 plugins/network/subcommands.go 中的CommandCreate、CommandDestroy、CommandExists、CommandInfo、CommandList、CommandReport、CommandSet等函数它们大多是对docker network系列命令的封装与增强。网络的生命周期管理以下network:list/network:create/network:destroy/network:exists命令均为 0.20.0 新增要求 Docker 1.21network:info为 0.35.3 新增。列出网络network:list查看宿主机上全部可用网络dokku network:list Networks bridge host none test-network如果你的脚本需要解析输出可以使用--quiet全局标志隐藏 dokku 的附加输出dokku --quiet network:listbridge host none test-networknetwork:list还支持--format标志合法取值为text默认与json。json输出适合自动化消费dokku network:list --format json[ {CreatedAt:2024-02-25T01:55:24.275184461Z,DokkuManaged:false,Driver:bridge,ID:d18df2d21433,Internal:false,IPv6:false,Labels:{},Name:bridge,Scope:local}, {CreatedAt:2024-02-25T01:55:24.275184461Z,DokkuManaged:true,Driver:bridge,ID:f50fa882e7de,Internal:false,IPv6:false,Labels:{com.dokku.network-name:test-network},Name:test-network,Scope:local}, {CreatedAt:2024-02-25T01:55:24.275184461Z,DokkuManaged:false,Driver:host,ID:ab6a59291443,Internal:false,IPv6:false,Labels:{},Name:host,Scope:local}, {CreatedAt:2024-02-25T01:55:24.275184461Z,DokkuManaged:false,Driver:null,ID:e2506bc8b7d7,Internal:false,IPv6:false,Labels:{},Name:none,Scope:local} ]其中DokkuManaged字段为true表示该网络由network:create创建为false表示它是 Docker 内置网络如bridge、host、none或由 dokku 之外创建的如 compose 生成的*_default网络。自动化脚本可以据此判断哪些网络由 dokku 负责。从源码看plugins/network/functions.go 中的getNetworks与DockerNetwork结构体该字段的实现依据是网络标签com.dokku.network-namedokku 在创建网络时写入该标签列出网络时只要发现该标签即标记为DokkuManaged: true。--dokku-managed标志可将输出限制为仅 dokku 创建的网络并且可以与--format组合使用dokku network:list --dokku-managed Networks test-network创建网络network:createdokku network:create test-network----- Creating network test-network该命令创建一个可挂接attachable的bridge网络可用于在容器之间路由请求而无需经过任何公网。在 subcommands.go 的CommandCreate中可以看到它等价于执行docker network create --attachable --label com.dokku.network-nametest-network test-network--attachable确保后续任意容器都能主动挂接进来--label则是上文所述的 dokku 托管标记。如果需要创建其他类型或带额外参数的网络可以直接使用docker命令完成。销毁网络network:destroy没有任何容器挂接的网络可以通过network:destroy销毁Docker 会拒绝删除仍有容器挂接的网络。dokku network:destroy test-network! WARNING: Potentially Destructive Action ! This command will destroy network test. ! To proceed, type test test ----- Destroying network test由于这是破坏性操作命令默认会要求确认输入网络名。在自动化场景中可以用--force跳过确认dokku --force network:destroy test-network----- Destroying network test源码中CommandDestroysubcommands.go还会检查环境变量DOKKU_APPS_FORCE_DELETE1——一旦设置即使不传--force也会跳过确认。检查网络是否存在network:existsCI/CD 流水线中常需要在创建网络前先判断其是否存在dokku network:exists nonexistent-networkNetwork does not exist该命令的退出码可直接用于条件判断网络不存在时返回非零存在时返回零CommandExists实现见 subcommands.go。查看网络信息network:infonetwork:info是docker network inspect的一个简化版本0.35.3 新增dokku network:info bridge bridge network information ID: d18df2d21433 Name: bridge Driver: bridge Scope: local Dokku managed: false同样支持--format标志json输出可自动化消费dokku network:info bridge --format json{CreatedAt:2024-02-25T01:55:24.275184461Z,DokkuManaged:false,Driver:bridge,ID:d18df2d21433,Internal:false,IPv6:false,Labels:{},Name:bridge,Scope:local}实现上CommandInfosubcommands.go会先校验--format取值只能是text或json再通过getNetworks()拉取全量网络并按名称查找目标网络。将应用路由到一个已知的 ip:port 组合某些场景下需要把应用路由到已有的$IP:$PORT组合上——典型场景是内部管理工具或非 dokku 运行、但希望经由 dokku 暴露 Web 界面的服务。实现方式是创建一个代理应用把请求转发到该地址。以下示例假设目标服务监听在127.0.0.1:8080# 创建应用 dokku apps:create local-app # 添加一个额外 host将 host.docker.internal 映射到 docker 网关 dokku docker-options:add local-app deploy --add-hosthost.docker.internal:host-gateway # 将 SERVICE_HOST 设置为映射后的主机名 dokku config:set local-app SERVICE_HOSThost.docker.internal # 将 SERVICE_PORT 设置为目标服务的端口 dokku config:set local-app SERVICE_PORT8080 # 设置期望的域名 dokku domains:set local-app local-app.dokku.me # 部署 service-proxy 镜像 dokku git:from-image local-app dokku/service-proxy:latest需要注意两点约束一个应用只能路由到一个$IP:$PORT组合该$IP:$PORT组合在首次部署时必须对 service-proxy 可访问否则代理应用无法启动。将应用挂接到自定义网络0.20.0 新增要求 Docker 1.21。挂接相关特性仅在使用 docker-local 调度器 时生效。应用默认关联到 Docker 的bridge网络或由initial-network属性指定的网络。通过修改attach-post-create或attach-post-deploy属性可以将应用挂接到任意attachable网络。属性变更后需要重新部署或重建应用才会生效。# 容器创建后、启动前挂接网络 # 常用于跨应用组网 dokku network:set node-js-app attach-post-create test-network # 部署成功且健康检查通过后、代理更新前挂接网络 # 需要先执行健康检查时的跨应用组网场景 dokku network:set node-js-app attach-post-deploy other-test-network # 容器创建时即挂接网络 # 通常会阻断对外部服务和外部路由的访问 dokku network:set node-js-app initial-network global-networkattach-post-create与attach-post-deploy都可以指定多个网络# 可指定一个或多个网络 dokku network:set node-js-app attach-post-create test-network test-network-2将属性设为空值即可解除容器与该网络的关联dokku network:set node-js-app attach-post-create dokku network:set node-js-app attach-post-deploy dokku network:set node-js-app initial-network注意host与bridge不能被用作 attach 属性值。在 subcommands.go 的CommandSet中attach-post-create/attach-post-deploy的每个取值都会先经过invalidNetworks校验且不能与另一 attach 属性取相同值避免同一次挂接出现冲突多值之间以逗号拼接存储。全局属性网络属性也可以全局设置。全局默认值为空字符串当应用未设置具体值时使用全局值。dokku network:set --global attach-post-create global-create-network dokku network:set --global attach-post-deploy global-deploy-network dokku network:set --global initial-network global-network同样地传入空值可恢复全局默认dokku network:set --global attach-post-create dokku network:set --global attach-post-deploy dokku network:set --global initial-network属性读取的优先级链路在 report.go 中实现reportComputedXxx系列函数先取应用级值为空再回退到全局值bind-all-interfaces还会在两者都为空时回退到内置默认false。网络别名Network Aliases仅当应用挂接到默认bridge网络之外的其他网络时该特性才可用。无论通过哪个属性挂接网络dokku 都会为部署容器添加形如APP.PROC_TYPE的网络别名可用于在容器之间做负载均衡。例如应用名为node-js-app、进程类型为web时网络内可解析的 DNS 记录为node-js-app.web该资源的完整 URL 取决于应用监听的PORT。通过 buildpack 构建的应用其PORT环境变量会被设置为5000因此内部请求应指向http://node-js-app.web:5000Dockerfile 构建的应用可能监听其他端口端口的具体指定方式参见 端口管理文档。从 triggers.go 的attachAppToNetwork可以看到别名的注入方式仅在phase deploy阶段执行docker network connect --alias ...并且除APP.PROC_TYPE外还会把容器 hostname 与别名拼接后作为第二个--alias传入从而支持容器间通过 hostname 精确寻址。指定自定义 TLD应用挂接网络时可以通过network:set指定自定义 TLD。该 TLD 会追加到所有挂接网络的应用.进程类型别名之后且不能按网络分别定制。默认值为空字符串。将应用的 TLD 设置为svc.cluster.localdokku network:set node-js-app tld svc.cluster.local对于名为node-js-app、进程类型为web的应用上述命令会把网络别名变为node-js-app.web.svc.cluster.local注意TLD 不影响容器端口处理发起内部网络请求时仍需显式指定容器端口。清空应用级 TLD恢复默认dokku network:set node-js-app tldTLD 同样支持全局设置全局默认值为空字符串应用未设置时使用全局值dokku network:set --global tld svc.cluster.localdokku network:set --global tld何时挂接容器到网络容器挂接网络的需求多种多样一个应用中的后台进程需要与另一个应用中的 Web 服务通信应用需要以安全的方式与不受 dokku 管理的容器通信存在一个允许透明访问其他主机的自定义网络且应用运行依赖它。无论出于何种原因理解两个网络钩子的语义都至关重要。三个属性的对比归纳如下属性适用阶段挂接时容器状态使用场景示例attach-post-createbuild构建中间容器、deploy部署的应用容器、runrun命令创建的容器created已创建但未运行容器需要访问网络上的资源应用首次启动时需要连接同一网络上的数据库attach-post-deploydeploy部署的应用容器running运行中网络上的其他容器需要访问本容器后台进程需要与容器暴露的 Web 进程通信initial-networkbuild、deploy、runcreated网络上的其他容器已在运行且本容器需要它向所有应用暴露自身的键值存储可放在initial-network上警告如果在running状态下挂接失败一旦旧容器被移除应用可能无法再响应代理请求。实现细节上attach-post-create由TriggerPostContainerCreatetriggers.go在容器创建阶段触发逐网络校验存在性后调用docker network connectattach-post-deploy由TriggerCorePostDeploytriggers.go在部署完成后触发它会遍历所有运行中的容器并按com.dokku.process-type标签识别进程类型后再挂接。initial-network则通过TriggerDockerArgsProcesstriggers.go以--networknetwork的形式注入到容器创建参数中这也解释了它为何会在容器创建时即生效。重建网络设置某些场景需要重建应用的网络配置例如应用启动或容器重启之后dokku network:rebuild node-js-app该命令返回的非零退出码取决于未能成功重建配置的容器数量。当 Docker 升级导致容器 IP 或端口被重置时可以一次性重写所有应用的网络配置文件dokku network:rebuildall同样返回的非零退出码取决于重建失败的容器数量。CommandRebuildallsubcommands.go会遍历所有应用逐一调用BuildConfig。而BuildConfignetwork.go的核心工作是通过ps-current-scale触发获取各进程类型的副本数逐一读取应用目录下的CONTAINER.type.index文件定位容器 ID确认容器运行中后查询其 IP最后通过network-write-ipaddr触发把 IP 写回应用根目录下的IP.type.index文件。这也是GetListenersnetwork.go读取IP.*/PORT.*文件拼装host:port监听列表的数据来源。容器网络接口绑定bind-all-interfaces该属性不控制 Docker 的--network标志如需管理该标志请使用 docker-options 插件。默认情况下应用只绑定到内部接口即 Docker 网桥接口docker0上的随机内网 IP。该行为可通过bind-all-interfaces网络属性按应用修改# 绑定到默认 docker 接口docker0上的随机内网 IP # 这是默认行为 dokku network:set node-js-app bind-all-interfaces false # 绑定到所有接口0.0.0.0上每个 upstream 端口的随机端口 # 这将使应用容器被你网络上其他主机直接访问 # 每次部署端口都会随机化例如 0.0.0.0:32771-5000/tcp dokku network:set node-js-app bind-all-interfaces true以默认情况为例每个容器都绑定在 docker 接口上docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1b88d8aec3d1 dokku/node-js-app:latest /bin/bash -c /star About a minute ago Up About a minute node-js-app.web.1此时容器的 IP 是内网 IP只能在宿主机本身上访问docker inspect --format {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}} node-js-app.web.1172.17.0.6将bind-all-interfaces设为true后容器将监听宿主机的 IP 地址dokku network:set node-js-app bind-all-interfaces true # 容器绑定到所有接口 docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d6499edb0edb dokku/node-js-app:latest /bin/bash -c /star About a minute ago Up About a minute 0.0.0.0:49153-5000/tcp node-js-app.web.1bind-all-interfaces也支持全局设置。全局默认值为false应用未设置时使用全局值dokku network:set --global bind-all-interfaces truedokku network:set --global bind-all-interfaces查看应用的网络报告使用network:report可以查看应用的网络状态报告dokku network:report node-js-app network information Network attach post create: Network attach post deploy: Network bind all interfaces: Network computed attach post create: Network computed attach post deploy: Network computed bind all interfaces:false Network computed initial network: Network computed tld: Network global attach post create: Network global attach post deploy: Network global bind all interfaces: Network global initial network: Network global tld: Network initial network: Network tld: Network web listeners: 172.17.0.1:5000 python-sample network information Network attach post create: Network attach post deploy: Network bind all interfaces: Network computed attach post create: Network computed attach post deploy: Network computed bind all interfaces:false Network computed initial network: Network computed tld: Network global attach post create: Network global attach post deploy: Network global bind all interfaces: Network global initial network: Network global tld: Network initial network: Network tld: Network web listeners: 172.17.0.2:5000 ruby-sample network information Network attach post create: Network attach post deploy: Network bind all interfaces: Network computed attach post create: Network computed attach post deploy: Network computed bind all interfaces:false Network computed initial network: Network computed tld: Network global attach post create: Network global attach post deploy: Network global bind all interfaces: Network global initial network: Network global tld: Network initial network: Network tld: Network web listeners:各属性在报告中的语义如下xxx/global-xxx键保存原始未合并值未设置时为空computed-xxx键保存有效值先回退到全局值若已设置再回退到内置默认值bind-all-interfaces为false其余为空。报告也可以只针对单个应用输出dokku network:report node-js-app node-js-app network information Network attach post create: Network attach post deploy: Network bind all interfaces: Network computed attach post create: Network computed attach post deploy: Network computed bind all interfaces:false Network computed initial network: Network computed attach post deploy: Network computed initial network: Network computed tld: Network global attach post create: Network global attach post deploy: Network global bind all interfaces: Network global initial network: Network global tld: Network initial network: Network tld: Network web listeners: 172.17.0.1:5000还可以传入标志只输出特定字段的值便于脚本解析dokku network:report node-js-app --network-bind-all-interfacesReportSingleAppreport.go实现了完整的标志注册表单应用模式下支持--network-bind-all-interfaces、--network-attach-post-create、--network-computed-*、--network-global-*、--network-static-web-listener、--network-web-listeners等标志--global模式下则只暴露全局与 computed 系列标志。属性一览可设置属性说明Report flags列列出network:report接受的 CLI 参数名。network:report --format json输出的 JSON 键为同名参数去掉--network-前缀例如attach-post-create、global-attach-post-create、computed-attach-post-create。带network-前缀的旧版键如network-attach-post-create在 0.38.x 弃用窗口期内仍会输出并将在未来的大版本中移除。属性作用域默认值Report flags描述attach-post-createapp global无--network-attach-post-create、--network-global-attach-post-create、--network-computed-attach-post-create容器创建后、部署阶段前立即挂接的网络attach-post-deployapp global无--network-attach-post-deploy、--network-global-attach-post-deploy、--network-computed-attach-post-deploy容器通过健康检查后挂接的网络bind-all-interfacesapp globalfalse--network-bind-all-interfaces、--network-global-bind-all-interfaces、--network-computed-bind-all-interfaces为true时容器绑定0.0.0.0而非默认的 Docker 网络地址initial-networkapp global无--network-initial-network、--network-global-initial-network、--network-computed-initial-network容器创建时即挂接的网络static-web-listener仅 app无--network-static-web-listener无容器运行时代理模板中使用的静态host:port覆盖值tldapp global无--network-tld、--network-global-tld、--network-computed-tld追加到自动生成的应用.进程类型别名后的顶级域名这些属性的注册与默认值定义在 network.go 的DefaultProperties与GlobalProperties中DefaultProperties声明了全部六个合法属性及默认值均为空字符串GlobalProperties则标记了哪些属性允许全局设置static-web-listener仅支持应用级。只读标志以下标志出现在network:report中但不由network:set管理——它由运行中的应用状态推导而来标志描述--network-web-listeners已部署应用web进程当前的监听器host:port列表测试与验证仓库的 tests/unit/network.bats 为上述行为提供了可执行的验证用例覆盖了属性读写与计算值合并network:report的 raw vs computed vs global、bind-all-interfaces设置、network:list --format json的DokkuManaged字段、--dokku-managed过滤、network:set attach的多网络挂接以及“不重复挂接同一网络”dont re-attach to network等关键场景。阅读这些测试可以帮助你更深入地理解各属性在真实容器环境中的行为边界。小结dokku 的 Network 插件把 Docker 网络管理收敛为一组语义清晰的子命令与两级应用级 全局级属性模型。核心要点可以归纳为网络对象管理network:create/network:destroy/network:exists/network:list/network:info覆盖了网络生命周期与查询的全部需求DokkuManaged标签机制让自动化脚本能准确识别 dokku 负责的网络三种挂接时机initial-network创建即挂接阻断外部路由、attach-post-create创建后启动前容器访问网络资源、attach-post-deploy健康检查后网络内其他容器访问本容器各自服务于不同的组网拓扑别名与 TLDAPP.PROC_TYPE别名支持跨应用负载均衡自定义 TLD如svc.cluster.local让别名可被 k8s 风格的内部 DNS 体系解析端口绑定策略bind-all-interfaces决定容器是仅绑定内部网桥还是绑定0.0.0.0直接暴露到局域网故障恢复network:rebuild与network:rebuildall可在 Docker 升级导致 IP/端口重置后快速恢复网络配置。结合本文给出的命令与 plugins/network 源码实现你可以按需为应用搭建隔离、安全且可自动化的容器网络环境。【免费下载链接】dokkuA docker-powered PaaS that helps you build and manage the lifecycle of applications项目地址: https://gitcode.com/GitHub_Trending/do/dokku创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。