天天看點

【全幹貨】5分鐘帶你看懂 Docker!

Docker 是啥?

打開翻譯君輸入 Docker 結果顯示碼頭勞工,沒錯!碼頭勞工搬運的是集裝箱,那麼今天要講的 Docker 其操作的也是集裝箱,這個集裝箱就靜态而言就是一個應用鏡像檔案,就動态而言,就是一個容器。蒙了吧?好吧,上圖解釋。

【全幹貨】5分鐘帶你看懂 Docker!

Docker 從狹義上來講就是一個程序,從廣義上來講是一個虛拟容器,其實更專業的叫法是應用容器( Application Container ),Docker 程序和普通的程序沒有任何差別,它就是一個普通的應用程序。不過是用來操作鏡像檔案的。是以 Docker 程序+建構的應用鏡像檔案就等于 Docker 容器。本文所有講的 Docker 都是指 Docker 容器哦。

再繼續下文之前我們首先要明确幾個 docker 重要的基本概念吧,鏡像,容器,倉庫。

鏡像 Docker images,就類似于 VM 虛拟機裡面的快照,但是可比快照輕量化多了。快照不懂?那可以把 images 直接了解成一個檔案夾。我們可以通過 ID 或者易識别的名字 +tag 來确認唯一的目标鏡像。ImagesID 是一個64位的字元,但是一般我們都是使用前面12位就足夠差別了。

【全幹貨】5分鐘帶你看懂 Docker!

如圖中左邊紅框中 redis: lates 和右邊的紅框中 5f515359c7f8 都唯一表示為同一個鏡像。是以我們一般的鏡像可以命名為類似centos: latest、centos: centos7.1.1503等等。

鏡像是分層的,有基礎鏡像,僅僅包含作業系統,比如 centos 鏡像;有中間件鏡像,比如 redis 等資料庫鏡像;最後是應用鏡像,就是指具體的應用服務了,應用鏡像可以非常豐富,随時可以釋出,這三者之間依次疊加。

是以當我們在使用 Docker 建構鏡像的時候,每一個指令都會在前一個指令的基礎上形成一個新鏡像層。如下圖,基礎鏡像就是 centos 鏡像,中間件鏡像就是兩個紅色圈,應用鏡像就是紫色圈。其中 redis+centos 這樣疊加組合的中間件鏡像就可以供A服務或者B服務使用,這樣疊加組合更加靈活。仍和一種鏡像都可以從 Docker hub 公共倉庫中拉取。

【全幹貨】5分鐘帶你看懂 Docker!
容器 Docker containers,你可以從鏡像中建立容器,這如同從快照中建立虛拟機,不過更輕量,啟動更快,秒啟。應用是在容器中運作的,打個比方,你首先下載下傳了一個 Ubuntu 的鏡像,然後又安裝 MySQL 和 Django 應用及其依賴,來完成對它 Ubutun 鏡像的修改,一個個人覺得非常完美應用鏡像生成了!就把這個鏡像分享給大家使用,大家通過這個鏡像就生成一個容器。容器啟動之後就會運作 Django 服務了。
【全幹貨】5分鐘帶你看懂 Docker!

上面也說到了,容器就是一個個獨立的封閉的集裝箱,但是也需要對外提供服務的,是以 Docker 允許公開容器的特定端口,在啟動 Docker 的時候,我們就可以将容器的特定端口映射到主控端上面的任意一個端口,是以,如果幾個服務都需要80端口,那麼容器的對外端口是80,但是映射到主控端上面就是任意端口,就不會産生沖突,是以就不需要通過代理來解決沖突。容器對外端口與主控端的端口映射可以通過下面的指令來完成。

啟動 docker 容器

docker run -d -p 2222:22 --name 容器名 鏡像名

-d 守護容器,就是背景運作,退出指令視窗容器也不會停止

-it 互動式容器 退出指令視窗容器就停止運作了

-p主控端端口和容器端口映射

8081:80 主控端端口:容器公開的端口

【全幹貨】5分鐘帶你看懂 Docker!

倉庫 Docker registeries,docker 倉庫和存放集裝箱的倉庫是一樣的,不過 docker 使用來存放鏡像的。倉庫存在公有和私有之分,公有倉庫 docker hub 提供了非常多的鏡像檔案,這些鏡像直接拉取下來就可以運作了,你也可以上傳自己的鏡像到 docker hub 上面。同時也可以自己搭建私有倉庫用于團隊項目管理。

