iT邦幫忙

1

是發問..也是討論..:docker 的 diff 疑問

  • 分享至 

  • xImage

在四個多月前(剛進現在的公司)
因公司有在使用docker
我也因此有機會接觸docker
前輩學長也很熱心教導~

在上個禮拜~
我遇到一個前輩們沒遇過的問題~
當然..是大家一起學著解決~
也因為這個問題..
產生出我以下這個發問~
http://ithelp.ithome.com.tw/questions/10185692

在這裡重新講述一次~

我的變腦是Win10系統
我了配合公司的伺服器
我安裝VM12
並安裝Ubuntu 16.04
又在其底下安裝docker架起一個apache Server (for php)

四個多月來使用都沒問題
但就在上周..
跳出視窗警告我硬碟容量不足
這也是我第一次注意到Ubuntu硬碟可用剩下0位元組
我也開尋找造成容量爆滿的檔案或資料夾在哪

我利用cd、ls、sudo du -sh、sudo chown -R user:user 目錄
來反覆尋找每一個目錄容量
後來發現在/var/lib/docker/aufs/diff/這個目錄底下
竟然佔了整個硬碟的一半容量~
(我預設Ubuntu硬碟40G..diff產生近30G容量)

去Google大神詢問
才了解到diff是在記錄docker container(容器)的差異紀錄
也去尋找刪除的方法
並找到用以下指令刪除檔案

docker ps -a|grep Exit|cut -d' ' -f 1|xargs docker rm

不過這方法卻會連同container一併刪除
害我必須再從原有的image(映像檔)建立新的container

我目前的爆滿問題已經解除~
不過..我也因此開始注意這個diff..
這資料夾依舊一直持續成長

我想問..這樣的情況該如何終止~
網路上找到跟diff有關的多半是教學

另外我也發現在/var/lib/docker/aufs/mnt/這個目錄底下
也會產生跟diff一模一樣的內容
例如diff有20G..mnt也會有20G一樣的內容
只不過..mnt沒有實際占用實體硬碟的容量
像是虛擬的~
雖然mnt沒有造成影響~
不過我還是想了解mnt在幹嘛用

還有個疑問是...
剛開始學docker時
看了介紹簡介~
docker標榜輕量~
那..為甚麼這個diff卻會產生近30G容量
造成我硬碟容量不足問題?

James iT邦大師 6 級 ‧ 2017-03-30 10:53:45 檢舉
好像是要先升級到1.5以上再執行
./launcher cleanup
https://meta.discourse.org/t/var-lib-docker-aufs-diff-increasing-in-size/31438/4
升級?升級什麼?
docker?
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
5
bizpro
iT邦大師 1 級 ‧ 2017-03-30 10:49:32
最佳解答

我不喜歡docker, 也沒有意願在商用場合(production)用它. 因為

  1. 隔靴搔癢: docker像是穿上靴子, 靴子發生的事都要從靴子外來處理.
  2. 一顆老鼠屎壞了一鍋粥: docker和底層作業系統的關係是寄生不是共生, 所有的docker image都"寄生"在kernel上, 當其中一個docker image出了問題, 被寄生的kernel將面臨被毀損的機會. 您的問題正好是這種情況.

當然, 由於Windows已推出Windows 版的docker, 這可能有趣些, 因為我可以把Linux上的應用系統寄生在Windows上, 原因很簡單, 太多的台灣人想要看到Windows系統畫面. 另外, docker在測試環境中也可以派上用場.

您的問題可能是因為(1) 您的應用系統有漏洞, (2)您把docker image操太兇了. 首先,AUFS是docker的檔案系統, 而這個檔案系統是一層一層堆疊的, docker image本身是唯讀的, 當您跑了一個container, docker就掛載在mnt目錄中, 當您對這個container做了修改, 就是在docker的AUFS堆疊了一層讀寫層, 也就是diff的內容.

建議您應該用data volumn來外掛異動的儲存.

看更多先前的回應...收起先前的回應...
James iT邦大師 6 級 ‧ 2017-03-30 11:09:27 檢舉

我想得到的應用場合是那種會忽然爆量的系統,如果用docker建置就可以快速增生應付。開發商也可以將自己的軟體打包發行。一般mis因為不常重覆建置相同系統用docker建置會增加麻煩不會減少工作。
Windows上要跑Linux應用,用hyperv就可以了,好像是Windows跑docker也是跑在hyperv裡面。

