当我按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
现在由传输流量定义的额外接口(如果没有活动,它是额外的接口)。
更新
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
答案 0 :(得分:7)
这里有三个问题:
启动单个容器不应该将系统上veth
接口的数量增加2,因为当Docker创建veth
对时,该对的一端被隔离在容器中命名空间,并且在主机上不可见。
看起来你无法启动容器:
Error response from daemon: Cannot start container ...
Docker应该自动清理veth
接口。
这些事实让我怀疑你的环境中存在根本性的错误。您能否更新您的问题,详细说明您正在使用的分发版,哪个内核版本以及哪个Docker版本?
如何识别哪些接口与现有容器相关联,以及如何删除与已删除的反对者链接的额外接口?
关于手动删除veth
接口:veth
接口不是桥接器,因此您无法删除brctl
接口。
删除veth
界面:
# ip link delete <ifname>
检测“空闲”界面是一个棘手的问题,因为如果你只看流量,你可能会意外删除仍在使用但却没有看到太多活动的东西。
我认为您真正想要查找的是veth
接口,其对等端也在全局网络命名空间中可见。您可以使用these instructions找到veth
接口的对等方,然后查看该接口是否可见,然后删除其中一个(删除veth
将是一件简单的事情。 } interface也将删除其对等方。)
答案 1 :(得分:3)
通过升级泊坞窗修复到上一版本。 新版本:
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
现在接口与容器一起移除。通过以下命令手动删除旧的孤立接口:
# ip link delete <ifname>
答案 2 :(得分:1)
在这里,您可以按模式将它们全部删除。
for name in $(ifconfig -a | sed 's/[ \t].*//;/^\(lo\|\)$/d' | grep veth)
do
echo $name
# ip link delete $name # uncomment this
done