結合前面介紹的基本概念,我們可以将 docker 的幾個概念使用大緻串起來,他們之間是如何運作的,也就是 Docker 的生命周期。看下圖,主要是三步走。

【全幹貨】5分鐘帶你看懂 Docker!
【全幹貨】5分鐘帶你看懂 Docker!
開發建構鏡像并将鏡像 push 到 Docker 倉庫;
【全幹貨】5分鐘帶你看懂 Docker!
測試或者運維從 Docker 倉庫拷貝一份鏡像到本地;
【全幹貨】5分鐘帶你看懂 Docker!

通過鏡像檔案開啟 Docker 容器并提供服務。

為啥要用 Docker?能幹些啥?

這要從目前軟體行業的痛點來講起:

【全幹貨】5分鐘帶你看懂 Docker!
軟體更新釋出及部署低效,過程繁瑣且需要人工介入;
【全幹貨】5分鐘帶你看懂 Docker!
環境一緻性難以保證;
【全幹貨】5分鐘帶你看懂 Docker!

不同環境之間遷移成本太高。

有了 Docker 可以很大程度解決上面的問題。

首先,Docker 的使用簡單至極,從開發的角度來看就是三步走:建構,運輸,運作。其中關鍵步驟就是建構環節,即打包鏡像檔案。但是從測試和運維的角度來看,那就隻有兩步:複制,運作。有了這個鏡像,那麼想複制到哪運作都可以,完全和平台無關了。同時 Docker 這種容器技術隔離出了獨立的運作空間,不會和其他應用争用系統資源了以及還不需要考慮應用之間互相影響,想想就開心。

其次,因為在建構鏡像的時候就處理完了服務程式對于系統的所有依賴,是以在你使用的時候,你可以忽略掉原本程式的依賴以及開發語言。對測試和運維而言,更多專注于自己的業務内容上。

最後,Docker 于開發者而言提供了一種開發環境的管理辦法,與測試人員而言保證了環境的同步,于運維人員提供了可移植的标準化部署流程。

是以, Docker 能幹啥,總結如下:

  • 建構容易分發簡單
  • 隔離應用解除依賴
  • 快速部署測完就銷

Docker 是個程序級的輕量化虛拟機,和傳統虛拟機有啥差別呢?

Docker 這個虛拟機超級輕量級,僅僅是一個程序而已。與傳統的虛拟機比如 VM 有着巨大的差别,差別看下圖:

【全幹貨】5分鐘帶你看懂 Docker!

我們來看一下二者的差別,因為 VM 的 Hypervisor 需要實作對硬體的虛拟化,并且還要搭載自己的作業系統,其中虛拟機作業系統占用記憶體是比較大的,一個作業系統有好幾個G,自然在啟動速度和資源使用率以及性能上有非常大的開銷,如果在本地,或者個人電腦,那麼影響還不是那麼大,但是在雲端就是一個非常大的資源浪費。

咱們很多時候做事情的時候不會考慮與事情本身無關的問題,比如造飛機的不會考慮飛機是否要潛水,對于我們目前很多移動網際網路的應用來說,很少會涉及到對作業系統的部分,其實我們主要關心的是應用的本身,而 VM 虛拟機的上層是運作的運作時庫和應用,整個虛拟機的空間是非常的龐大,但是容器化技術 Docker 技術的出現後,省去了作業系統這一層,多個容器之間互相隔離且共用了宿主作業系統和運作時庫。

是以 Docker 應用容器相對于 VM 有以下幾個優點:

  • 啟動速度快,容器啟動本質就是一個開啟一個程序而已,是以都是秒啟,而 VM 通常要更久
  • 資源使用率高,一台普通 PC 可以跑成百上千個容器,你跑十個 VM 試試。
  • 性能開銷小, VM 通常需要額外的 CPU 和記憶體來完成 OS 的功能,這一部分占據了額外的資源

是以很多移動網際網路的應用或者雲計算的後端節點都可以用 Docker 來替換實體機器或者虛拟機。比如騰訊地圖的很多背景服務基本上都遷移 Docker 部署了。

Docker 是個啥架構?底層又是用的啥技術?