建議您應該用data volumn來外掛異動的儲存.
我看到相關做法了~
http://dockone.io/article/128

TO LKK :
windows版也是最近才出來的
一開始我剛進入docker世界時
就有嘗試在Windows建立docker
確實在windows建立docker需要hyperV來輔助建立
感覺有點多此一舉~~
畢竟docker本來就以Linux系統為底製造出來的~~

bizpro iT邦大師 1 級 ‧ 2017-03-30 12:53:48 檢舉

由於您起了很多container, 也就是mount很多containers在mnt目錄下, 而每個container的讀寫層都會在diff目錄下, 並非mnt是虛擬, 這是Linux mount的指令掛載一個block device, 而container的讀寫層是一層一層的, 如同用rsync以hardlink方式做成的差異備份層, 一層一層堆疊, 可以commit新建一個image, (上個月我才寫了一個類似的差異備份系統). docker基本上是把Linux/Unix上的已有的東西做一個商業包裝. 但docker帶來的管理負擔與可攜性的問題可能不是一般公司能承擔的. 而且要非常熟Linux/Unix系統.

docker基本上是把Linux/Unix上的已有的東西做一個商業包裝

這句話讓我對docker改變觀念了~!!!!
之前我都把它當作一個方便建立的server在玩...

就這句話的解釋...
我應該可以這樣比喻吧~
每個container當作是一個封裝好的軟體~
然後賣給客戶~
既然是封裝...理論上就不能給客戶竄改裡面的原碼~

這樣比喻~對嗎?

bizpro iT邦大師 1 級 ‧ 2017-03-30 14:03:01 檢舉

是的, docker正是如此, 如同ISO, 本不是要修改內容的, 如果修改了, 就應該重建image再發行.

docker的網路與資安並非成熟,需要更多的成本來管理.

今天又做了幾個實驗
發現啟用docker container的情況下
在docker之外連結PHP網頁
若對後台有一些互動
例如表單的傳值
diff不會有改變

當我在網頁寫了個指令程式
剛好最近有玩到gitbook
例如exec('gitbook pdf') //產生gitbook PDF檔案
之類的新增或是編輯檔案的指令...
diff會長大..

bestlong iT邦研究生 4 級 ‧ 2017-04-01 18:49:17 檢舉

diff 會長大很正常,這是使用規劃上的問題,Docker Image 本身是唯讀的,容器啟動後有任何異動到容器內檔案系統的操作例如新增、修改、刪除都會需要保存差異資訊,這就是 diff 保存的內容,直到容器刪除才會釋放。

所以把 runtime 產生的異動用 volume 設定改放到 HostOS 環境是必要的處理。

bizpro iT邦大師 1 級 ‧ 2017-04-02 09:45:58 檢舉

是, diff長大是正常, 這是權宜設計, 運作中異動的資料要放在data volume中

2
Ray
iT邦大神 1 級 ‧ 2017-03-30 10:06:06

我不懂 Docker, 不過從系統面來看, 可以提出幾個方向討論研究:

  1. 先弄清楚 AUFS 的功能和角色, 以及 Docker 如何使用它?
  2. 你的 Docker Image 是否有分支使用? (Branch)
  3. Container 封裝成 Image 之後, 他若要寫入資料, 應該要寫到哪裡去? 可以回寫到封裝的 Image 內嗎?

1.我有查過afus..只不過查到都是英文的文章..我也還在慢慢翻譯研究..期待有高手幫忙解釋~XD
另外我也有查過mnt~不過mnt的部分好像就沒有相關文章可以研究了...= =

2.在docker..
就我目前對他的了解是..
image(映像檔):應該可以解釋成一個虛擬機器(類似於VM),他是可以方便移動到別台電腦(如果那台電腦也有docker的話),只需一行docker load指令,就可以馬上再另一台電腦直接啟用該映像檔~
container(容器):應該可以解釋成一個簡易系統,可以是linux、可以是server...等
一台電腦只能有一個docker
一個docker可以有很多image
一個image可以有多container
每個container都是獨立的,但彼此都可以建立連線
回到你第2點問題..
我的docker環境很簡單~
一個docker一個images一個container
(PS..發生容量不足前..有三四個image也有六七個container..
都是當作練習用..後來練習差不多了..就沒再啟用..
只啟用一個會作業用的image和一個container
發生問題後..經過刪除..全都不見了..
只留下一個image和container)

