Docker 容器不能ping通默认网关(172.17.0.1)--已解决

(如果想直接解决问题,直接拖到最后,

如果想熟悉一下定位思路前边的也可以顺带看一下)

楼主在全用docker 时发现自带的网桥在生成container后,ping不通,我的另一篇文章中写了在第一次用docker时,如何生新定义一下bridge,然后配置成docker默认的网桥。工作已经正常。

 

现在楼主有新的需求,要自己重新定义一个新的网络,和默认的网桥的网段不一样, 我目前 默认的网段为172.16.0.x, 

目前想单独创建一个网段给集群用,为172.15.0.x/24.

网段创建成功: docker network create --subnet=172.15.0.0/24 mynet1

创建tomcat容器时也用的这个网络:docker run -d --name tomcatMynet1 --network mynet1 -p 8994:8080 tomcat

但是在进入容器后不能ping通172.15.0.1(但是两个tomcat容器之间可以ping 通)

那我就在想,我之前用的

brctl create 的新的bridge ,配置给docker成为默认的网络,都可以正常工作,为什么现在创建新的网络又不行了呢。

再用docker network inspect 查看一下能工作和不能工作的network 对比发现有以下区别:

<think> 我们正在讨论在Ubuntu系统中执行命令:`sudo ip route add 172.17.0.2/16 via 172.17.0.1` 这个命令尝试添加一条静态路由,其含义是:将所有目标地址在172.17.0.0/16网段内的流量过网172.17.0.1转发。 但是,这个命令存在几个键问题: 1. **目标网络地址的写法问题**: 命令中使用了`172.17.0.2/16`,这实际上是一个不规范的写法。因为`172.17.0.2`是一个具体的主机地址,而`/16`表示网络掩码(255.255.0.0)。当我们写网络地址时,应该使用网络地址(即该网段的第一个地址),所以正确的网络地址应该是`172.17.0.0/16`。但这里注意,如果我们要添加的是整个网段,应该写成`172.17.0.0/16`。如果只想针对单个主机(172.17.0.2),则应该使用`172.17.0.2/32`。 2. **网地址的合理性**: 网地址`172.17.0.1`必须与当前系统的某个接口在同一网段,否则路由无法生效。例如,如果当前系统有一个接口的IP地址在172.17.0.0/16网段内(比如172.17.0.5),那么网172.17.0.1应该是该网段的网。 3. **路由冲突**: 如果系统已经存在一条到172.17.0.0/16的路由(例如默认网关或其他接口),那么新添加的这条路由可能会造成冲突。需要确保新路由的优先级(metric)或者具体性(更长的子网掩码)能够正确覆盖。 因此,正确的命令应该是: - 针对整个172.17.0.0/16网段:`sudo ip route add 172.17.0.0/16 via 172.17.0.1` - 针对单个主机172.17.0.2:`sudo ip route add 172.17.0.2/32 via 172.17.0.1` 下面详细解释命令: ### 命令解析:`sudo ip route add <目标网络> via <网>` - **目标网络**:使用CIDR表示法(如172.17.0.0/16)指定要路由的目标网络。 - **网**:数据包要发送到的下一跳地址。该网必须直接可达(即与系统某个接口在同一网段)。 ### 使用场景 这条命令常用于: - 当目标网络(172.17.0.0/16)不在系统的默认路由路径上时,需要指定特定的网- 在多个网络接口的环境下,将特定网段的流量引导至特定的网。 ### 验证路由 添加后,可以使用以下命令查看: ```bash ip route show ``` 或者查看特定路由: ```bash ip route get 172.17.0.5 # 测试去往172.17.0.5的路由 ``` ### 持久化配置 注意,使用`ip route add`添加的路由在重启后会失效。要使路由永久生效,需要将配置写入网络配置文件(如使用netplan)。 例如,在Ubuntu 18.04及以上版本中,可以编辑Netplan配置文件(/etc/netplan/*.yaml): ```yaml network: version: 2 renderer: networkd ethernets: ens33: # 接口名 routes: - to: 172.17.0.0/16 via: 172.17.0.1 metric: 100 # 可选,设置优先级 ``` 然后应用配置: ```bash sudo netplan apply ``` ### 常见问题 1. **网不可达**:如果网地址不在任何本地接口的网段内,则路由添加会失败。 2. **路由冲突**:如果已经存在一条更具体的路由(例如172.17.0.0/24),那么新添加的/16路由将不会用于该子网。 ### 引用说明 在用户提供的引用中,提到重启网络服务后临时路由会失效[^1],因此持久化配置非常重要。另外,在设置固定IP时,需要确保网设置正确(引用[^2]中提到网设置问题)。 ### 结论 您执行的命令中目标网络地址写法不规范,需要修正。同时,请确保网地址与您的系统在同一网段。 如果您的实际需求是访问172.17.0.2主机,建议使用: ```bash sudo ip route add 172.17.0.2/32 via 172.17.0.1 ``` 如果需要访问整个172.17.0.0/16网段,则使用: ```bash sudo ip route add 172.17.0.0/16 via 172.17.0.1 ``` 最后,建议过持久化配置来确保重启后仍然有效。 §§相问题§§ 1. 如何永久添加静态路由在Ubuntu系统中? 2. 如何验证静态路由是否正确生效? 3. 当添加静态路由时遇到"Network is unreachable"错误应如何解决? 4. Netplan配置静态路由的完整语法是什么? 5. 如何删除已添加的静态路由? </think> ### 在Ubuntu系统中执行 `sudo ip route add 172.17.0.2/16 via 172.17.0.1` 命令解析 #### 1. **命令语法问题** 该命令存在两个键语法问题: - **目标地址错误**:`172.17.0.2/16` 是无效写法 - `/16` 表示整个子网(如 `172.17.0.0/16`) - 若需指向特定主机,应改为 `172.17.0.2/32` - **网地址冲突**:网 `172.17.0.1` 与目标地址同网段,可能造成路由环路[^1] **正确形式**: ```bash # 添加主机路由 sudo ip route add 172.17.0.2/32 via 172.17.0.1 # 添加子网路由 sudo ip route add 172.17.0.0/16 via 192.168.1.1 # 网需不同网段 ``` $$ \text{路由决策逻辑:} \quad \text{目标IP} \xrightarrow{\text{匹配}} \begin{cases} \text{主机路由} & /32 \\ \text{子网路由} & /16 \sim /24 \\ \text{默认路由} & \text{default} \end{cases} $$ --- #### 2. **命令作用与场景** 此命令用于静态路由配置: - **核心功能**:强制将目标地址的流量导向指定网 - **典型场景**: - 访问隔离网络(如 Docker 容器网络 `172.17.0.0/16`) - 跨 VLAN - 替代默认路由的特殊路径 --- #### 3. **执行效果验证** ```bash # 查看路由表 ip route show # 测试连性(需先确保网可达) ping 172.17.0.2 ``` **预期输出**: ``` 172.17.0.2 via 172.17.0.1 dev eth0 # 添加成功 ``` --- #### 4. **持久化配置方法(推荐)** 临时路由重启失效[^1],需过 Netplan 永久配置: ```yaml # /etc/netplan/01-netcfg.yaml network: version: 2 ethernets: eth0: routes: - to: 172.17.0.0/16 # 目标子网 via: 192.168.92.1 # 正确网(不同网段) metric: 100 # 路由优先级 ``` 应用配置: ```bash sudo netplan apply ``` --- #### 5. **常见错误处理** | 错误现象 | 原因 | 解决方案 | |---------|------|----------| | `RTNETLINK: Network is unreachable` | 网不可达 | 检查网IP是否可达 | | `RTNETLINK: File exists` | 路由已存在 | 先删除旧路由 `sudo ip route del 172.17.0.0/16` | | 流量不 | 网无返回路径 | 在目标设备添加返程路由[^2] | > **键点**:静态路由需双向配置,源设备和目标设备均需正确路由[^2]。
评论 13
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值