当我通过docker run启动任何容器时,我们得到一个新的veth interface.删除容器后,应删除与容器链接的veth接口.但是,有时它会失败(然后容器启动出错):
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
我如何识别哪些接口与现有容器链接,以及如何删除与已删除的对手链接的额外接口?
这种方式不起作用(通过root):
ifconfig veth55d245e down
brctl delbr veth55d245e
can't delete bridge veth55d245e: Operation not permitted
现在由传输流量定义的额外接口(如果没有活动,则是额外接口).
UPDATE
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
StorageDriver: aufs
RootDir:/var/lib/docker/aufs
BackingFilesystem: extfs
Dirs:502
Dirperm1Supported:false
ExecutionDriver:native-0.2
LoggingDriver: json-file
KernelVersion:3.13.0-53-generic
OperatingSystem:Ubuntu14.04.2 LTS
CPUs:8
TotalMemory:47.16GiB
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
>启动单个容器不应该将系统上的veth接口数增加2,因为当Docker创建一个veth对时,该对的一端在容器命名空间中被隔离,并且在主机中不可见.
>看起来你无法启动容器:
Error response from daemon:Cannot start container ...
> Docker应该自动清理veth接口.
这些事实让我怀疑你的环境中存在根本性的错误.您能否更新您的问题,详细说明您正在使用的分发版,哪个内核版本以及哪个Docker版本?
How I can identify which interfaces are linked with existing containers,and how I can remove extra interface which was linked with removed contrainers?
关于手动删除veth接口:veth接口不是桥接器,所以当然你不能用brctl删除它.
要删除veth接口:
# ip link delete <ifname> <="" code="">
检测“空闲”接口是一个棘手的问题,因为如果你只是看流量,你可能会意外删除仍在使用但没有看到太多活动的东西.
我认为你真正想要寻找的是veth接口,其对等体在全局网络命名空间中也是可见的.您可以使用these instructions找到veth接口的对等体,然后查看该接口是否可见,然后删除其中一个(删除veth接口也将删除其对等体)将是一件简单的事情.