首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何识别孤立的veth接口以及如何删除它们?

如何识别孤立的veth接口以及如何删除它们?
EN

Stack Overflow用户
提问于 2015-08-13 13:18:22
回答 4查看 25K关注 0票数 12

当我通过docker run启动任何容器时,我们会得到一个新的veth接口。删除容器后,删除与容器连接的veth接口。但是,有时它会失败(通常情况下容器以错误开头):

代码语言:javascript
复制
root@hostname /home # ifconfig | grep veth | wc -l
53
root@hostname /home # docker run -d -P  axibase/atsd -name axibase-atsd-
28381035d1ae2800dea51474c4dee9525f56c2347b1583f56131d8a23451a84e
Error response from daemon: Cannot start container 28381035d1ae2800dea51474c4dee9525f56c2347b1583f56131d8a23451a84e: iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 33359 -j DNAT --to-destination 172.17.2.136:8883 ! -i docker0: iptables: No chain/target/match by that name.
 (exit status 1)
root@hostname /home # ifconfig | grep veth | wc -l
55
root@hostname /home # docker rm -f 2838
2838
root@hostname /home # ifconfig | grep veth | wc -l
55

如何识别哪些接口与现有容器连接,以及如何删除与已删除的违禁品相关联的额外接口?

这种方法不起作用(从根上):

代码语言:javascript
复制
ifconfig veth55d245e down
brctl delbr veth55d245e
can't delete bridge veth55d245e: Operation not permitted

额外的接口现在由传输的流量定义(如果没有活动,它就是额外的接口)。

更新

代码语言:javascript
复制
root@hostname ~ # uname -a
Linux hostname 3.13.0-53-generic #89-Ubuntu SMP Wed May 20 10:34:39 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

root@hostname ~ # docker info
Containers: 10
Images: 273
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 502
 Dirperm1 Supported: false
Execution Driver: native-0.2
Logging Driver: json-file
Kernel Version: 3.13.0-53-generic
Operating System: Ubuntu 14.04.2 LTS
CPUs: 8
Total Memory: 47.16 GiB
Name: hostname
ID: 3SQM:44OG:77HJ:GBAU:2OWZ:C5CN:UWDV:JHRZ:LM7L:FJUN:AGUQ:HFAL
WARNING: No swap limit support

root@hostname ~ # docker version
Client version: 1.7.1
Client API version: 1.19
Go version (client): go1.4.2
Git commit (client): 786b29d
OS/Arch (client): linux/amd64
Server version: 1.7.1
Server API version: 1.19
Go version (server): go1.4.2
Git commit (server): 786b29d
OS/Arch (server): linux/amd64
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-08-14 10:33:54

修正了升级到最后一个版本。新版本:

代码语言:javascript
复制
root@hostname ~ # docker version
Client:
 Version:      1.8.1
 API version:  1.20
 Go version:   go1.4.2
 Git commit:   d12ea79
 Built:        Thu Aug 13 02:35:49 UTC 2015
 OS/Arch:      linux/amd64

Server:
 Version:      1.8.1
 API version:  1.20
 Go version:   go1.4.2
 Git commit:   d12ea79
 Built:        Thu Aug 13 02:35:49 UTC 2015
 OS/Arch:      linux/amd64

现在,接口与容器一起移除。通过以下命令手动删除了旧的孤立接口:

代码语言:javascript
复制
# ip link delete <ifname>
票数 5
EN

Stack Overflow用户

发布于 2015-08-13 13:27:09

这里有三个问题:

  1. 启动单个容器不应将系统上的veth接口数量增加2,因为当Docker创建veth对时,该对的一端在容器命名空间中被隔离,在主机上不可见。
  2. 看起来你无法启动一个容器: 来自守护进程的错误响应:无法启动容器.
  3. Docker应该自动清理veth接口。

这些事实使我怀疑在你的环境中有一些根本的错误。您能否更新您的问题,详细说明您正在使用的发行版、哪个内核版本和哪个Docker版本?

如何识别哪些接口与现有容器连接,以及如何删除与已删除的违禁品相关联的额外接口?

关于手动删除veth接口:veth接口不是桥,所以当然不能用brctl来删除。

若要删除veth接口,请执行以下操作:

代码语言:javascript
复制
# ip link delete <ifname>

检测“空闲”接口是一个更棘手的问题,因为如果您只查看流量,您可能会意外地删除一些仍在使用但没有看到太多活动的内容。

我认为您实际上需要寻找的是veth接口,它的对等点在全局网络命名空间中也是可见的。您可以使用veth找到这些指示接口的对等点,然后简单地查看该接口是否可见,然后删除其中的一个或另一个(删除veth接口也将删除其对等点)。

票数 8
EN

Stack Overflow用户

发布于 2020-03-18 07:55:58

下面是如何按模式将它们全部删除的方法。

代码语言:javascript
复制
for name in $(ifconfig -a | sed 's/[ \t].*//;/^\(lo\|\)$/d' | grep veth)
do
    echo $name
    # ip link delete $name # uncomment this
done
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31989426

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档