3.diff容量大小應該跟container有關
因為我刪除container後~diff就會瞬間瘦身到1G~(含mnt)
因此..讀取及寫入..應該是針對container
而image就如我第2點說的..
他像是一個虛擬機~一包可以隨時搬移的檔案~

0
海綿寶寶
iT邦大神 1 級 ‧ 2017-03-30 11:24:06

Docker 我不懂
我去 Google 了之後
找到一大堆關於這個問題的討論
讓我不解的是
到現在還沒有一個一致而有效的解決方法
大都是「刪除刪除再刪除」
/images/emoticon/emoticon20.gif
這裡有一篇比較有意思
是有人直接跑去問 Docker 的 developer
從2016年4月討論到昨天
都沒有解決
有空不妨看看
(有人的diff已經到了1T/images/emoticon/emoticon04.gif)

海綿老大~~
你再用豆芽菜虐待我啊~~
滿滿的豆芽菜~= =

這篇我有找到過....
只不過因為都是"鶯鴿立吸"
所以被我略過了...= =

其實我覺得最快的解決方法
還是在你的前輩學長身上
幾個 HOST OS
搭配幾個 VM
搭配幾個 Container
搭配幾個 Image
搭配幾個 iNode
應該有很多先例可循
除非你時間很多
否則實在不需要自己try and error

我確實有時間可以研究~~= =
(是好還是壞)

基本上~有問題當然會先從前輩身上挖資訊
只不過...
這個問題剛好他們沒遇過~
所以一起解決的結果..
就是如同我文章說的~
"刪除"= =

0
q00153
iT邦新手 3 級 ‧ 2017-03-30 16:39:01

建議您可以改為 Overlay2 儲存區動試試看
不要用預設的 AUFS

之前回答錯誤了
所以不能給予肯定的答案
只能給予建議
/images/emoticon/emoticon02.gif

之前回答??我怎麼沒看到你的回答?!0..0

0
bestlong
iT邦研究生 4 級 ‧ 2017-03-30 21:06:36

因為你提供的資訊不夠多,例如:

  • docker info 資訊
  • Dockerfile 內容

所以只能給個方向,基本上會長時間運行的 container 一定要將 runtime 時期產生的檔案改放到 Host OS 儲存空間,特別是 Log 檔案,然後再利用系統功能例如 logrotate 來處理檔案自動分割與刪除逾期舊檔,這樣可以大幅減緩長大的速度。

另外,還要建立監控機制,當空間不足時主動通知管理員,可以從容地處理問題。

bestlong iT邦研究生 4 級 ‧ 2017-04-01 18:57:42 檢舉

可以先用 docker diff CONTAINER 查看有異動到什麼檔案,接著用 volume 設定搬到 Host OS 下

0
cjhung
iT邦新手 5 級 ‧ 2017-03-31 14:53:50

不曉得方不方便提供 docker images 給大家看一下,

想看一下加起來的 size 有多大.

docker images

REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE

nginx                          latest              abf312888d13        4 months ago        181.5 MB

ubuntu                         latest              e4415b714b62        4 months ago        128.1 MB

172.31.254.109:5050/php-oci8   1.3                 acf327bf7e60        19 months ago       880.6 MB

joshhu/webdemo                 latest              c58bf6158823        2 years ago         243.2 MB

docker ps -a

CONTAINER ID        IMAGE                              COMMAND                  CREATED             STATUS              PORTS                  NAMES

d8f12d700f0c        172.31.254.109:5050/php-oci8:1.3   "/usr/sbin/apache2ctl"   22 hours ago        Up 22 hours         0.0.0.0:8080->80/tcp   test

不知道你要這個幹嘛
不過給你看沒差~
反正..討論嘛~^..^

是說可以去看看2樓bizpro大大的回覆
他回答了很多~
個人覺得很受用喔~

對了~上面提供的內容~
有一組IP~
那組IP不是我現在在用的IP~
那只是名稱而已喔~

我要發表回答

立即登入回答