從問題開始:
1. Dockerfile是什么:是一個文本文件,其內包含了一條條的指令(Instruction),每一條指令構建一層,因此每一條指令的內容,就是描述該層應當如何構建。
From指定基礎鏡像:?FROM <image name>
Maintainer設置鏡像的作者:MAINTAINER <author name>
Run在shell或者exec的環境下執行的命令。Run指令會在新創建的鏡像上添加新的層面(???)。RUN <command>
Env設置環境變量,鍵值對。ENV <key> <value>
Arg構造參數,定義參數名稱,在--build-arg時用(沒看懂???)
Cmd提供容器默認的執行命令。Dockerfile只允許使用一次CMD指令,多個則只有最后一個生效。三種:CMD ["executable", "param1", "param2"], CMD ["param1", "param2"], CMD command param1 param2(shell,主進程為sh)
2. 什么是Docker,Docker和虛擬機等傳統虛擬技術有啥區別
Container容器:操作系統層面的虛擬化技術,在容器內運行的程序只能看到容器的內容和設備信息(而真正的操作系統中的程序可以看到所有資源)。文件系統、網絡互聯、進程隔離。
Docker在容器的基礎上進一步封裝,簡化了容器的創建和維護。
Docker和傳統虛擬機的區別在于,傳統虛擬機中的每個APP需要虛擬出一套完整的操作系統(Guest OS),而Docker直接運行于宿主操作系統(Host OS),只是APP之間共享內核(???),容器內沒有自己的內核,不進行硬件虛擬。
Docker在性能上能明顯優于傳統虛擬機:啟動快、耗損少(實例多)
3. 什么是鏡像(Image)、什么是容器(Container)、什么是倉庫(Repository)
首先理解一個概念:文件系統的掛載。在內核啟動之后,會掛載root文件系統(即/),用df -h可以看到mount的設備。
Docker鏡像:相當于是一個root文件系統。鏡像中不包含任何動態數據,構造后即不可變。主要提供:容器運行依賴的程序、庫、資源、配置;以及配置參數(匿名卷、環境變量、用戶)。分層存儲:鏡像構建時,會一層層進行構建,每一層構建完即定下來了,不會再改變了。如果在下一層刪除上一層的文件,不會真正刪除,而只是標記為已刪除,so雖然看不到這個文件,但是文件一直存在。
Docker容器:容器是鏡像的實例,每一個容器創建時,已鏡像為基礎,在鏡像上創建容器存儲層。一般要求容器存儲層保持無狀態,所有的文件寫入操作,使用數據卷(Volume)或者綁定宿主目錄。
Docker Registry:多個倉庫(多個鏡像),每個倉庫包含多個標簽(Tag)-> 對應不同版本的鏡像。其中公開的Docker Registry包含官方的Docker Hub,國內訪問比較慢,有相關加速器可以加速。
參考資料: