Error response from daemon: Cannot start container xxx: write /var/lib/docker/containers/xxxxx/hash281480960: no space left on device
Error: failed to start containers: [xxx]
1.開始排查:df -h
[root@iZbp13ks1ssZ root]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 40G 40G 0 100% /
tmpfs 7.8G 0 7.8G 0% /dev/shm
/dev/vdb1 493G 289G 179G 62% /mnt
如圖系統盤40G被佔用完,基本可以確定啓動異常原因和系統盤有關係
2.繼續排查:docker info
查看信息,可以分析出可用磁盤容量 Data Space Available、 Metadata Space Available 僅剩 16.78 MB,所有導致沒有足夠的空間進行加載啓動docker鏡像。
docker system df #查看docker 佔用空間 (注意:此操作會刪除所有停止的容器)
Usage: docker system COMMAND ##使用Docker System命令,查看docker現在硬盤狀態
Manage Docker
Commands:
df Show docker disk usage
events Get real time events from the server
info Display system-wide information
prune Remove unused data
3.解決辦法
a.清理無效數據文件,釋放磁盤空間(我這邊採用的清除日誌,大概35G日誌)
找到容器位置,查看容器下文件夾總大小,大概34G,很明顯不正常
最終定位到xxxxx-json.log文件,經 vi 查閱該日誌可清除,rm 清除後 docker info
或 cd / ,在根目錄下查看哪個文件夾佔用內存大du -h --max-depth=1
b. 修改docker配置文件,修改data路徑
關掉所有正在運行的容器
docker stop $(docker ps -q -f status=running)
關閉docker服務
systemctl stop docker
將Docker現目錄挪到一個新目錄下,這兩個目錄依照具體情況而定,我的分別是/var/lib/docker和/home/docker
mv /var/lib/docker /home/docker
將原來的數據備份一份,備份大法好,萬一不行還不至於損壞數據
tar zcf docker_file_bak.tar.gz /home/docker
修改服務啓動命令,服務的service文件爲/lib/systemd/system/docker.service,將裏面的內容ExecStart=/usr/bin/dockerd修改爲如下:
ExecStart=/usr/bin/dockerd -g 新目錄
重新加載修改後的service文件
systemctl daemon-reload
啓動Docker服務
systemctl start docker
驗證修改成功
docker info | grep “Docker Root Dir”
c. docker文件佔用大,可以將docker停掉後將文件夾移動到data目錄下,然後建一個超鏈接過去。
首先,先停掉docker服務
service docker stop
然後,將docker目錄放到/data 目錄下
mv /var/lib/docker /data/
然後,建立軟連接
ln -s /data/docker /var/lib/docker
然後,在/var/lib/ 下輸入 sudo ls -lh |grep docker , 查看文件
lrwxrwxrwx 1 root root 11 Feb 19 19:35 docker -> /data/docker
這樣就可以啓動docker服務了
sudo service docker start