docker 1.13 發布已經26天了,趁著今天想起系統密碼,更新了一下系統,順便體驗一下新版本的功能。
因為我之前沒有裝過插件,一直都是乖乖用穩定版,所以像 docker plugin、docker stack這些子命令我都沒有試過。因此本次升級沒有卸載插件的步驟,不過你要是以前裝了插件得先卸載,畢竟api變了。
docker 1.13.1
新增哪些功能
從國內幾家科技媒體的文章都是從這里粘貼復制的:
該版本更新內容較多,涉及到網絡、插件、移除掉的 api & 客戶端、運行時、安全性以及依賴等。
docker 1.13有一千四百多個issue/pull request,五千多個commits,是docker歷史上最高的發布版本。這并不是一個簡單的小版本變化,里面有大量的更新。
top 10 新增功能
- 正式支持服務棧:docker stack
- 正式支持插件:docker plugin
- 添加在swarm集群環境下對密碼、密鑰管理的 secret 管理服務:docker secret
- 增加命令:docker system
- 可以直接使用 docker-compose.yml 進行服務部署
- 添加 docker service 滾動升級出故障后回滾的功能
- 增加強制再發布選項 docker service update –force
- 允許 docker service create 映射宿主端口,而不是邊界負載均衡網絡端口
- 允許 docker run 連入指定的 swarm mode 的 overlay 網絡
- 解決中國 gfw 墻掉 docker-engine apt/yum 源的問題
好了,逐一看看這新功能咯。
構建緩存
第一件事就是構建緩存,終于來了。這個功能在持續構建過程中太有用了,以前docker只能自己自動利用本地構建緩存,現在可以指定構建緩存了,不過使用緩存的前提條件是曾經在本地構建過這個鏡像。
例如,在合并請求中看到的例子:
1
2
|
docker pull myimage:v1.0 docker build --cache-from myimage:v1.0 -t myimage:v1.1 . |
ps:另外發現docker這個版本對鏡像標簽命名也做了限制,必須是“用戶/倉庫”的格式。
壓扁 (squash) 鏡像
這個怎么翻譯?算了,跟風保留“壓扁”。這個對我個人來說效果不是很明顯,因為我總是把全部run指令寫到一起,以此減少鏡像體積。
但也總有人喜歡一句命令一個run指令,這樣這個功能就很有用了。(話說這個寫法真是不作不死。)
正確的做法當然是遵循 dockerfile 最佳實踐,應該把多個命令合并為一個 run,每一個 run 要精心設計,確保安裝構建最后進行清理。這樣才可以降低鏡像體積,以及最大化的利用構建緩存。
不過docker這么人性化,當然得為這些“一行一個run”的用戶添加點功能,以此減少他們構建鏡像的體積。
同樣是 docker build 的參數:--squash,你可以理解為docker自動把多個run在同一文件層執行了,不過保留了每一個run的構建歷史。
要是這個功能完善之后,我也要轉投“一行一個run”,畢竟省事很多啊。這個功能還在試驗階段。
構建鏡像時指定網絡
這個我很少遇到過啊,一般都是直接改/etc/hosts文件,反正也不復雜,不過要是在分布網絡里就麻煩了點。
docker build --network指定網絡就好,還是蠻有用的。
--build-arg問題修復
這個我也不怎么遇到,畢竟我很少有項目需要持續構建啊。以前的設定是--build-arg后面的變量一定要在構建過程中用到,現在即使制定了不用也可以,不會構建失敗。
這樣改的好處就是,在一些公司中持續構建過程中,不同dockerfile使用不同的--build-arg參數,而持續構建中使用同一條構建指令(或者腳本)構建,1.12版本時是會報錯的,1.13降為警告級別。
對于我這種一般用戶而言直接寫進 dockerfile 里好了。
安裝過程可以使用--mirror參數
這個是“專門”為天朝添加的功能,笑。
1
|
curl -ssl https: //get .docker.com/ | sh -s -- --mirror azurechinacloud |
上面的例子中安裝docker時會使用微軟中國的鏡像,至于安裝后會不會自動添加倉庫鏡像源,我不知道啊。
docker run 直接加入集群
以前swarm集群網絡是不允許容器這樣加入網絡中的,因為有可能會破壞集群網絡結構。
然后大伙又有這種需求,于是一種折中的辦法就是添加一個--attachable參數。
1
|
$ docker network create -d overlay --attachable test_attach |
老實說這樣不太好的感覺,新加入的容器很容易就玩壞整個集群吶,壞笑。在服務設計時多考慮一下就好了啊,安全為上。
service create --publish格式變化
1
|
--publish protocol=tcp,mode=ingress,published=8080,target=80 |
我沒有試過嘍,-p已經滿足我了。
network inspect顯示連接節點
這個大大的好,以前只能靠第三方工具或者拐彎抹角地查看,現在直接在管理節點就可以看到了。
插件來了
1.12的這個實驗特性真是蠻讓人期待的。然而我暫時不想看,笑。
checkpoint
檢查點,有點像賽車,跑到中途一個檢查點,備份記錄一下當時的狀態,然后繼續前進,需要時可以從某個檢查點的狀態恢復。這么一看挺像快照的功能,要是進入正式版,估計eclipse che那里的快照命名會有改進。
docker stats顯示容器名
這個反人類的設計終于有了人性化的改進,以前查看容器狀態還得看容器id,現在可以顯示容器名了。
注意是可以,默認還是不顯示的,需要定制輸出格式:
docker stats --format 'table {{.name}}\t{{.cpuperc}}\t{{.memusage}}\t{{.memperc}}\t{{.netio}}\t{{.blockio}}\t{{.pids}}'
is-task過濾器
docker ps 的一個參數,可以顯示哪些容器是集群服務的容器,哪些是直接運行起來容器。還是有用的功能,不過我自己對容器命名都蠻嚴格的,不會亂到不認識,笑。
1
|
docker ps -f 'is-task=true' |
inspect升級
這個命令已經可以查看任何docker對象了,是任何哦。
邪惡的我試了一下,同時存在名為nginx鏡像、容器、網絡、服務的情況下,inspect會優先查看名為nginx容器的信息,查看其它同名對象的信息就需要使用id了。
直接啟用實驗功能
dockerd --experimental就可以直接啟用實驗功能了,簡直測試實驗功能的利器,不需要重裝docker了。
增加 docker system 命令
很多人在以前搞不懂自己的鏡像到底占了多少空間、容器占了多少空間,卷占了多少空間。怎么刪除不用的東西以釋放資源。從 1.13 開始,docker 提供了一組 system 命令來幫助系統管理上的問題。
1
2
3
4
5
|
docker system df type total active size reclaimable images 21 3 10.3 gb 8.564 gb (83%) containers 3 3 2 b 0 b (0%) local volumes 1 1 0 b 0 b |
那個reclaimable居然那么大,嚇我一跳,后來一想我電腦在家就運行兩個容器,所以其他鏡像都被識別為可回收的了。
還有那個數據卷,我數據卷少說也有幾百mb,不知道這里的結果是怎么計算出來的。
上面顯示的列表中列出了鏡像、容器、本地卷所占用的磁盤空間,以及可能回收的磁盤空間。比如,我們看到鏡像有 123mb 的空間可以回收,從 1.13 開始,docker 提供了一組 prune 命令,分別是:
- docker image prune:刪除無用的鏡像
- docker container prune:刪除無用的容器
- docker volume prune:刪除無用的卷
- docker network prune:刪除無用的網絡
- docker system prune:刪除無用的鏡像、容器、卷、網絡
一個值得提醒的是,這個版本的命令有了很多調整,雖然保留了1.12時候的風格,但是docker已經開始更加合理地分配子命令。
之前默認的 docker info,docker ps,docker rm,docker run 都開始歸類于對應的 docker image, docker container, docker system 下了。
之前的命令依舊可以使用,會繼續保持一段時間。但是從 1.13 開始,推薦使用各個子命令的版本了。
swarm新加的幾個功能都沒看,有空再說吧。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:http://www.jianshu.com/p/56b424c3a1bd