【问题标题】:Docker runs out of disk space even though containers are small即使容器很小,Docker 也会耗尽磁盘空间
【发布时间】:2016-03-29 13:23:56
【问题描述】:

我已经为 Mac OSX 安装了 Docker Toolbox,并在其中运行了多个容器。我创建的前两个是使用 Cassandra 并且运行良好。之后我创建了 2 个 Debian 容器,通过 docker 终端连接到 bash,目的是安装 Oracle JDK8。

当我正要从 tarball 中提取 java 时 - 我在执行“tar”命令期间收到大量“无法写入:设备上没有剩余空间”错误消息。

我已经检查了空间:

$ docker ps -s

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                         NAMES               SIZE

9d8029e21918        debian:latest       "/bin/bash"              54 minutes ago      Up 54 minutes                                                     deb-2               620.5 MB (virtual 744 MB)

49c7a0e37475        debian:latest       "/bin/bash"              55 minutes ago      Up 55 minutes                                                     deb-1               620 MB (virtual 743.5 MB)

66a17af83ca3        cassandra           "/docker-entrypoint.s"   4 hours ago         Up 4 hours          7000-7001/tcp, 7199/tcp, 9042/tcp, 9160/tcp   node-2              40.16 MB (virtual 412.6 MB)

看到该输出后,我注意到我的一个带有 cassandra 的节点丢失了。去检查 Kitematic 并发现它处于 DOWN 状态,我无法启动它:“无法写入节点。设备上没有剩余空间” - 显示此尝试的错误消息。

Docker 运行容器是否有任何限制?

当我删除我所有的 cassandra 并只留下几个 Debian - java 可以从 tar 中提取出来。所以问题肯定出在一些与大小相关的 Docker 设置中。

这里解决空间限制问题的正确方法是什么?

更新。

$ docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE cassandra latest 13ea610e5c2b 11 hours ago 374.8 MB debian jessie 23cb15b0fcec 2 weeks ago 125.1 MB debian latest 23cb15b0fcec 2 weeks ago 125.1 MB

df -hi 的输出

$ df -hi Filesystem Inodes IUsed IFree IUse% Mounted on none 251K 38K 214K 15% / tmpfs 251K 18 251K 1% /dev tmpfs 251K 12 251K 1% /sys/fs/cgroup tmpfs 251K 38K 214K 15% /etc/hosts shm 251K 1 251K 1% /dev/shm

`df -h 
Filesystem Size Used Avail Use% Mounted on 
none 1.8G 1.8G 0 100% 
/ tmpfs 1002M 0 1002M 0% 
/dev tmpfs 1002M 0 1002M 0% 
/sys/fs/cgroup tmpfs 1.8G 1.8G 0 100% 
/etc/hosts shm 64M 0 64M 0% /dev/shm`

感谢帮助。

【问题讨论】:

  • 在主持人df -h上节目?
  • 请不要通过“cmets”添加其他信息;而是将它们添加到问题本身(是的:请立即将附加信息放入问题中并删除您的评论)。

标签: java macos docker cassandra debian


【解决方案1】:

我已经在 docker 中以某种方式解决了这个问题。

默认情况下,docker 的内存默认设置为 2048M。

我执行的第一步是停止我的 docker 机器:

$ docker-machine stop default

然后我转到 $HOME/.docker/machine/machines/default/config.json 文件并将“内存”设置更改为更高,即 4096。

