Docker 1.10版本發布

jopen 8年前發布 | 9K 次閱讀 Docker

【編者的話】 Docker 1 .10 于二月初發布了,這是容器社區最近的重大事件,除了修復很多bug和功能增強之外,Docker1.10還引入了幾個我們一直期待的重大改進和特性。在本文中我將會著重闡述我個人認為最有用和最令人興奮的特性。

Docker Compose對于網絡和卷的支持

Docker Compse 1.6 是與Docker 1.10一起發布的,在Docker 1.9中引入了完全重新設計的網絡和卷系統后,這一版中增加了對于將網絡和卷作為頂級實體的支持。

最新版本的Docker Compose向后兼容老的文件格式,為了遷移到Docker Compose的Version 2文件格式,在頂部增加了 version:’2’ 這一行,將所有已存在的服務定義移動到新的 service: 分段中,并且可選擇性地為網絡和卷創建 volumn:network: 分段。

通過這些新增加的特性,用戶可以在 docker-compose.yml 文件中定義更加復雜的網絡和存儲設置,在這些環境中開發應用程序,只需要使用Docker Compose和Docker Swarm就可以在持續集成、測試和最終的生產環境中采用相同的設置,這是非常神奇的!

docker-compose.yml 文件中一個小而美的語義上的改進就是用戶可以為一個容器定義 鏡像 名字和 構建 目錄,并且保存一段時間,如果已經存在了,那么就不需要每次都重建了。

網絡相關的甜點

在Docker 1.10版本中添加了更多與網絡相關的特性,如下所示:

● 內部網絡,可以用來創建限制內外流量的網絡

● 容器可以分配自定義的IP地址

● 容器間的連接可以使用各種類型的網絡,不僅僅是默認的橋接網絡

● 默認使用內嵌的DNS服務,代替了早期使用的基于 /etc/host 文件的解決方案,因為DNS的擴展性更好。

Docker 1.10的新的安全特性

作為Docker 1.10發行版的一部分,幾個關鍵的安全改進也被添加了進來。Seccomp模板(Linux系統調用過濾)、內容可尋址的鏡像ID和User Namespace是最其中重要的幾點。

Docker中的User Namespace

Linux 命名空間(UTS、PID、NET、MNT和IPC)是允許我們創建Linux容器的其中之一的 概念 ,這個概念允許我們在不同的上下文環境中用相同的名字調用不同的東西,就像編程語言的命名空間,User Namespace(簡寫為USER)是添加到Linux內核中的最新的容器命名空間。

在User Namespace引入到Docker之前,容器中的Root用戶與宿主機系統的Root用戶具有相同的UID,其它容器可能也是如此,這顯然是一個安全問題。借助于User Namespace,容器提供了UID和GID的映射,這就允許容器中的進程認為自己以UID 0運行(通常是Root用戶),而實際上它們是以UID 1234、42或者其它的一些UID運行的,這意味著這些進程從容器的角度而言具有Root訪問權限,但是從宿主機系統角度而言不具備這個權限的。

黑客將會經歷更加艱難的破解時間(也許是更加有趣)來再次打破容器的安全限制。

目前UID和GID的映射是在Docker守護進程級別指定的(使用flag —userns-remap ),然而,未來我們可以期望努力實現在每個容器上允許有不同的映射集,這樣就可以在一個Docker主機上實現安全的多租戶了。

Docker中的安全計算模式

安全計算模式或者簡寫為seccomp是Linux內核的沙盒機制,出現自2.6.12內核版本,所以這不是一個新概念。

Seccomp本質上允許用戶過濾有效進程的系統調用,它可以顯著降低攻擊面,只使能應用程序/進程實際需要使用其功能的那些系統調用。你的每個PHP應用平均需要訪問300個以上的有效系統調用嗎?也許不用。

在Docker 1.10中,用戶要么使用 完整的默認seccomp模板 以JSON文件來定義他們自己的配置并且使用參數 security-opt 傳給容器,要么不用任何seccomp模板(不推薦)運行容器。

內容可尋址的IDs

每一個Docker鏡像代表一個鏡像層的堆棧,這些鏡像層是鏡像文件系統的快照,存在于對最初的Dockerfile文件 docker build 過程中的每一步命令執行之后,這些鏡像層,要么是從Docker Registry拉取的,要么是本地構建的,都是只讀的對象,在它們的頂層增加一個讀寫層就創建了一個容器。

在過去版本的Docker中,鏡像層(以及容器)是通過一個隨機的UUID來識別的,從Docker 1.10版本開始,鏡像層是通過一個內容的哈希來識別的,這使得在對鏡像拉取、推送、載入和保存之后的完整性校驗更加容易和透明,因為沒有兩個不同的鏡像層意外地具有相同的ID,反之亦然。

由早期版本的Docke構建的現有鏡像不得不遷移,當升級到Docker 1.10版本后,Docker守護進程會自動將同一主機上的所有鏡像作遷移,如果有很多鏡像需要做哈希的話,這會持續幾分鐘。如果你不想等待那樣長的時間,有一個離線遷移的腳本。

注意:在Docker 1.10中容器ID仍然是隨機的UUID。

更多的更新

這一版本中還有更多的甜點。添加了命令 docker update ,該命令允許更新已運行容器的資源約束,在更改資源約束配置文件之后,不需要重啟Docker守護進程。資源約束用于磁盤的I/O,下載/更新管理器也被重構允許更快的鏡像拉取和并行推送,等等。

總結

Docker 1.10是一個非凡的發行版。一周前我已經遷移所有的主機到了新版本,沒有遇到任何問題(就像我上次升級到1.9后)。我鼓勵每個人都考慮升級。

原文鏈接:(翻譯:胡震)

來自: http://dockone.io/article/1065

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!