一、Docker簡介
1、前提知識
(1)強制:熟悉Linux命令及相關背景知識;
(2)建議:熟悉Git相關的知識。
2、是什麼
(1)問題:爲什麼會有docker出現
一款產品從開發到上線,從操作系統到運行環境,再到應用配置。作爲開發與運維之間的協作我們需要關心很多東西,這也是很多互聯網公司不得不面對的問題,特別是各種版本迭代之後,不同版本環境的兼容,對運維人員都是考驗。
Docker之所以發展如此迅速,也是因爲它對此給出了一個標準化的解決方案。
環境配置如此麻煩,換一臺機器,就要重來一次,費時費力。很多人想到,能不能從根本上解決問題。軟件可以帶環境安裝?也就是說,安裝的時候,把原始環境一模一樣地複製過來。開發人員利用Docker可以消除協作編碼時“在我的機器上可正常工作,換個環境就出問題”。
一個項目可能包含Java/Tomcat/Mysql/JDBC驅動包等,安裝這些東西並不方便,它還不能跨平臺。假如我們是在Windows上安裝這些文件,到了Linux又得重新安裝。況且就算不跨操作系統,換另一臺同樣操作系統的服務器,要移植應用也是非常麻煩的。
傳統上認爲,軟件編碼開發/測試結束後,所產出的成果即是程序或是能夠編譯執行的二進制字節碼等(Java爲例)。而爲了讓這些程序可以順利執行,開發團隊也得準備完整的部署文件,讓運維團隊得以部署應用。開發需要清楚的告訴運維部署團隊,用的全部配置文件+所有軟件環境。不過,即便如此,仍然常常發生部署失敗的狀況。Docker鏡像的設計,使得Docker得以打破過去【程序即應用】的觀念。透過鏡像(images)將作業系統除核心外,運作應用程序所需的系統環境,由上而下打包,達到應用程式跨平臺間的無縫接軌運作。
(2)理念
Docker是基於Go語言實現的雲開源項目。
Docker的主要目標是“Build,Ship and Run Any App, Anywhere”,也就是通過對應用組件的封裝、分發、部署、運行等生命週期的管理,使用戶的APP(可以是一個Web應用或數據庫應用等等)及其運行環境能夠做到“一次封裝,到處運行”。
Linux容器的出現就解決了這樣一個問題,而Docker就是在它的基礎上發展過來的,將應用運行在Docker容器上面,而Docker容器在任何操作系統上都是一致的,這就實現了跨平臺、跨服務器。只需要一次配置好環境,換到別的機子上就可以一鍵部署好,大大簡化了操作。
(3)一句話
Docker解決了運行時環境和配置問題軟件容器,方便持續集成並有助於整體發佈的容器虛擬化技術。(Docker三要素:倉庫、鏡像、容器)
3、能幹嘛
1、之前的虛擬機技術
虛擬機就是帶環境安裝的一種解決方案。它可以在一種操作系統裏面運行另一種操作系統,比如在Windows系統裏面運行Linux系統。應用程序對此毫無感知,因爲虛擬機看上去跟真實系統一模一樣,而對於底層系統來說,虛擬機就是一個普通文件,不需要了就刪除,對其他部分毫無影響。這類虛擬機完美的運行了另一套系統,能夠使應用程序,操作系統和硬件三者之間的邏輯不變。
虛擬機的缺點:(1)佔用資源多;(2)冗餘步驟多;(3)啓動慢。
2、容器虛擬化技術
由於前面虛擬機存在這些缺點,Linux發展出了另一種虛擬化技術:Linux容器(Linux Containers,縮寫LXC)。
Linux容器不是模擬一個完整的操作系統,而是對進程進行隔離。有了容器,就可以將軟件運行所需的所有資源打包到一個隔離的容器中。容器與虛擬機不同,不需要捆綁一整套操作系統,只需要軟件工作所需的庫資源和設置。系統因此而變得高效輕量並保證部署在任何環境中的軟件都能始終如一地運行。
比較了Docker和傳統虛擬化方式地不同之處:
(1)傳統虛擬機技術是虛擬出一套硬件後,在其上運行一個完整操作系統,在該系統上再運行所需應用進程;
(2)而容器內的應用進程直接運行於宿主的內核,容器沒有自己的內核,而且也沒有進行硬件虛擬。因此容器比傳統虛擬機更爲輕便;
(3)每個容器之間互相隔離,每個容器都有自己的文件系統,容器之間進程不會相互影響,能區分計算資源。
4、去哪下
(1)官網
docker官網:http://www.docker.com
docker中文網站:https://www.docker-cn.com/
(2)倉庫
Docker Hub官網:https://hub.docker.com/
二、Docker安裝
Docker架構圖
1、docker的基本組成
(1)鏡像
Docker鏡像(Image)就是一個只讀模板。鏡像可以用來創建Docker容器,一個鏡像可以創建很多容器。容器與鏡像的關係類似於面向對象編程中的對象與類。
Docker | 面向對象 |
---|---|
容器 | 對象 |
鏡像 | 類 |
(2)容器
Docker利用容器(Container)獨立運行的一個或一組應用。容器是用鏡像創建的運行實例。
- 它可以被啓動、開始、停止、刪除。每個容器都是相互隔離的、保證安全的平臺。
- 可以把容器看做是一個簡易版的Linux環境(包括root用戶權限、進程空間、用戶空間和網絡空間等)和運行在其中的應用程序。
- 容器的定義幾乎和鏡像一樣,也是一堆層的統一視角,唯一區別在於容器的最上面那一層是可讀可寫的。
(3)倉庫 - 倉庫是集中存放鏡像文件的場所;
- 倉庫和倉庫註冊服務器是有區別的。倉庫註冊服務器上往往存放着多個倉庫,每個倉庫中又包含了多個鏡像,每個鏡像有不同的標籤;
- 倉庫分爲公開倉庫和私有倉庫兩種形式,最大的公開倉庫是Docker Hub(https://hub.docker.com/),存放了數量龐大的鏡像供用戶下載。國內的公開倉庫包括阿里雲、網易雲等。
2、安裝步驟
(1)更新yum
yum update
(2)安裝需要的軟件包
yum install -y yum-utils device-mapper-persistent-data lvm2
(3)設置yum源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
(4)可以查看所有倉庫中所有docker版本,並選擇特定版本安裝
查看版本
yum list docker-ce --showduplicates | sort -r
我下載安裝的版本
yum install docker-ce-18.03.1.ce
不選擇版本號,默認安裝最新版本
yum install docker-ce
(5)啓動docker
systemctl start docker
(6)將docker加入開機啓動項(可設可不設)
systemctl enable docker
(7)查看docker版本
docker version
三、永遠的HelloWorld
執行docker命令
docker run hello-world
結果如下:
此命令會去跑hello-world鏡像,但是我們目前還沒有創建該鏡像,所以它會去找是否有該容器。而容器我們也還沒有從倉庫拉取到本地,所以它會自動去拉取該容器下來,如下圖所示。
四、docker底層原理
1、docker是怎麼工作的
Docker是一個Client-Server結構的系統,Docker守護進程運行在主機上,然後通過Socket連接從客戶端訪問,守護進程從客戶端接受命令並管理運行在主機上的容器。容器,是一個運行時環境,就是我們前面說到的集裝箱。
2、爲什麼docker比較比VM快
(1)docker有着比虛擬機更少的抽象層。由於docker不需要Hypervisor實現硬件資源虛擬化,運行在docker容器上的程序直接使用的都是實際物理機的硬件資源。因此在CPU、內存利用率上docker將會在效率上有明顯優勢;
(2)docker利用的是宿主機的內核,而不需要Guest OS。因此,當新建一個容器時,docker不需要和虛擬機一樣重新加載一個操作系統內核。仍而避免引尋、加載操作系統內核這個比較費時費資源的過程,當新建一個虛擬機時,虛擬機軟件需要加載Guest OS,返個新建過程是分鐘級別的。而docker由於直接利用宿主機的操作系統,則省略了這個過程,因此新建一個docker容器只需要幾秒鐘。
Docker容器 | 虛擬機VM | |
---|---|---|
操作系統 | 與宿主機共享OS | 宿主機OS上運行虛擬機OS |
存儲大小 | 鏡像小,便於存儲和傳輸 | 鏡像龐大(vmdk、vdi等) |
運行性能 | 幾乎無額外性能損失 | 操作系統額外的CPU、內存消耗 |
移植性 | 輕便、靈活,適應於Linux | 笨重,與虛擬化技術耦合度高 |
硬件親和性 | 面向軟件開發者 | 面向硬件運維者 |