{
    "ConfigVersion": 3,
    "Driver": {
        "VBoxManager": {},
        "IPAddress": "192.168.99.102",
        "MachineName": "default",
        "SSHUser": "docker",
        "SSHPort": 59177,
        "SSHKeyPath": "/Users/lenok/.docker/machine/machines/default/id_rsa",
        "StorePath": "/Users/lenok/.docker/machine",
        "SwarmMaster": false,
        "SwarmHost": "tcp://0.0.0.0:3376",
        "SwarmDiscovery": "",
        "CPU": 1,
        "Memory": 4096, 
        "DiskSize": 204800,
        "Boot2DockerURL": "",
        "Boot2DockerImportVM": "",
        "HostDNSResolver": false,
        "HostOnlyCIDR": "192.168.99.1/24",
        "HostOnlyNicType": "82540EM",
        "HostOnlyPromiscMode": "deny",
        "NoShare": false,
        "DNSProxy": false
    },
    "DriverName": "virtualbox",
    "HostOptions": {
        "Driver": "",
        "Memory": 0,
        "Disk": 0,
        "EngineOptions": {
            "ArbitraryFlags": [],
            "Dns": null,
            "GraphDir": "",
            "Env": [],
            "Ipv6": false,
            "InsecureRegistry": [],
            "Labels": [],
            "LogLevel": "",
            "StorageDriver": "",
            "SelinuxEnabled": false,
            "TlsVerify": true,
            "RegistryMirror": [],
            "InstallURL": "https://get.docker.com"
        },
        "SwarmOptions": {
            "IsSwarm": false,
            "Address": "",
            "Discovery": "",
            "Master": false,
            "Host": "tcp://0.0.0.0:3376",
            "Image": "swarm:latest",
            "Strategy": "spread",
            "Heartbeat": 0,
            "Overcommit": 0,
            "ArbitraryFlags": [],
"config.json" [noeol] 75L, 2560C
            "Overcommit": 0,
            "ArbitraryFlags": [],
            "Env": null
        },
        "AuthOptions": {
            "CertDir": "/Users/lenok/.docker/machine/certs",
            "CaCertPath": "/Users/lenok/.docker/machine/certs/ca.pem",
            "CaPrivateKeyPath": "/Users/lenok/.docker/machine/certs/ca-key.pem",
            "CaCertRemotePath": "",
            "ServerCertPath": "/Users/lenok/.docker/machine/machines/default/server.pem",
            "ServerKeyPath": "/Users/lenok/.docker/machine/machines/default/server-key.pem",
            "ClientKeyPath": "/Users/lenok/.docker/machine/certs/key.pem",
            "ServerCertRemotePath": "",
            "ServerKeyRemotePath": "",
            "ClientCertPath": "/Users/lenok/.docker/machine/certs/cert.pem",
            "ServerCertSANs": [],
            "StorePath": "/Users/lenok/.docker/machine/machines/default"
        }
    },
    "Name": "default" 
}

最后,再次启动我的 docker 机器:

$ docker-machine start default

【讨论】:

  • 太棒了! +1。我已经相应地更新了自己的答案。
【解决方案2】:

Issue 18869 指的是 docker-machine 内存分配问题。

这可以使用

进行动态测试
vboxmanage controlvm default 4096

由于drivers/virtualbox/virtualbox.go#L344-L352 会从HOME/.docker/machine/machines/default/config.json 重新加载设置,因此最好将该新值记录在该文件中(如mentioned in this answer)。

docker/machine issue 2285 中看到“设备上没有剩余空间”,其中创建的 vmdk 映像是在运行时动态分配/增长的(默认),最初创建的磁盘占用空间更小,因此即使在创建~20GiB 虚拟机时,使用--virtualbox-disk-size 20000 需要大约~200MiB 的可用磁盘空间。
还有default memory is quite low


确保你没有:

  • 任何您可以移除的已退出容器:

    docker rm -v $(docker ps --filter status=exited -q 2>/dev/null) 2>/dev/null
    
  • 任何悬空图像

    docker rmi $(docker images --filter dangling=true -q 2>/dev/null) 2>/dev/null
    

(这些是重建的结果,使得中间图像未被使用)

另见“How to remove old and unused Docker images


然后确保您没有 inode 耗尽问题,如 issue 10613
检查df -hi(使用i 获取inode)


通过docker终端连接到bash,目的是安装Oracle JDK8。

尝试在 Dockerfile 中指定安装,并在安装了 JDK 的情况下构建映像。

【讨论】:

  • 我今天刚刚安装了docker,没有任何未使用和不必要的容器...这很奇怪,因为您可以在sn-p上看到我直接从命令行粘贴的,所有的容器都非常小。
  • @experimenter 所有运行容器。您需要通过docker ps -a 来查看所有内容。
  • 我有那个容器,它没有通过命令“docker ps -s”显示,处于“退出”状态。它下来了。我无法启动它。但我确实需要它。我认为问题不在于一些占用空间的未使用容器,问题更多在于应该增加的空间量。你怎么看?
  • @experimenter 你能做一个docker images,看看存储这些图像的空间使用情况吗?
  • @experimenter 你能检查一下df -hi 的输出吗?见github.com/docker/docker/issues/10613#issuecomment-119679265
猜你喜欢
  • 2020-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-01
  • 1970-01-01
  • 2016-03-30
相关资源
最近更新 更多