Docker no space 的解決方法

上一節我說過運行docker後,磁盤空間不足的簡略解決方法,現在我們詳細講解一下。

這個是我在創建數據卷時docker報出no space,即磁盤空間不足的問題。

 我們看一下磁盤使用情況。

linux中df命令的功能是用來檢查linux服務器的文件系統的磁盤空間佔用情況。可以利用該命令來獲取硬盤被佔用了多少空間,目前還剩下多少空間等信息

df -h和df -i的區別 

在df -h 和df -i  顯示使用率100%,基本解決方法都是刪除文件。

df -h   是去刪除比較大無用的文件-----------大文件佔用大量的磁盤容量。

df -i    則去刪除數量過多的小文件-----------過多的文件佔用了大量的inode號。

那麼我們如何解決這個問題呢?

1、像上次一樣把容器啓動的日誌刪除

 看到容器日誌也不多,刪除了也不一定能釋放較大空間,但做做看看吧。

 關閉docker,再刪除。

 果然釋放的空間並不是很多。

Linux系統下查找大文件或目錄的技巧

當硬盤空間不夠時,我們就很關心哪些目錄或文件比較大,看看能否幹掉一些了,怎麼才能知道呢?以易讀的格式顯示指定目錄或文件的大小,-s選項指定對於目錄不詳細顯示每個子目錄或文件的大小

du -sh [dirname|filename] 當前目錄的大小:  

du -sh .   當前目錄下個文件或目錄的大小:   

du -sh *   顯示前10個佔用空間最大的文件或目錄:

du -s * | sort -nr | head

2、刪除鏡像

容器刪了空間還是緊張,那就刪鏡像吧

 

 

docker rm 鏡像名/鏡像ID進行刪除,但我的有部分鏡像不是本地的,是docker hub上的,還有的比較重要,所以不建議全部刪除。

docker rm $(docker ps -aq) 刪除所有  (不建議用,當然也不一定能刪掉hub上面的)

常見docker清理方法

docker system df 類似於Linux上的df命令,用於查看Docker的磁盤使用情況:

docker system prune 可以用於清理磁盤,刪除關閉的容器、無用的數據卷和網絡,以及dangling鏡像(即無tag的鏡像)。

docker system prune -a 清理得更加徹底,可以將沒有容器使用Docker鏡像都刪掉。注意,這兩個命令會把你暫時關閉的容器,以及暫時沒有用到的Docker鏡像都刪掉了…所以使用之前一定要想清楚.。我沒用過,因爲會清理全部。

 我的prune未清理掉dangling的鏡像

怎麼辦?我搜索資料發現還是有辦法的。

既然大多數鏡像很有用,那麼我們還是刪除鏡像,但是保留或者生成對應的dockerfile文件。

 

提供一個思路——先根據docker鏡像反向生成Dockerfile,再來具體看看。
有這麼一個庫dockerfile-from-image能做這件事,不過這個庫已經沒有維護了,我fork了一下改了點東西dockerfile-from-imagepush到了cloud.docker.com,然後你可以執行一下命令:

 

docker pull fanjieqi/dockerfile-from-image:latestalias dfimage="docker run --rm -v /var/run/docker.sock:/var/run/docker.sock fanjieqi/dockerfile-from-image:latest"dfimage <tag>/<image>:<version>

這樣能完整的展示這個鏡像的Dockerfile,不過當中add和copy這些命令操作的文件及文件夾都是帶了hash的,只能去猜操作的都是什麼文件及文件夾,類似於這樣:

FROM node:9-alpineWORKDIR /appCOPY file:7668b48cb0ef6effedbfcabe6e44cb7c70922fc63cf9e1a8fe2a259173835186 in /appRUN npm install --production --registry=https://registry.npm.taobao.orgRUN echo -e "https://mirrors.ustc.edu.cn/alpine/latest-stable/main\nhttps://mirrors.ustc.edu.cn/alpine/latest-stable/community" > /etc/apk/repositories && apk update && apk add ca-certificates bash git openssh wget && update-ca-certificates && rm -rf /var/lib/apt/lists/*COPY dir:1a399e39f0bccf78b41ba08e1876cbb222b21475a24c80341ff413b5a0b90b67 in /app

希望能幫助到你。

3、刪除系統的日誌

就我所知Ubuntu系統的日誌文件存放在/var/log/目錄裏面

