即使容器很小,Docker的磁盘空间也不足

我已经安装了Docker Toolbox for Mac OSX,并在其中运行了多个容器。 我创造的前两个是与卡桑德拉和运行良好。 之后,我创build了2个Debian容器,通过dockerterminal连接到bash,目的是安装Oracle JDK8。

当我准备从tar包中提取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相关的设置中。

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

UPDATE。

$ 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` 

感谢帮助。

我已经在Docker中解决了这个问题。

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

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

 $ docker-machine stop default 

然后,我去了$ HOME / .docker / machine / machines / default / config.json文件,并将“Memory”设置更高,即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 

问题18869涉及docker机器内存分配问题。

这可以随时用于testing

 vboxmanage controlvm default 4096 

由于drivers/virtualbox/virtualbox.go #L344-L352将重新加载HOME/.docker/machine/machines/default/config.json ,因此最好在该文件中logging该新值(如本答案中所述 )。

docker/machine问题2285中看到“设备上没有剩余空间”,其中创build的vmdk映像是在运行时dynamic分配/增长(默认),最初创build一个较小的磁盘底部打印,因此即使在创build一个~20GiB ,使用--virtualbox-disk-size 20000需要大约~200MiB的磁盘空闲空间才能启动。
而默认的内存是相当低的 。


确保你没有:

  • 您可以删除的更多已退出的容器:

     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 

(这是重build的结果,使中间图像不使用)

另请参阅“ 如何删除旧的和未使用的Docker镜像 ”


然后确保没有inode耗尽问题,如问题10613 。
检查df -hi (用i表示inode)


通过dockerterminal连接到bash,目的是安装Oracle JDK8。

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