前面說了那麼多,始終還是霧裡看花。下面就詳細介紹一下技術架構,底層又是用的啥技術來實作上述那麼多優點的?

Docker 技術架構圖:

【全幹貨】5分鐘帶你看懂 Docker!

從 Docker 依賴的底層技術來看,Docker 原生态是不能直接在Windows平台上運作的,隻支援 Linux 系統,原因是 Docker 依賴 Linux kernel 三項最基本的技術,namespaces 充當隔離的第一級,是對 Docker 容器進行隔離,讓容器擁有獨立的 hostname,ip,pid,同時確定一個容器中運作一個程序而且不能看到或影響容器外的其它程序;Cgroups 是容器對使用的主控端資源進行核算并限制的關鍵功能。

比如 CPU,記憶體,磁盤等,union FS 主要是對鏡像也就是 image 這一塊作支援,采用 copy-on-write 技術,讓大家可以共用某一層,對于某些差異層的話就可以在差異的記憶體存儲,Libcontainer 是一個庫,是對上面這三項技術做一個封裝。

Docker engine 用來控制容器 container 的運作,以及鏡像檔案的拉取。

Docker 咋裝呢?Docker 怎麼用呢?

安裝之前,我們首先確定自己的 Linux 系統核心版本高于3.10,并且系統是64位,才能體驗 Docker 哦。

通過 uname -ir 檢視是否滿足要求。

【全幹貨】5分鐘帶你看懂 Docker!

Docker 安裝

通過腳本的方式安裝 Docker,非常簡單。

1、 擷取最新的 Docker 安裝包

nicktang@nicktang-virtual-machine:~$ wget -qO- https://get.docker.com/ | sh

【全幹貨】5分鐘帶你看懂 Docker!

輸入目前使用者的密碼後,就會下載下傳腳本并且安裝 Docker 及依賴包。

【全幹貨】5分鐘帶你看懂 Docker!

顯示上圖内容就表明安裝完成。

2、 啟動 Docker 背景服務

root@nicktang-virtual-machine:/data # sudo service docker start #啟動守護程序

root@nicktang-virtual-machine:/data # docker -v

【全幹貨】5分鐘帶你看懂 Docker!

能夠看見版本号,說明 Docker 的安裝成功。簡單吧!至此就差一個鏡像了。自己制作還是從公共倉庫拉取就随你啦。

root@nicktang-virtual-machine:/data # sudo service docker stop #關閉守護程序

Docker 使用

Docker 的使用,我們主要從【增删查】幾方面來說說怎麼使用 docker,為什麼沒有【改】呢,因為在我看來 docker 容器一旦出現問題了,根本沒有修複的必要,直接把容器停止并删除,再啟動,這樣來得快。是以我們隻需要掌握幾個基本指令即可,具體如下。

【查】檢視本地已有的鏡像 Docker images

【全幹貨】5分鐘帶你看懂 Docker!

【增】運作一個鏡像,即啟動一個容器 docker run 鏡像名 ,比如我們運作 docker run centos

鍵入這個指令的時候完成了三樣操作:

【全幹貨】5分鐘帶你看懂 Docker!

檢查本地是否有 hello-world 這個鏡像,有->就跳過第二步 沒有->依次執行;

【全幹貨】5分鐘帶你看懂 Docker!

就自動去 docker hub 下載下傳這個鏡像;

【全幹貨】5分鐘帶你看懂 Docker!

就把鏡像加載到容器并且運作。

【全幹貨】5分鐘帶你看懂 Docker!

再用 docker images 檢視的時候本地就增加了 centos 鏡像。

【全幹貨】5分鐘帶你看懂 Docker!

Tag 為 latest 就表示是最新版本的 centos 系統鏡像。因為會從 docker hub 拉取沒有的鏡像,是以算【增】裡面。

【增】拉取指定的鏡像檔案 docker pull 鏡像名:TAG

上面那種通過直接運作的方式拉取的是 docker hub 中最新的鏡像,但是有時候我想拉取指定的鏡像檔案就需要使用 docker pull 指令來拉取。因為從官方拉取鏡像檔案,通常是比較慢的,是以我們可以通過加速器技術來從國内的鏡像倉庫拉取。

【查】檢視所有的容器 docker ps -a 可以用來檢視所有的容器,包括運作中的和已經停止的。

