話說阿舍一開始是把 Docker 當做是虛擬機器來用的,因此,怎麼用都不順手,怎麼沒有 SSH ? 為什麼是用 attach 來進入操作 ? 為什麼一定要有 Image 檔 ? 為什麼是用 run 不是用 create 來起 Container ? 為什麼硬碟一直被吃掉 ? 為什麼 Docker 這麼難用 .... ?
這麼多的為什麼的為什麼,其實,追根究底就是阿舍不熟 Container 和把 Docker 用錯了哩 ! 就阿舍現在的認知來說,Docker 就像是個有燒錄功能的光碟機,它可以幫你把要執行的東西自動化的燒成光碟片 (Image 檔)並放到光碟櫃上 ( Docker Hub / Docker Registry),然後,各個電腦上的光碟機可以自動的從光碟櫃上取回最新版或指定版本的光碟片來啟動最新的程式 (Docker Run),但是,因為是光碟片,所以,想要寫入東西的話,就會需要外掛一個磁碟給它,否則,就是把它當成可讀寫光碟片來用,就會出問題哩 ! ....
因此,以應用的角度來看,比起 Container 和虛擬機器,Docker 更像是一個應用程式跑在記憶體的實例 (Instance) 而已,所以,當你規劃用 Docker 來部署應用系統時,不能把它像用 Container 或虛擬機器一樣,把所有要執行的東西都塞在一起,而是,要把它們一一分拆成不同的 Continaer 來製作成不同的 Image 檔,這樣部署到雲端或分散式運算環境時,才能達到鬆散耦合的效果,也就是,不論 Image 檔是部署到同一台或不同台的機器上,都還能夠持續運行的彈性哩 !
另外,就是有關寫入資料的部份,雖然,就算在沒有外掛一個磁碟給 Docker 的實例來儲存資料的情況下,你還是可以把資料庫的檔案放在這個實例內,但是,這樣的做法就會導致 Docker 的暫存檔不斷爆增的情形,因為 Docker 會對實例內的實體寫入做出產生新 Image 檔的準備,所以,一旦有寫入的變更發生,Docker 就會產生出新的暫存檔以便產生新的 Image 檔,同時,保存原有的 Image 版本,因此,直接寫入到實例內的硬碟空間並不是好的方法哩 !
所以,阿舍現在的作法是,在開發時期,用 LXC Container 或用 Docker create 指令來建立 Container 作為開發環境用,原則上,每個服務都放在不同的 Container 上來用,等開發完成後,再用 Docker commit 或 Docker build 來產生部署用的 Image 檔,之後,再用自己架的 Docker registry 利用 Docker run 來部置和使用這個 Image 檔並搭配掛載 Host 的磁碟供讀寫哩 ! ....
問題還是沒解決嗎 ?? 這裡有更多的 Ubuntu 相關教學可以參考哩 ...
1 則留言 :
阿舍大大,請問有推薦入門的Docker學習網嗎? 目前正在學習中~
張貼留言