由于设备映射器错误,无法运行Docker容器

时间:2014-07-12 04:43:08

标签: docker lxc lvm device-mapper

我再也无法在Docker中创建和运行新容器了。 但同时可以运行以前创建的容器。

当我尝试做这样的事情时:

[user@host ~ ] docker run --name=fpm-5.3 debian:jessie
2014/07/12 07:34:08 Error: Error running DeviceCreate (createSnapDevice) dm_task_run failed

来自 docker.log

2014/07/12 05:57:11 POST /v1.12/containers/create?name=fpm-5.3
[f56fcb6f] +job create(fpm-5.3)
Error running DeviceCreate (createSnapDevice) dm_task_run failed
[f56fcb6f] -job create(fpm-5.3) = ERR (1)
[error] server.go:1025 Error: Error running DeviceCreate (createSnapDevice) dm_task_run failed
[error] server.go:90 HTTP Error: statusCode=500 Error running DeviceCreate (createSnapDevice) dm_task_run failed

dmsetup状态

docker-8:1-1210426-pool: 0 209715200 thin-pool 352 2510/524288 205173/1638400 - ro discard_passdown queue_if_no_space 

但它们在磁盘上有很多可用空间。

dmsetup info

Name:              docker-8:1-1210426-pool
State:             ACTIVE
Read Ahead:        256
Tables present:    LIVE
Open count:        1
Event number:      1
Major, minor:      252, 0
Number of targets: 1

码头信息

Containers: 4
Images: 65
Storage Driver: devicemapper
 Pool Name: docker-8:1-1210426-pool
 Data file: /var/lib/docker/devicemapper/devicemapper/data
 Metadata file: /var/lib/docker/devicemapper/devicemapper/metadata
 Data Space Used: 12823.3 Mb
 Data Space Total: 102400.0 Mb
 Metadata Space Used: 9.9 Mb
 Metadata Space Total: 2048.0 Mb
Execution Driver: native-0.2
Kernel Version: 3.14.4

泊坞广告版

Client version: 1.0.0
Client API version: 1.12
Go version (client): go1.2.2
Git commit (client): 63fe64c
Server version: 1.0.0
Server API version: 1.12
Go version (server): go1.2.2
Git commit (server): 63fe64c

5 个答案:

答案 0 :(得分:33)

以下是Fedora / RHEL系统,所以你需要调整Debian ......

# systemctl stop docker.service
# thin_check /var/lib/docker/devicemapper/devicemapper/metadata

如果没有错误,请继续:

# thin_check --clear-needs-check-flag /var/lib/docker/devicemapper/devicemapper/metadata
# systemctl start docker.service
# docker run --name=fpm-5.3 debian:jessie

要安装thin_check命令,请运行:

# apt-get install -y thin-provisioning-tools

答案 1 :(得分:6)

当docker分区填满并且docker在重启后不再启动时,我遇到了这个:

# thin_check /var/lib/docker/devicemapper/devicemapper/metadata
examining superblock
examining devices tree
  missing devices: [0, -]
    bad checksum in btree node
examining mapping tree
  thin device 72 is missing mappings [137494, 137594]
    bad checksum in btree node
  thin device 72 is missing mappings [137721, -]
    bad checksum in btree nodebad checksum in btree nodebad checksum in btree nodebad checksum in btree nodebad checksum in btree nodebad checksum in btree nodebad checksum in btree nodebad checksum in btree nodebad checksum in btree nodebad checksum in btree nodebad checksum in btree nodebad checksum in btree nodebad checksum in btree nodebad checksum in btree node

我能够通过这个程序进行修复:

# thin_dump -r /var/lib/docker/devicemapper/devicemapper/metadata -o /tmp/metadata.xml
# thin_restore -i /tmp/metadata.xml -o /var/lib/docker/devicemapper/devicemapper/metadata

答案 2 :(得分:2)

在我们的例子中,只需要启动和停止服务。

根据您的系统,您可以运行:

service docker stop
service docker start

或:

sudo systemctl stop docker.service
sudo systemctl start docker.service

或:

sudo /etc/init.d/docker restart

答案 3 :(得分:1)

我遇到了同样的问题但无法解决问题。 我发现了一些有希望的东西 http://grokbase.com/t/gg/docker-user/1563fzdtm7/docker-docker-runs-out-of-space-when-trying-to-create-a-new-image '默认的docker存储驱动程序为您分配10GB存储块 图片。移至overlayfs并完全避免这种情况。在命令中 启动你的d​​ocker守护进程只需添加“-s overlay”'

这解决了我的问题。

答案 4 :(得分:1)

我一直在用Debian 8.2来解决这个问题。 我有其他问题,因为我使用grsec运行4.3.3内核(默认为3.16)。

尽管存在GRSEC问题(mount& chmod拒绝),但我能够运行docker并创建一些图像和容器。

然后,我会重启并且docker会吐出错误。 我运行了thin_check,我发现了这个:

  • 元数据很好(我现在不使用精简池,因为docker一直告诉我,我的精简池不是一个精简池......)
  • 数据已损坏。

试图修复它,但是thin_restore崩溃了。

我意识到:docker daemon ...正在运行,但无法使用systemctl stop docker.service停止。 它说该服务已停止但守护程序仍在内存中(ps -elf | grep docker)

要解决此问题,我必须更改/ etc / default / docker中的DOCKER_STORAGE_OPTIONS

rm -rf /var/lib/docker
reboot

在启动时,服务启动。     码头信息

按预期显示信息。 建立了一个形象。重新启动,服务再次启动。 我认为基本上停靠的守护进程守护进程无法停止并使用:

杀死它
kill <pid>

导致数据文件损坏,因此校验和不匹配。

底线是不要混用和匹配docker.service和docker守护进程。至少在Debian / Ubuntu上。