Azure环境下VM与Docker容器网络连通故障排查求助
Azure容器实例无法访问VM内Oracle数据库的问题分析与修复
问题背景
在Azure搭建云环境时,VM运行Oracle数据库,容器需连接该库:
- 尝试复用VM的VNET给容器时,报错:
(SubnetDelegationsCannotChangeWhenSubnetUsedByResource) 子网的委派无法从[]更改为[Microsoft.ContainerInstance/containerGroups],因为该子网正被...VMNic/ipConfigurations/ipconfigvm资源使用
- 改为创建同地址空间(10.0.0.0/16)的独立VNET(子网10.0.1.0/24)后,容器仍无法访问数据库。
核心错误点
- 独立VNET间无对等连接:Azure默认隔离不同VNET,即便地址空间重叠,无对等连接则资源无法互访。
- NSG规则未允许私有子网流量:现有NSG规则仅放行
$whiteListIPAddresses(公网IP),未允许容器所在的10.0.1.0/24子网流量。 - 冗余VNET配置:脚本在
vmVNET下创建了containerSubnet却未使用,反而新建containerVNET,增加不必要的复杂度。 - VM子网未关联NSG:VM所在的
vmSubnet未绑定创建好的NSG,可能导致内部流量规则未生效。
修复步骤
1. 建立VNET对等连接
为两个VNET创建双向对等连接,允许内部流量互通:
# 创建vmVNET到containerVNET的对等连接 az network vnet peering create --name vm-to-container --resource-group $resourceGroup --vnet-name $vnetName --remote-vnet $vnetNameContainer --allow-vnet-access # 创建containerVNET到vmVNET的对等连接 az network vnet peering create --name container-to-vm --resource-group $resourceGroup --vnet-name $vnetNameContainer --remote-vnet $vnetName --allow-vnet-access
2. 更新NSG规则并绑定到VM子网
修改NSG规则,允许容器子网访问Oracle端口,同时将NSG绑定到VM所在子网:
# 更新Oracle端口规则,添加容器子网作为允许源 az network nsg rule update --resource-group $resourceGroup --nsg-name $netSecurityGroup --name allow-oracle --source-address-prefixes $whiteListIPAddresses 10.0.1.0/24 az network nsg rule update --resource-group $resourceGroup --nsg-name $netSecurityGroup --name allow-oracle-EM --source-address-prefixes $whiteListIPAddresses 10.0.1.0/24 # 将NSG绑定到VM所在的vmSubnet az network vnet subnet update --resource-group $resourceGroup --vnet-name $vnetName --name $vnetVmSubnet --network-security-group $netSecurityGroup
3. 可选:复用同一VNET的优化方案
若想避免独立VNET的复杂度,可在原VM的VNET下新建未被占用的子网并委派给容器实例:
# 在vmVNET下创建专属容器子网,添加委派 az network vnet subnet create --resource-group $resourceGroup --vnet-name $vnetName --name containerSubnet --address-prefixes 10.0.1.0/24 --delegations Microsoft.ContainerInstance/containerGroups # 创建容器时使用该子网 az container create --resource-group $resourceGroup --name importcontainer --image $imageTag --registry-login-server $loginServer --registry-username $spPullUserName --registry-password $spPullPassword --ip-address Private --vnet $vnetName --subnet containerSubnet
此方案不会触发子网委派报错,因为新子网未被任何资源占用。
4. 连接验证步骤
- 进入容器实例,执行
telnet $vmIp 1521测试端口连通性 - 检查Oracle监听配置,确保监听绑定到
0.0.0.0而非仅本地回环 - 确认VM内部防火墙(如iptables)允许1521端口的内部流量
内容的提问来源于stack exchange,提问作者TheRoadrunner
相关产品推荐
相关产品推荐

