Docker 磁盘用完 space 即使容器很小
Docker runs out of disk space even though containers are small
我已经为 Mac OSX 安装了 Docker 工具箱,并且 运行 在里面安装了几个容器。我创建的前两个是与 Cassandra 一起创建的并且 运行ning 很好。之后,我创建了 2 个 Debian 容器,通过 docker 终端连接到 bash,目的是安装 Oracle JDK8。
当我正要从 tar 球中提取 java 时 - 我在 [=41= 的执行过程中收到了大量 "Cannot write: No space left on device" 错误消息]命令。
我检查了 space:
$ 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 状态并且我不能 start 它:"Cannot write node . No space left on device" - 显示此尝试的错误消息。
Docker 对 运行 容器是否有任何限制?
当我删除所有的 cassandra 并只留下几个 Debian - java 可以从 tar 中提取出来。所以问题肯定出在与尺寸调整相关的某些 Docker 设置中。
解决此处 space 限制问题的正确方法是什么?
更新。
$ 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`
感谢帮助。
Issue 18869指的是docker-机器内存分配问题。
这可以通过
即时测试
vboxmanage controlvm default 4096
自 drivers/virtualbox/virtualbox.go
#L344-L352 reloads the settings from HOME/.docker/machine/machines/default/config.json
, it is best to record that new value in that file (as ).
在 docker/machine
issue 2285 中看到了 "No space left on device",其中创建的 vmdk 映像是 allocated/grow 在 运行 时间(默认)动态创建的,创建了一个较小的 on-最初的磁盘占用空间,因此即使在创建 ~20GiB
虚拟机时,--virtualbox-disk-size 20000
也需要大约 ~200MiB
的空闲 space 磁盘开始。
还有 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
(这些是使中间图像未被使用的重建结果)
另请参阅“”
然后确保您没有 inode 耗尽问题,如 issue 10613。
检查 df -hi
(索引节点为 i
)
connected to bash through docker terminal with the purpose to install Oracle JDK8.
尝试在 Dockerfile 中指定安装并构建安装了 JDK 的映像。
我已经在 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
我已经为 Mac OSX 安装了 Docker 工具箱,并且 运行 在里面安装了几个容器。我创建的前两个是与 Cassandra 一起创建的并且 运行ning 很好。之后,我创建了 2 个 Debian 容器,通过 docker 终端连接到 bash,目的是安装 Oracle JDK8。
当我正要从 tar 球中提取 java 时 - 我在 [=41= 的执行过程中收到了大量 "Cannot write: No space left on device" 错误消息]命令。
我检查了 space:
$ 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 状态并且我不能 start 它:"Cannot write node . No space left on device" - 显示此尝试的错误消息。
Docker 对 运行 容器是否有任何限制?
当我删除所有的 cassandra 并只留下几个 Debian - java 可以从 tar 中提取出来。所以问题肯定出在与尺寸调整相关的某些 Docker 设置中。
解决此处 space 限制问题的正确方法是什么?
更新。
$ 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`
感谢帮助。
Issue 18869指的是docker-机器内存分配问题。
这可以通过
即时测试vboxmanage controlvm default 4096
自 drivers/virtualbox/virtualbox.go
#L344-L352 reloads the settings from HOME/.docker/machine/machines/default/config.json
, it is best to record that new value in that file (as
在 docker/machine
issue 2285 中看到了 "No space left on device",其中创建的 vmdk 映像是 allocated/grow 在 运行 时间(默认)动态创建的,创建了一个较小的 on-最初的磁盘占用空间,因此即使在创建 ~20GiB
虚拟机时,--virtualbox-disk-size 20000
也需要大约 ~200MiB
的空闲 space 磁盘开始。
还有 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
(这些是使中间图像未被使用的重建结果)
另请参阅“
然后确保您没有 inode 耗尽问题,如 issue 10613。
检查 df -hi
(索引节点为 i
)
connected to bash through docker terminal with the purpose to install Oracle JDK8.
尝试在 Dockerfile 中指定安装并构建安装了 JDK 的映像。
我已经在 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