虛擬化容器Docker的安全性討論

一.Docker所採用的安全機制分析
評估 Docker 的安全性時,主要考慮三個方面:
由內核的名字空間和控制組機制提供的容器內在安全
Docker程序(特別是服務端)本身的抗***性
內核安全性的加強機制對容器安全性的影響
1.內核名字空間
Docker 容器和 LXC 容器很相似,所提供的安全特性也差不多。當用 docker run 啓動一個容器時,在後臺 Docker 爲容器創建了一個獨立的名字空間和控制組集合。
名字空間提供了最基礎也是最直接的隔離,在容器中運行的進程不會被運行在主機上的進程和其它容器發現和作用。
每個容器都有自己獨有的網絡棧,意味着它們不能訪問其他容器的 sockets 或接口。不過,如果主機系統上做了相應的設置,容器可以像跟主機交互一樣的和其他容器交互。當指定公共端口或使用 links 來連接 2 個容器時,容器就可以相互通信了(可以根據配置來限制通信的策略)。
從網絡架構的角度來看,所有的容器通過本地主機的網橋接口相互通信,就像物理機器通過物理交換機通信一樣。
那麼,內核中實現名字空間和私有網絡的代碼是否足夠成熟?
內核名字空間從 2.6.15 版本(2008 年 7 月發佈)之後被引入,數年間,這些機制的可靠性在諸多大型生產系統中被實踐驗證。
實際上,名字空間的想法和設計提出的時間要更早,最初是爲了在內核中引入一種機制來實現 OpenVZ 的特性。而 OpenVZ 項目早在 2005 年就發佈了,其設計和實現都已經十分成熟。
普通虛擬機將整個操作系統運行在虛擬的硬件平臺上, 進而提供完整的運行環境供應用程序運行, 而Docker則直接在宿主平臺上加載運行應用程序.本質上他在底層使用LXC啓動一個Linux Container,通過cgroup等機制對不同的container內運行的應用程序進行隔離,權限管理和quota分配等。每個container擁有自己獨立的各種命名空間(亦即資源)包括: PID 進程, MNT 文件系統, NET 網絡, IPC , UTS 主機名等
2.控制組
控制組是 Linux 容器機制的另外一個關鍵組件,負責實現資源的審計和限制。
它提供了很多有用的特性;以及確保各個容器可以公平地分享主機的內存、CPU、磁盤 IO 等資源;當然,更重要的是,控制組確保了當容器內的資源使用產生壓力時不會連累主機系統。
儘管控制組不負責隔離容器之間相互訪問、處理數據和進程,它在防止拒絕服務(DDOS)***方面是必不可少的。尤其是在多用戶的平臺(比如公有或私有的 PaaS)上,控制組十分重要。例如,當某些應用程序表現異常的時候,可以保證一致地正常運行和性能。
控制組機制始於 2006 年,內核從 2.6.24 版本開始被引入。
3.Docker服務端的防護
運行一個容器或應用程序的核心是通過 Docker 服務端。Docker 服務的運行目前需要 root 權限,因此其安全性十分關鍵。
首先,確保只有可信的用戶纔可以訪問 Docker 服務。Docker 允許用戶在主機和容器間共享文件夾,同時不需要限制容器的訪問權限,這就容易讓容器突破資源限制。例如,惡意用戶啓動容器的時候將主機的根目錄/映射到容器的 /host 目錄中,那麼容器理論上就可以對主機的文件系統進行任意修改了。這聽起來很瘋狂?但是事實上幾乎所有虛擬化系統都允許類似的資源共享,而沒法禁止用戶共享主機根文件系統到虛擬機系統。
這將會造成很嚴重的安全後果。因此,當提供容器創建服務時(例如通過一個 web 服務器),要更加註意進行參數的安全檢查,防止惡意的用戶用特定參數來創建一些破壞性的容器
爲了加強對服務端的保護,Docker 的 REST API(客戶端用來跟服務端通信)在 0.5.2 之後使用本地的 Unix 套接字機制替代了原先綁定在 127.0.0.1 上的 TCP 套接字,因爲後者容易遭受跨站腳本***。現在用戶使用 Unix 權限檢查來加強套接字的訪問安全。
用戶仍可以利用 HTTP 提供 REST API 訪問。建議使用安全機制,確保只有可信的網絡或 ***,或證書保護機制(例如受保護的 stunnel 和 ssl 認證)下的訪問可以進行。此外,還可以使用 HTTPS 和證書來加強保護。
最近改進的 Linux 名字空間機制將可以實現使用非 root 用戶來運行全功能的容器。這將從根本上解決了容器和主機之間共享文件系統而引起的安全問題。
終極目標是改進 2 個重要的安全特性:
將容器的 root 用戶映射到本地主機上的非 root 用戶,減輕容器和主機之間因權限提升而引起的安全問題;
允許 Docker 服務端在非 root 權限下運行,利用安全可靠的子進程來代理執行需要特權權限的操作。這些子進程將只允許在限定範圍內進行操作,例如僅僅負責虛擬網絡設定或文件系統管理、配置操作等。
最後,建議採用專用的服務器來運行 Docker 和相關的管理服務(例如管理服務比如 ssh 監控和進程監控、管理工具 nrpe、collectd 等)。其它的業務服務都放到容器中去運行。
4.內核能力機制
能力機制(Capability)是 Linux 內核一個強大的特性,可以提供細粒度的權限訪問控制。 Linux 內核自 2.2 版本起就支持能力機制,它將權限劃分爲更加細粒度的操作能力,既可以作用在進程上,也可以作用在文件上。
例如,一個 Web 服務進程只需要綁定一個低於 1024 的端口的權限,並不需要 root 權限。那麼它只需要被授權 net_bind_service 能力即可。此外,還有很多其他的類似能力來避免進程獲取 root 權限。
默認情況下,Docker 啓動的容器被嚴格限制只允許使用內核的一部分能力。
使用能力機制對加強 Docker 容器的安全有很多好處。通常,在服務器上會運行一堆需要特權權限的進程,包括有 ssh、cron、syslogd、硬件管理工具模塊(例如負載模塊)、網絡配置工具等等。容器跟這些進程是不同的,因爲幾乎所有的特權進程都由容器以外的支持系統來進行管理。
ssh 訪問被主機上ssh服務來管理;
cron 通常應該作爲用戶進程執行,權限交給使用它服務的應用來處理;
日誌系統可由 Docker 或第三方服務管理;
硬件管理無關緊要,容器中也就無需執行 udevd 以及類似服務;
網絡管理也都在主機上設置,除非特殊需求,容器不需要對網絡進行配置。
從上面的例子可以看出,大部分情況下,容器並不需要“真正的” root 權限,容器只需要少數的能力即可。爲了加強安全,容器可以禁用一些沒必要的權限。
完全禁止任何 mount 操作;
禁止直接訪問本地主機的套接字;
禁止訪問一些文件系統的操作,比如創建新的設備、修改文件屬性等;
禁止模塊加載。
這樣,就算***者在容器中取得了 root 權限,也不能獲得本地主機的較高權限,能進行的破壞也有限。
默認情況下,Docker採用 白名單 機制,禁用 必需功能 之外的其它權限。當然,用戶也可以根據自身需求來爲 Docker 容器啓用額外的權限。
5.其它安全特性
除了能力機制之外,還可以利用一些現有的安全機制來增強使用 Docker 的安全性,例如 TOMOYO, AppArmor, SELinux, GRSEC 等。
Docker 當前默認只啓用了能力機制。用戶可以採用多種方案來加強 Docker 主機的安全,例如:
在內核中啓用 GRSEC 和 PAX,這將增加很多編譯和運行時的安全檢查;通過地址隨機化避免惡意探測等。並且,啓用該特性不需要 Docker 進行任何配置。
使用一些有增強安全特性的容器模板,比如帶 AppArmor 的模板和 Redhat 帶 SELinux 策略的模板。這些模板提供了額外的安全特性。
用戶可以自定義訪問控制機制來定製安全策略。
跟其它添加到 Docker 容器的第三方工具一樣(比如網絡拓撲和文件系統共享),有很多類似的機制,在不改變 Docker 內核情況下就可以加固現有的容器。
6.總結
總體來看,Docker 容器還是十分安全的,特別是在容器內不使用 root 權限來運行進程的話。
另外,用戶可以使用現有工具,比如 Apparmor, SELinux, GRSEC 來增強安全性;甚至自己在內核中實現更復雜的安全機制。
二.Docker的安全隱患
1.能否徹底隔離
在超複雜的業務系統中,單OS到底能不能實現徹底隔離,一個程序的崩潰/內存溢出/高CPU佔用到底會不會影響到其他容器或者整個系統?很多人對Docker能否在實際的多主機的生產環境中支持關鍵任務系統還有所懷疑。 注* 就像有人質疑Node.JS單線程快而不穩,無法在複雜場景中應用一樣。
不過可喜的是,目前Linux內核已經針對Container做了很多改進,以支持更好的隔離。
2.GO語言還沒有完全成熟
Docker由Go語言開發,但GO語言對大多數開發者來說比較陌生,而且還在不斷改進,距離成熟還有一段時間。此半git、半包管理的方式讓一些人產生不適。
3.被私有公司控制
Docker是一家叫Dotcloud的私有公司設計的,公司都是以營利爲目的,比如你沒有辦法使用源代碼編繹Docker項目,只能使用黑匣子編出的Docker二進制發行包,未來可能不是完全免費的。 目前Docker已經推出面向公司的企業級服務(諮詢、支持和培訓)。
4.Docker鏡像系統安全性討論
“本文作者深入研究了Docker鏡像的下載流程,並逐步分析了Docker鏡像下載過程中可能出現的安全問題。關注Docker安全以及做Docker鏡像存儲的同學必看。另外,作者還總結了應該採取哪些措施來改善Docker鏡像的安全性。”
最近在使用Docker下載一個“官方”容器鏡像時我看到這麼一行提示:
ubuntu:14.04: The image you are pulling has been verified
我當時以爲這和Docker極力推薦的鏡像簽名系統有關,所以並未深究。後來,在研究Docker鏡像安全相關的加密系統時,我開始進一步探索Docker的鏡像安全。而我發現所有與鏡像安全相關的邏輯完全是系統性的錯誤。
按照Docker的說法,下載的鏡像完全是基於簽名的manifest的存在而做出的,並且Docker並沒有從manifest中校驗鏡像的校驗和(checksum)。***者可以僞造提供一個具有簽名證明的鏡像,這個問題很容易被***者利用。
鏡像從HTTPS服務器上下載下來,然後通過Docker daemon的一個不安全的流處理管道:
[解壓縮] -> [tarsum] -> [解包]
這個管道很高效,但毫無安全可言。在未驗證簽名之前,管道不應該處理不受信任的輸入。然而,在驗證檢驗和之前,Docker進行了三次鏡像的處理。
儘管Docker做了聲明,但它從未實際檢查過鏡像校驗。下面是Docker中唯一一處與驗證鏡像校驗和有關的代碼,但是即便在鏡像中提供不匹配的校驗和,我也無法觸發這個警告。
if img.Checksum != "" && img.Checksum != checksum { log.Warnf("image layer checksum mismatch: computed %q, expected %q", checksum, img.Checksum) } 不安全的處理管道
解壓縮
Docker支持三種壓縮算法:gzip、bzip2和xz。前兩者使用Go的標準庫實現,這是內存安全的,所以我能想到的漏洞類型是拒絕服務***,如宕機、CPU和內存過度使用。
第三個壓縮算法xz更有趣。因爲沒有原生的Go實現,Docker運行xz程序來解壓縮。
xz程序來自XZ Utils項目,它從接近2萬行C代碼中構建而來。C不是一個內存安全的語言。這意味着一個C程序的惡意輸入,此處爲XZ Utils正在解包的Docker鏡像,有執行任意的代碼的可能。
如果Docker以root運行xz,那會更糟糕,這意味着如果xz存在一個漏洞,執行docker pull將嚴重危及你的整個系統。
Tarsum
tarsum的使用出於好意,但完全錯誤。爲了取得一個任意編碼的tar文件的確定性校驗和,Docker對tar進行解碼然後以確定性順序對特定部分進行哈希,排除了其他部分。
因爲這個處理過程是爲了生成校驗和,它正在解碼的不受信任的數據可被設計成利用tarsum代碼的漏洞。這裏可能的漏洞是拒絕服務***以及邏輯缺陷,這將引起文件在不改變校驗和的情況下被注入、跳過、使用不同方式處理、修改、添加等。
解包
解包分爲tar解碼和將文件到保存到硬盤中兩個步驟,在編寫本文的時候已經有解包階段的三個其他漏洞被報告出來,所以這也是非常危險的。
不應該存在未被檢驗的數據被解包到硬盤中的情況。
libtrust
libtrust是一個提供認證和權限控制的Docker包。但是官方沒有提供任何的規範,但它看起來像是實現了Javascript對象簽名與加密規範的一部分,以及其他不明算法。
所以在下載一個manifest簽名的以及使用libtrust驗證的鏡像時,會有如下不準確的提示:
ubuntu:14.04: The image you are pulling has been verified
目前只有Docker公司公佈的“官方”鏡像manifest使用這個系統簽名,但從我參加的最近一次Docker管理諮詢委員會會議的討論看來,Docker公司計劃在未來更廣泛的部署它。目標應該是集中管理,由Docker公司控制一個發證機構用於鏡像和/或客戶證明簽名。
我曾在Docker代碼中查找簽名密鑰,但沒找到。看來密鑰並沒有嵌入到程序中。實際上,Docker後臺會在每次鏡像下載時通過HTTPS從CDN獲取密鑰。這是一個非常糟糕的方式,因爲有很多種***可以導致受信任的密鑰被替換成惡意的。這種***包括但不限於:CDN供應商威脅、CDN供應密鑰源威脅以及客戶端下載密鑰時的中間人***。
補救
在完成此項研究之前,我已經報告了我發現的tarsum系統的幾個問題,但至今沒有一個被修復。
我覺得必須採取一些措施來改善Docker鏡像下載系統的安全性:
棄用tarsum並實際驗證鏡像摘要
爲安全起見,不應該使用tarsum。取而代之的是在進行任何處理前,將鏡像完全下載並對其加密簽名進行驗證。
增加權限隔離
涉及解壓縮或解包的鏡像處理步驟必須運行於具有最低限度的必要的權限的隔離的程序(容器?)中。不應該存在像xz這樣的解壓縮工具必須以root運行的情況。
更換libtrust
用The Update Framework替換libtrust,前者是明確設計用於解決軟件程序簽名的實際問題的。它的威脅模型非常全面,並且解決了很多libtrust沒有考慮到的事情。它擁有一個完整的規範,以及一個Python的參考實現,我已經開始Go的實現並且歡迎任何人加入。
作爲添加TUF到Docker的一部分,一個映射根密鑰到registry URL的本地密鑰庫將被加入,以便用戶可以使用不受Docker公司管理的自有簽名密鑰。
我想指出的是,一般情況下使用非Docker公司託管的registry用戶體驗非常差。在沒有任何技術原因的情況下,Docker公司似乎樂於將第三方registry降低爲二等地位。這對一般的生態系統和最終用戶的安全來說都是個問題。綜合而言,針對第三方registry的分散的安全模型是必要和可取的。我非常期待Docker公司在重新設計他們的安全模型和鏡像驗證系統時考慮這一點。
結論
Docker用戶應該清楚負責下載鏡像的代碼是極其不安全的。用戶只能下載那些來源沒有問題的鏡像。目前,這不包括託管於Docker公司的“可信的”的鏡像,包括官方的Ubuntu和其他基礎鏡像。
最好的辦法是在本地阻止index.docker.io,並在鏡像導入到Docker之前手動使用docker load下載並檢驗鏡像。Red Hat的安全博客有篇與此相關的好文章。
原文:《Docker Image Insecurity》https://titanous.com/posts/docker-insecurity
譯文出自:http://dockerone.com/article/77
5.Docker中root權限安全隱患
Docker並不是虛擬機,Docker本來的用法也不是虛擬機。舉個簡單的例子,普通的虛擬機租戶root和宿主root是分開的,而Docker的租戶root和宿主root是同一個root。一旦容器內的用戶從普通用戶權限提升爲root權限,他就直接具備了宿主機的root權限,進而可進行幾乎無限制的操作。這是爲什麼呢?因爲Docker原本的用法是將進程之間進行隔離,爲進程或進程組創建隔離開的運行空間,目的就是爲了隔離有問題的應用,而進程之間的限制就是通過namespace和cgroup來進行隔離與配額限制。每一個隔離出來的進程組,對外就表現爲一個container(容器)。在宿主機上可以看到全部的進程,每個容器內的進程實際上對宿主機來說是一個進程樹。也就是說,Docker是讓用戶自以爲佔據了全部的資源,從而給用戶一個“虛擬機”的感覺。
而且,Docker中可能會運行不受信任的應用程序。來源不明的應用程序,或者二進制代碼等等,以及有漏洞的應用程序,都可以稱爲不受信任的應用程序。舉個例子,在Docker容器中只運行基礎的Apache服務器和MySQL數據庫,可能大家認爲這樣的環境用root也沒問題,但是如果Apache或者MySQL有不爲人所知的漏洞被利用,那麼這兩個應用也就成爲了不受信任的應用。因此,在以root運行應用程序或是在考慮安全環境的時候,需要以一切皆不可信的態度來對
6.Namespace的安全性
那麼究竟是什麼地方導致了Docker容器機制的安全問題呢?簡單一句話,Linux系統中不是所有東西都有命名空間(Namespace)。最新版本的Docker有五個命名空間:進程、網絡、掛載、宿主和共享內存。如此簡單的命名空間顯然無法給開發者提供複雜的安全保護。比如在類似KVM的環境裏,虛擬機根本無法直接和宿主的內核交互,它沒有任何方式可以訪問內核文件系統中如/sys和/sys/fs這樣的地方。在這種情況下,想要脫離虛擬機來***宿主,比如要找到HyperVisor的弱點,攻克SELinux控制(這是個挺難的事情),然後才能夠染指宿主的文件系統。而在Docker這樣的容器裏,原生就可以訪問宿主的內核,安全性從何而來?
Dan在文章中列舉了主流的沒有命名空間的內核,有:
SELinux
Cgroups
file systems under /sys
/proc/sys, /proc/sysrq-trigger, /proc/irq, /proc/bus
沒有命名空間的設備有:
/dev/mem
/dev/sd* file system devices
Kernel Modules
如果開發者能訪問或者***任何一個,就可以獲得整個系統的控制權。
三.Docker安全性加固

  1. 文件系統級防護
    文件系統只讀:有些Linux系統的內核文件系統必須要mount到容器環境裏,否則容器裏的進程就會罷工。這給惡意進程非常大的便利,但是大部分運行在容器裏的App其實並不需要向文件系統寫入數據。基於這種情況,開發者可以在mount時使用只讀模式。比如下面幾個:
    o. /sys
    o. /proc/sys
    o. /proc/sysrq-trigger
    o. /proc/irq
    o. /proc/bus
    用只讀模式的好處是,那些在容器裏權限比較高的進程也無法向宿主文件系統寫入。當然這裏需要注意一點,必須要把這些進程remount可讀寫文件系統的能力給禁止。更進一步開發者甚至可以禁止容器mount任何文件系統,這需要通過使用capability完成,下面會詳細解釋。
    寫入時複製:Copy-on-write的具體解釋請讀者參考前面的維基百科鏈接。Docker採用的就是這樣的文件系統。所有運行的容器可以先共享一個基本文件系統鏡像,一旦需要向文件系統寫數據,就引導它寫到與該容器相關的另一個特定文件系統中。這樣的機制避免了一個容器看到另一個容器的數據,而且容器也無法通過修改文件系統的內容來影響其他容器。
  2. Capability機制
    Linux對Capability機制闡述的還是比較清楚的,即爲了進行權限檢查,傳統的UNIX對進程實現了兩種不同的歸類,高權限進程(用戶ID爲0,超級用戶或者root),以及低權限進程(UID不爲0的)。高權限進程完全避免了各種權限檢查,而低權限進程則要接受所有權限檢查,會被檢查如UID、GID和組清單是否有效。從2.2內核開始,Linux把原來和超級用戶相關的高級權限劃分成爲不同的單元,稱爲Capability,這樣就可以獨立對特定的Capability進行使能或禁止。
    通常來講,不合理的禁止Capability,會導致應用崩潰,因此對於Docker這樣的容器,既要安全,又要保證其可用性。開發者需要從功能性、可用性以及安全性多方面綜合權衡Capability的設置。Dan在文中給出了Docker現有的Capability清單:chown、 dac_override、 fowner、 kill、 setgid、 setuid、 setpcap、 net_bind_service、 net_raw、 sys_chroot、 mknod、 setfcap 以及 audit_write。目前Docker安裝時默認開啓的Capability列表一直是開發社區爭議的焦點,作爲普通開發者,可以通過命令行來改變其默認設置。熟悉Linux內核的讀者會發現,Docker提供的Capability是相對較少的。Dan在文中給出了Docker移除的Capability列表,並以CAP_NET_ADMIN爲例,強調容器的設計應該是啓動時配置好網絡,而非從其內部修改,解釋了容器安全性和Capability的 權衡,感興趣的讀者可以深入閱讀。
  3. NameSpace機制
    Docker提供的一些命名空間也從某種程度上提供了安全保護,比如PID命名空間,它會將全部未運行在開發者當前容器裏的進程隱藏。如果惡意程序看都看不見這些進程,***起來應該也會麻煩一些。另外,如果開發者終止pid是1的進程命名空間,容器裏面所有的進程就會被全部自動終止,這意味着管理員可以非常容易地關掉容器。此外還有網絡命名空間,方便管理員通過路由規則和iptable來構建容器的網絡環境,這樣容器內部的進程就只能使用管理員許可的特定網絡。如只能訪問公網的、只能訪問本地的和兩個容器之間用於過濾內容的容器。
  4. Cgroups機制
    主要是針對拒絕服務***。惡意進程會通過佔有系統全部資源來進行系統***。Cgroups機制可以避免這種情況的發生,如CPU的cgroups可以在一個Docker容器試圖破壞CPU的時候登錄並制止惡意進程。Dan表示,需要設計更多的cgroups,用於控制那些打開過多文件或者過多子進程等資源的進程。類似的在文中Dan還介紹了設備cgroups。
  5. SELinux
    SELinux是一個標籤系統,進程有標籤,每個文件、目錄、系統對象都有標籤。SELinux通過撰寫標籤進程和標籤對象之間訪問規則來進行安全保護。它實現的是一種叫做MAC(Mandatory Access Control)的系統,即對象的所有者不能控制別人訪問對象。具體可以參見Dan的這篇文章。至於如何用SELinux來進行容器的安全防護,Infoq會有另一篇文章來詳細介紹Dan的思想。
    總而言之,爲了保證Docker容器的安全性,Dan的團隊嘗試了非常多的安全機制,但是正如之前一篇文章中講的,安全不在於機制的健全,而在於管理員自身的防範。在文章的結尾,Dan給出了管理員應該注意的一些事項,如只運行來自可信來源的應用,在安全防護比較好的宿主機上運行等等。
    6.Docker安全要依靠其他的輔助機制
    該作者還強調,如果堅持要root權限使用 Docker Engine ,系統的安全性可能會受到一系列衆所周知的內核安全漏洞的影響。因此特別建議:
    · 在運行 Docker Engine 的系統中同時運行 AppArmor 或者 SELinux。
    · 將機器分成不同的組,相互信任的容器劃在一組。
    · 不要以 root 權限運行任何不受信任的應用程序。
    在上述三條建議之上,還應該有一種機制,就是保障機制。要不停地輪序去檢測,要能夠發現可疑的行爲,並且對任何可疑的行爲要有反應。比如進程A並未給root權限,但是後來通過檢測機制發現它變成了root權限,我們就可以懷疑它是進行了非法提權的操作。也就是說,我們允許你逃逸,但是我們也能夠在最短的時間內發現你的逃逸行爲,並且制止你。
    此外,Docker在安全方面還存在亟待加固的幾點:login過程使用明文傳輸用戶名和密碼,Image分發認證、Docker對Host的逃逸(已公佈的那個漏洞)、Docker內給租戶的root賬號能否提供、Docker的配額限制(磁盤、網絡)、Docker內萬一提權後的限制(SELinux/AppArmor/GRSecurity)、出入Docker流量的監控和審計、AUFS存在的***點。
    由於Docker需要把若干個container組或一個虛擬的私有內網,解決租戶之間的網絡隔離,但目前缺乏完整方案。從網絡性能來分析,現狀一般通過Docker Bridge或OVS實現NAT,用IPtable做隔離,性能堪憂,需要測試和驗證。也有同仁表示性能衰減在50%以上,因此性能衰減嚴重也就可能成爲一個新的***平面。在網絡方面的***點存在container之間的嗅探、ARP***、IPtable的漏洞利用、對IPtable飽和***等等。
    當然,絕大多數的Docker安全問題都是出現在被用於公有云[注]環境下的,如果Docker被使用在私有云[注]環境中,那麼它所帶來的好處要遠遠多於其帶來的問題。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章