【全幹貨】5分鐘帶你看懂 Docker!

第一個字段就是已經啟動的容器 ID,第二個字段就是這個容器是根據哪個鏡像生成的。但是上面這個指令隻是臨時啟動一下容器,上面圖中的 status 是 exited(0),表示容器是退出狀态。如果想容器在背景運作,是以我們需要啟動守護式容器才可以,隻要在啟動指令中添加一個 -d 參數,即 docker run -d centos 就可以了。

【查】檢視鏡像/容器的具體資訊 docker inspect 鏡像 ID(鏡像名)/容器 ID(容器名) docker inspect centos

這個指令是傳回一個鏡像或者容器詳細資訊的 json 串。其中包括 ID,IP,版本,容器的主程式等非常多的資訊,根據這些資訊我們可以進行二次開發。在這個指令的基礎之上增加一個-f參數我們可以指定擷取自己需要的資訊,比如擷取redis容器的IP位址,記憶體資訊,CPU使用情況。docker inspect -f '{{.NetworkSettings.IPAddress}}' [ID /Name]

【查】進入容器 docker run -it centos 即啟動一個互動式容器

-it 完成容器終端和目前終端進行關聯,即目前終端的顯示就會切換到容器終端的顯示。

檢視容器目錄結構,發現和實體機器的目錄結構完全一緻,這就是為什麼有的人稱 docker 容器也稱之為虛拟機的原因啦。Exit 可以退出容器終端。

【全幹貨】5分鐘帶你看懂 Docker!

【删】删除容器,docker rm 容器 ID,删除多個容器就可以多個容器 ID 之間用空格隔開即可。

【全幹貨】5分鐘帶你看懂 Docker!

怎麼用 Docker 完成持續內建、自動傳遞、自動部署?

這年頭見面不聊點自動化什麼的,持續什麼的,都不好意思。是以,咱們也要了解一下持續內建,自動傳遞,自動部署。但是上面說了這麼多,沒發現 Docker 有那三樣功能啊,是的,Docker 是沒有這個功能,但是你在完成上述三樣自動化的步驟都是依賴 Docker 的。Docker 是這些流程實作的基礎,就如同軟體開發,軟體代碼才是根本,開發工具是輔助。所有搭建一個完整的自動化流程還需要 github+jenkins+ registry 三樣幫助。

持續內建和自動部署的原理如下圖所示:

【全幹貨】5分鐘帶你看懂 Docker!
【全幹貨】5分鐘帶你看懂 Docker!

RD 推送代碼到 git 倉庫或者 svn 等代碼伺服器上面,git 伺服器就會通過 hook通知 jenkins;

【全幹貨】5分鐘帶你看懂 Docker!

jenkine 克隆 git 代碼到本地,并通過 dockerFile 檔案進行編譯;

【全幹貨】5分鐘帶你看懂 Docker!

打包生成一個新版本的鏡像并推送到倉庫 ,删除目前容器 ,通過新版本鏡像重新運作。

而在整個過程中 RD 隻需要敲入三個指令 Git add * ;Git commit –m “”;Git push即可完成持續內建、自動傳遞、自動部署。後面通過案例實際示範這個過程的神奇!

Docker 還可以很友善的自動擴容哦,一般的自動擴容的兩種方式,一種就是Docker 容量擴大,另一種就是 Docker 節點數擴充。第一種就修改配置檔案即可,第二種通過簡單的拷貝,運作就完成了節點的擴容。

總結

Docker 雖好,可不要貪杯哦!雖然 Docker 具有超輕量化,但是不建議一台機器上面部署太多的應用,同時部署的時候一定要差異化部署,什麼意思呢,就是将大量計算的,和記憶體需要大的,IO 操作頻繁的對系統資源需求不一緻的部署到同一台主控端上。

本文講述的 Docker 使用隻是 Docker 整個使用的非常小的一部分,其中最主要的 Docker 鏡像建構,就有很多内容可以學習探索,比如建構鏡像需要的 Dockerfile 檔案。對于測試和運維,我們隻需要懂得如何使用 Docker 即可,怎麼制作鏡像主要還是由開發來完成。

原文釋出時間為:2018-04-17

本文作者:唐文廣

本文來自雲栖社群合作夥伴“

資料和雲

”,了解相關資訊可以關注“

”。

繼續閱讀