Docker學習筆記(一)
來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。**1**.什麼是Docker,跟傳統虛擬機器的不同之處,為什麼使用Docker。Docker基於Linux核心的cgroup,namespace,以及 AUFS 類的 Union FS 等技術,對進程進行封裝隔離,屬於作業系統層面的虛擬化技術,由於隔離的進程獨立於宿主和其他隔離的進程,也被稱為容器。docker在容器的基礎上進行了進一步的封裝,從檔案系統、網路互聯到進程隔離等等,極大簡化了容器的建立和維護,使得與傳統虛擬機器技術相比更加輕便快捷。與傳統虛擬機器技術相比,傳統虛擬機器技術是虛擬一套硬體,在上面運行一個完整的作業系統,再在作業系統上運行所需應用進程;而容器的應用進程運行於宿主核心,容器內沒有自己的核心,也沒有虛擬硬體,因此,Docker要比傳統虛擬機器技術更加輕便。![image.png](https://static.studygolang.com/180117/a60b79e5d3037508641d071ee0f7ad80.png)**傳統虛擬機器技術**![image.png](https://static.studygolang.com/180117/99a8cfda8563e052bc1a546ad83d5414.png)**Docker****使用Docker的理由**1.更高效地利用系統資源2.更快的啟動時間(秒級)3.一致的運行環境,避免出現“這段代碼在我電腦上執行沒問題”這種狀況4.持續傳遞和部署對開發和營運(DevOps)人員來說,最希望的就是一次建立或配置,可以在任意地方正常運行。使用 Docker 可以通過定製應用鏡像來實現持續整合、持續傳遞、部署。開發人員可以通過 Dockerfile 來進行鏡像構建,並結合 持續整合(Continuous Integration) 系統進行整合測試,而營運人員則可以直接在生產環境中快速部署該鏡像,甚至結合 持續部署(Continuous Delivery/Deployment) 系統進行自動部署。而且使用 Dockerfile 使鏡像構建透明化,不僅僅Team Dev可以理解應用運行環境,也方便營運團隊理解應用運行所需條件,協助更好的生產環境中部署該鏡像。5.更輕鬆的遷徙由於 Docker 確保了執行環境的一致性,使得應用的遷移更加容易。Docker 可以在很多平台上運行,無論是物理機、虛擬機器、公用雲端、私人雲端,甚至是筆記本,其運行結果是一致的。因此使用者可以很輕易的將在一個平台上啟動並執行應用,遷移到另一個平台上,而不用擔心運行環境的變化導致應用無法正常啟動並執行情況。6.更輕鬆的維護擴充Docker 使用的階層式存放區以及鏡像的技術,使得應用重複部分的複用更為容易,也使得應用的維護更新更加簡單,基於基礎鏡像進一步擴充鏡像也變得非常簡單。此外,Docker 團隊同各個開源項目團隊一起維護了一大批高品質的 官方鏡像,既可以直接在生產環境使用,又可以作為基礎進一步定製,大大的降低了應用服務的鏡像製作成本。**日常一圖頂千言**![image.png](https://static.studygolang.com/180117/2c39f7bfd2e42e466b7211dfc0edcb47.png)**2**Docker中的基本概念**鏡像**是一個特殊的檔案系統,除了包含容器運行所必需的程式、庫、資源、配置等檔案,還包含一些為運行時準備的配置參數,鏡像不包含任何動態資料,構建後也不會改變。階層式存放區因為鏡像包含作業系統完整的 root 檔案系統,其體積往往是龐大的,因此在 Docker 設計時,就充分利用 Union FS 的技術,將其設計為階層式存放區的架構。所以嚴格來說,鏡像並非是像一個 ISO 那樣的打包檔案,鏡像只是一個虛擬概念,其實際體現並非由一個檔案組成,而是由一組檔案系統組成,或者說,由多層檔案系統聯合組成。階層式存放區的特徵還使得鏡像的複用、定製變的更為容易。甚至可以用之前構建好的鏡像作為基礎層,然後進一步添加新的層,以定製自己所需的內容,構建新的鏡像。**容器**Docker中鏡像和容器的關係類似於“類”和“執行個體”,鏡像是靜態定義,容器是鏡像運行時的實體,容器可以被建立、啟動、停止、刪除、暫停。容器的實質是進程,但與直接在宿主執行的進程不同,容器進程運行於屬於自己的獨立的 命名空間。因此容器可以擁有自己的 root 檔案系統、自己的網路設定、自己的進程空間,甚至自己的使用者識別碼 空間。容器內的進程是運行在一個隔離的環境裡,使用起來,就好像是在一個獨立於宿主的系統下操作一樣。這種特性使得容器封裝的應用比直接在宿主運行更加安全。與鏡像相同,容器使用的也是階層式存放區,每一個容器運行時都以鏡像為基礎層,在其上建立一個當前容器的儲存層,我們可以稱這個是,為容器運行時讀寫而準備的儲存層,也叫容器儲存層。容器儲存空間生命週期與容器相同,容器消亡時,容器儲存空間也會消失,任何儲存在容器儲存層的資料都會隨容器的刪除而丟失。按照docker最佳實務要求,容器不應該向儲存空間內寫入任何資料,容器儲存層應該保持無狀態化,所有的檔案寫入都應該使用資料卷,或綁定宿主目錄,在這些位置讀寫,會跳過網路儲存層,直接對宿主或網路儲存發生讀寫,其效能和穩定性更高。資料卷的生存周期獨立於容器,容器消亡後資料卷不會消失,因此,使用資料卷,容器刪除後或重新運行後資料不會消失。**倉庫**鏡像構建完成後可以很方便地在宿主機上運行,如果要在其他伺服器上運行,我們就需要一個服務,這個服務可以集中地分發儲存鏡像,Docker Registry 就是這樣的服務。Registry可以包含多個倉庫(即Repository),一個倉庫可以包含多個tag,每個tag對應一個鏡像,通常來說,一個倉庫會包含一個軟體的多個版本,一個tag對應一個鏡像的版本,我們可以通過 <倉庫名>:<標籤> 的格式來指定具體是這個軟體哪個版本的鏡像。如果不給出標籤,將以 latest 作為預設標籤。舉例說明:以 Ubuntu 鏡像 為例,ubuntu 是倉庫的名字,其內包含有不同的版本標籤,如,14.04, 16.04。我們可以通過 ubuntu:14.04,或者 ubuntu:16.04 來具體指定所需哪個版本的鏡像。如果忽略了標籤,比如 ubuntu,那將視為 ubuntu:latest倉庫名經常以 兩段式路徑 形式出現,比如 jwilder/nginx-proxy,前者往往意味著 Docker Registry 多使用者環境下的使用者名稱,後者則往往是對應的軟體名。但這並非絕對,取決於所使用的具體 Docker Registry 的軟體或服務。**Docker Registry公開服務**:是開放給使用者使用、允許使用者管理鏡像的registry服務,一般這類服務都會允許使用者免費上傳、下載公開的鏡像,提供收費服務協助使用者管理私人鏡像,最常使用的 Registry 公開服務是官方的 Docker Hub,這也是預設的 Registry,並擁有大量的高品質的官方鏡像。**私人 Docker Registry**:使用者可以搭建私人Registry,開源的 Docker Registry 鏡像只提供了 Docker Registry API 的服務端實現,足以支援 docker 命令,不影響使用。但不包含圖形介面,以及鏡像維護、使用者管理、存取控制等進階功能。在官方的商業化版本 Docker Trusted Registry 中,提供了這些進階功能。206 次點擊