一句話總結
dockerfile:類似於“package.json”
Image:類似於”Win7 純淨版.rar“
Container: 一個完整的作業系統
docker 是什麼?
docker 是用 Go 語言實現的開源專案,可以讓我們方便的建立和使用容器,docker 將程式以及程式所有的依賴都打包到 docker container,這樣你的程式可以在任何環節都會有一致的表現,這裡程式執行的依賴也就是容器就好比集裝箱,容器所處的作業系統環境就好比貨船或港口,程式的表現只和集裝箱有關係(容器),和集裝箱放在哪個貨船或者哪個港口(作業系統)沒有關係
容器技術只隔離應用程式的執行時環境但容器之間可以共享一個作業系統,這裡的執行時環境指的是程式執行依賴的各種庫以及配置
注意,容器是一種通用技術,docker 只是其中的一種實現
docker 的優點
環境隔離
- docker 實現了資源隔離,實現一臺機器執行多個容器互不影響。基於容器來開發、部署、執行應用程式
更快速地交付部署
- 使用 docker ,開發者可以利用映象快速構建一套標準的研發環境,開發完成後,測試和運維人員可以直接通過使用此映象部署程式碼
更高效的資源利用
- docker 的執行不需要額外的虛擬化管理程式的支援,它是核心級的虛擬化,可以實現更高的效能,同時對資源的額外需求很低
更易遷移擴充套件
- docker 幾乎可以在任意平臺上執行
更簡單的更新管理
- 使用 dockerfile,只需要小小的配置修改,就可以代替以往大量的更新工作,並且所有修改都是以增量的方式進行分發和更新,從而實現自動化和高效的容器管理
重啟更快
- docker 的啟動只需要幾秒,虛擬機器要幾分鐘
docker 的三個概念
docker 的整個生命週期由三部分組成:映象(image)+ 容器(constainer)+ 倉庫(repository)
每臺宿主機(電腦),下載好了 docker 後,可以生成多個映象,每個映象,可以建立多個容器。釋出到倉庫時,以映象為單位。可以理解成:一個容器就是一個獨立的虛擬作業系統,互不影響,而映象就是這個作業系統的安裝包。想要生成一個容器,就要安裝包(映象)生成一次,這就是 Docker 的核心概念
映象(Image)
類似於虛擬機器上的映象,是一個包含有檔案系統的面向 docker 引擎的只讀模板。任何應用程式執行都需要環境,而映象就是用來提供這種執行環境的。例如一個 Ubuntu 映象就是一個包含 Ubuntu 作業系統環境的模板(安裝包),同理在該映象上裝上 Apache 軟體,就可以稱為 Apache 映象
容器(Container)
類似於一個輕量級的沙盒,可以將其看作一個極簡的 Linux 系統環境(包括 root 許可權、程式空間、使用者空間和網路空間等),以及執行在其中的應用程式。Docker 引擎利用容器來執行,隔離各個應用。容器是映象建立的應用例項,可以建立、啟動、停止、刪除容器,各個容器之間是相互隔離的,互不影響。
注意:映象本身是隻讀的,容器從映象啟動時,Docker 在映象的上層建立一個可寫層,映象本身不變。
倉庫(Repository)
類似於程式碼倉庫,這裡是映象倉庫,是 Docker 用來集中存放映象檔案的地方。
注意與註冊伺服器(Registry)的區別:註冊伺服器是存放倉庫的地方,一般會有多個倉庫;而倉庫是存放映象的地方,一般每個倉庫存放一類映象,每個映象利用 tag 進行區分,比如 Ubuntu 倉庫存放有多個版本(12.04、14.04 等)的 Ubuntu 映象
傳統的虛擬機器與容器對比
可以看出,傳統的虛擬機器是每開一個虛擬機器,相當於執行一個系統,這種是非常佔用系統資源的,但容器(以 docker 為例)。也起到了應用之間的隔離效果
它的底層是通過 namespace(名稱空間)和 control groups 來實現
其本質就是將重複的資源公有化,讓資源分配更加合理
這樣做除了資源分配合理外,還能做到應用程式的環境統一化
基於 docker 的開發過程
開發者通過 dockerfile 生成(build)一個映象(image),通過 docker run ...
生成一個容器(constainer),可以把這個映象推送至遠端倉庫上(docker push
),既可以供別人下載(docker pull
)再 run 生成容器。而一些環境變數可以寫進 dockerfile 中,這樣就保持了環境的一致性,可移植到任何伺服器上
技術實現原理
namespace 解決的問題是環境隔離問題
cgroup 解決計算機資源使用上的隔離
架構圖
docker 是如何工作的
docker 使用的是常見的 CS 架構,也就是 client-server 模式,docker client 負責處理使用者輸入的各種命令,比如 docker build、docker run,真正工作的其實是 server,也就是 docker daemon(守護程式),值得注意的是,docker client 和 docker daemon 可以執行在同一臺機器上
我們用幾個命令來解釋下 docker 工作流程:
docker build
當我們寫完 dockerfile 交給 docker“編譯”時使用這個命令,那麼 client 在接收到請求後轉發給 docker daemon,接著 docker daemon 根據 dockerfile 建立出“可執行程式”image
docker run
有了“可執行程式”image 後就可以執行程式了,接下來使用命令 docker run,docker daemon 接收到該命令後找到具體的 image,然後載入到記憶體可以執行,image 執行起來就是所謂的 container
docker pull
其實 docker build 和 docker run 是兩個最核心的命令,會用這兩個命令基本上 docker 就可以用起來,剩下的就是一些補充。
docker pull 是什麼意思,學過 git 的同學都知道有 git pull,從遠端倉庫拉資料,你可以將你的 image 放到 docker hub 上,我們使用 docker pull,就是從 docker hub 上下載 image
這個命令的實現很簡單,使用者通過 docker client 傳送命令,docker daemon 接受到命令後向 docker registry 傳送 image 下載請求,下載後存放在本地,這樣我們就可以使用 image 了
這是我19年的舊文,目前做搬運整理