【DockerCon2017最新技術解讀】Docker最新特性介紹
譚林華(花名:霖華),阿里雲容器服務團隊技術專家,具有多年PaaS產品研發經驗,在平台設計、基礎架構等方面具有深厚的功底,Docker技術實踐者,目前負責阿里雲容器服務鏡像構建等功能。
本次將分享關於Docker新特性如下的幾個點:- 多階段構建
- 資源管理
- Docker secrets
- swarm mode
- 健康檢查
首先介紹Docker新推出的多階段構建;其次介紹一下Docker在資源管理方面新加的一些命令,這些命令可以方便開發者來做資源管理;還有就是介紹一下Docker secret跟之前那些密碼管理的方式有什麼不同;還有就是swarm mode裡面的一些新特性;最後再介紹一下swarm mode下面的健康檢查。
首先看一下多階段構建,構建鏡像了解Docker的同學應該比較熟悉。現在想像一個在Java語言下構建鏡像的場景,這個場景下開發者提交代碼,然後一個構建模塊,之後就去拉取GitHub或者其他源代碼倉庫的代碼,最後執行構建。像對這種靜態語言的構建而言,其實過程會稍微麻煩一點,比如說要有編譯器對它進行編譯,然後跑單元測試,然後打包,打包到最後就生成了War包或者Jar包,最後推到Registry中去。這個過程有一個問題就是如果把所有的內容都放在一個Dockerfile裡面,源代碼就會包含在鏡像裡面,所以這裡有源代碼泄露的風險。還有就是具體的生產環境其實是不需要那些編譯器源代碼以及測試框架或者打包框架的,最終可能只需要一個簡單的運行環境就可以了,這樣會導致鏡像變得特別大,所以這個方案不是特別好。再來看一下Docker在5月份出來的一個最新的17.05版本,這個版本中引入了multi-stage build,也就是多階段構建。它的思路就是把剛剛提到的在構建鏡像的過程拆成兩個階段,這兩個階段都會產生鏡像,第一個階段就是去執行編譯、測試然後打包,得到一個鏡像,對於第一階段得到的鏡像,並不會使用這個鏡像的全部內容;在第二階段,可以把第一個階段的Jar包拷貝到第二個階段,這樣的好處就是沒有源代碼泄露的風險,因為最終打包到生產環境的只有最終編譯的位元組碼文件。同時整個鏡像也變得很小,因為它裡面沒有包含源代碼也沒有包含一些編譯器的軟體、測試框架和打包工具,所以這個方案是比較完美的。
然後看一下它最終的實現,上圖展現的主要是設計思路,最終實現是通過加入一些簡單的語法來支持這個功能的。下圖顯示的就是一個Dockerfile,它分為兩個構建階段,兩個構建階段都會生成鏡像,然後第二個構建鏡像是通過引用第一個構建鏡像的方式,把第一個構建鏡像裡面的Jar包打到第二個鏡像裡面。主要使用了copy命令,這裡面有個from參數,from參數引用了第一個構建鏡像的名稱,Dockerfile增加了一個新的語法就是AS命令,上面這個紅框中from指令就相當於給這個構建階段取了一個名字叫build-env,然後在第二個構建階段裡面就引用它,相當於把第一個構建鏡像裡面target目錄下面的app.jar拷貝到當前鏡像的工作目錄中,這樣的好處就是最終只包含了運行環境和部署到生產環境的Jar包,所以整個鏡像也變小了,也沒有代碼泄露的風險。
下圖展現了在Docker 1.13中引入的一些資源管理命令,比如docker system df,它可以查看整個容器集群裡面資源的使用情況,包括鏡像的使用情況以及數據卷的使用情況。還有就是以前要刪除鏡像或者刪除容器可能都比較麻煩,需要指定鏡像ID或容器ID,現在它提供了docker system prune的命令,可以很方便地一鍵清理所有沒有被使用或者沒有被引用的資源,這些資源包括所有停止的容器,還有就是所有沒有被引用的鏡像,以及數據卷和網路資源對象。沒有被引用的鏡像是什麼意思呢?這裡用了dangling這個英文單詞,稍後會具體介紹。還有就是在一鍵清理這些資源的同時,可以針對某個特定的資源進行清理,也就是第三條命令,可以清理所有沒有被使用的容器鏡像、網路或者數據卷。
我們來了解一下dangling的含義,在17.05的時候,其實dangling的含義發生了一點點變化。之前dangling的含義指的是同時沒有版本和名稱的鏡像,這個鏡像版本指的是就是鏡像tag,像這種情況它會認為是dangling的鏡像,所以在使用prune的時候會把它刪掉。現在dangling的含義也包括有鏡像名稱,但是沒有鏡像版本的鏡像。這種情況最常見於要構建相同tag的鏡像時,新構建的鏡像會把老的覆蓋掉,最後它的鏡像tag會變為none,所以這種情況在prune中刪掉也是合理的。接下來介紹一下Docker Secrets,Secrets這個特性的引進還算比較早,在1.13版本就引入了。大家可以理解一下在引入Docker Secrets之前是怎麼樣傳入一些密碼這樣的敏感信息的,比如下圖這裡就是一個簡單的compose文件,這個文件裡面就是通過環境變數的方式把密碼傳進去,而這樣的方式有一個問題就是不是很安全,還有就是也不適合許可權管理,因為有些程序員可能不需要知道密碼裡面具體的內容,只需要去部署這個compose文件,所以這裡有這樣的兩個缺點。健康檢查有什麼用呢,之前提到可以通過docker ps來查看任務或者容器是否處於健康狀態,但是現在比如這裡的Redis它後面會有一個狀態告訴你這個容器是否健康。同時這個健康檢查還會跟swarm mode調度結合在一起,這是什麼意思呢?就是說如果swarm根據你設置的健康檢查指令發現任務失敗了,它就會認為這個任務健康檢查不通過,但是這個任務還在運行中,它會主動地把運行中的這個任務退出,然後再新起一個任務,比如你的任務指定了一定要始終保持三個拷貝,然後它就始終會有三個拷貝在運行狀態,還有就是它在啟動時會保證去檢查健康狀況。
推薦閱讀:
※Egg.js+Antd 擼個簡易版阿里雲CS控制台?
※Docker Remote API 如何使用?
※基於OSS搭建私有(跨區域)Docker鏡像倉庫
※把docker鏡像當作桌面系統來用
※Docker 重要更新: 原生支持多階段構建(multi-stage build)
TAG:Docker |