=> /var/log/messages:常規日誌消息
=> /var/log/boot:系統啓動日誌
=> /var/log/debug:調試日誌消息
=> /var/log/auth.log:用戶登錄和身份驗證日誌
=> /var/log/daemon.log:運行squid,ntpd等其他日誌消息到這個文件
=> /var/log/dmesg:Linux內核環緩存日誌
=> /var/log/dpkg.log:所有二進制包日誌都包括程序包安裝和其他信息
=> /var/log/faillog:用戶登錄日誌文件失敗
=> /var/log/kern.log:內核日誌文件
=> /var/log/lpr.log:打印機日誌文件
=> /var/log/mail.*:所有郵件服務器消息日誌文件
=> /var/log/mysql.*:MySQL服務器日誌文件
=> /var/log/user.log:所有用戶級日誌
=> /var/log/xorg.0.log:X.org日誌文件
=> /var/log/apache2/*:Apache Web服務器日誌文件目錄
=> /var/log/lighttpd/*:Lighttpd Web服務器日誌文件目錄
=> /var/log/fsck/*:fsck命令日誌
=> /var/log/apport.log:應用程序崩潰報告/日誌文件
=> /var/log/syslog:系統日誌
=> /var/log/ufw:ufw防火牆日誌
=> /var/log/gufw:gufw防火牆日誌

可以看看/boot下面是否抄有用不到的內核,/tmp下面的文件也可以看着辦,/var/log下面的日誌可以刪(壓縮了的基本上是沒問題了,沒壓縮的日誌文件刪了問題也襲不大,如果你根本不看日誌,那就禁用吧)下面的文件定期清理。其實Linux比Windows靈活多了,你可以再準備一個分區,掛載爲/usr(或/boot、/var、/home等,但一定要先將原/usr下的文件複製一份進去,並準備好一個可用的Linux急救系統)。
Linux下的軟件很多,即使分了50G,最後也會感覺不夠用。建議不要貪多,暫時用不到的軟件不要裝,不用擔心想到用的時候下載不到(不能隨時聯網的情況就有點悲哀了)

這裏我的建議是刪除老的日誌,比如今年2020,你可以把2019之前所產生的所有日誌刪除了,自己編輯好命令,千萬不要瞎寫。

4、刪除緩存

(1)、非常有用的清理命令:
sudo apt-get autoclean 清理舊版本的軟件緩存
sudo 
apt-get clean 清理所有軟件緩存
sudo apt-get 
autoremove 刪除系統不再使用的孤立軟件
這三個命令主要清理升級緩存以及無用包的。

(2)、清理opera firefox的緩存文件

ls ~/.opera/cache4
ls ~/.mozilla/firefox/*.default/Cache

(3)、清理Linux下孤立的包

終端命令下我們可以用:
sudo apt-get install deborphan -y

(4)、卸載:tracker
這個東西一般我只要安裝ubuntu就會第一刪掉tracker 他不僅會產生大量的cache文件而且還會影響開機速度。所以在裏面刪掉就行。
附錄:
包管理的臨時文件目錄:
包在
/var/cache/apt/archives
沒有下載完的在
/var/cache/apt/archives/partial

5、刪除軟件

ubuntu軟件的刪除一e69da5e887aa62616964757a686964616f31333337616561般用“ubuntu軟件中心”或“新立得”就能搞定,但有時用命令似乎更快更好~~
sudo apt-get remove --purge 軟件名
sudo apt-get autoremove 刪除系統不再使用的孤立軟件
sudo apt-get autoclean 清理舊版本的軟件緩存
dpkg -l |grep ^rc|awk '{print $2}' |sudo xargs dpkg -P 清除殘餘的配置文件

6、刪除多餘內核


(1),首先要使用這個命令查看當前Ubuntu系統使用的內核
uname -a
(2),再查看所有內核
dpkg --get-selections|grep linux
(3),最後小心翼翼地刪除
sudo apt-get remove linux-image-2.6.32-22-generic
ps:linux-image-xxxxxx-generic 就是要刪除的內核版本還有linux-headers-xxxxxx         linux-headers-xxxxxx-generic 總之中間有“xxxxxx”那段的舊內核都能刪,注意一般選內核號較小的刪。不懂就乾脆別刪了

7、全局查詢大文件,刪除

cache和log都去查了,沒發現什麼大文件,最終只好全局查找大文件了。 

find / -xdev -size +100M -exec ls -l {} \;

find . -type f -size +100M

終於,忙碌了好久,那要是下次還有這種情況又要手動清理這麼久,能讓系統自己解決嗎?

(1)解決根分區容量滿,又不想更改數據存儲路徑的我來說,我不想更改任何docker的參數和數據,所以我在自己的虛機機環境上嘗試把這些數據遷移到容量較大的磁盤上去,再用鏈接的方式把數據鏈接到原來的位置,保證環境儘可能不變動

 1:關閉docker容器和docker進程: # /etc/init.d/docker stop
  2:遷移數據:(假設我要遷移到/mnt/docker):# mv /var/lib/docker /mnt/
  3:製作目錄鏈接 :  # ln -s /mnt/docker /var/lib/docker
   4:啓動docker和容器:# /etc/init.d/docker start


(2)遷移數據目錄文件

1.查看docker鏡像存放目錄空間大小

du -hs /var/lib/docker/

2.停止docker服務。

systemctl stop docker

3.查看磁盤容量大的空間,且在上面創建新的docker目錄。

df -h
mkdir -p /data/docker/lib

4.遷移/var/lib/docker目錄下的文件到新創建的目錄/data/docker/lib

rsync -avz /var/lib/docker /data/docker/lib/

5.編輯 /etc/docker/daemon.json 添加如下參數

{
  "graph": "/data/docker/lib/docker"
}

6.重新加載docker,並重啓docker服務。

systemctl daemon-reload && systemctl restart docker

7.檢查docker是否變更爲新目錄/data/docker/lib/docker

[root@localhost ~]# docker info
...
Docker Root Dir: /data/docker/lib/docker

Debug Mode (client): false

Debug Mode (server): false

Registry: https://index.docker.io/v1/
...

8.刪掉docker舊目錄

rm -rf /var/lib/docker

但是我們還是會產生容器日誌啊,沒有讓系統進行自我清理

設置Docker容器日誌文件大小限制

1.新建/etc/docker/daemon.json,若有就不用新建了。添加log-dirver和log-opts參數,樣例如下:

# vim /etc/docker/daemon.json

{
  "log-driver":"json-file",
  "log-opts": {"max-size":"500m", "max-file":"3"}
}

max-size=500m,意味着一個容器日誌大小上限是500M, 
max-file=3,意味着一個容器有三個日誌,分別是id+.json、id+1.json、id+2.json。

2.然後重啓docker的守護線程

命令如下:systemctl daemon-reload

systemctl restart docker

【需要注意的是:設置的日誌大小規則,只對新建的容器有效】

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章