當(dāng)開始使用Docker時,人們經(jīng)常問:“我該如何進入容器?”,其他人會說“在你的容器里運行一個SSH服務(wù)器”。但是,從這篇博文中你將會了解到你根本不需要運行SSHd守護進程來進入你的容器。當(dāng)然,除非你的容器就是一個SSH服務(wù)器。
運行SSH服務(wù)器是很想當(dāng)然的,因為它提供了進入容器的簡便方式。在我們公司基本上每個人都最少使用過一次SSH。我們中有很大一部分人每天都會使用它,并且他們很熟悉公鑰與私鑰,無密碼登錄,密鑰代理,甚至有時會使用端口轉(zhuǎn)發(fā)和其他不常用的功能。正因如此,人們建議你在容器中運行SSH并不奇怪。但你應(yīng)該仔細考慮下。
假設(shè)你正在假設(shè)一個Redis Server或Java Webservice的Docker鏡像, 我會問你以下幾個問題:
你需要用SSH來做什么? 一般來說, 你想做備份, 檢查日志, 或者重啟進程, 調(diào)整配置, 還有可能用gdb, strace或其他類似的工具來debug服務(wù)器。那我們會看一下我們怎么不使用SSH來做這些事情。
你怎么管理你的密鑰和密碼的?一般來說,你要么把它們寫到你的鏡像中,要么就把它們放在一個卷中。你想一下如果你要更新這些密鑰或密碼你會怎么做呢。如果你把它們寫到鏡像里了,你就需要重建鏡像,重新部署它們,然后重啟容器。這還好,不算是世界末日,但是這絕不是一個高大上的方法。把它們放到卷中,然后通過管理卷來管理它們倒是比前一種好得多。這種方法是可用的,可是卻有嚴重的缺陷。你必須要確認容器沒有這個卷的寫權(quán)限;否則,容器有可能會破壞密鑰(這讓你之后就進不去容器了),如果你再用一個卷共享給多個容器的話,情況會變得更糟。如果不用SSH,我們不就少一個需要擔(dān)心的事了嗎?
你如何管理安全升級呢?SSH服務(wù)器是挺安全的,但是仍然會有安全問題,你會在必要的時候不得不升級所有使用SSH的容器。這意味著大量的重建和重啟。也就是說,及時你有一個簡單小巧的memcached服務(wù),你還是不得不確保及時的安全更新,否則千里之堤可能毀于蟻穴。所以還是這句話,如果不用SSH,我們不就少一個需要擔(dān)心的事了嗎?
你需要“僅安裝一個SSH服務(wù)器”來達到目的嗎?當(dāng)然不。你需要加裝進程管理器,比如Monit或者Supervisor。這是因為Docker自己只會監(jiān)視一個進程。如果你需要運行多個進程,你就必須在上面加裝一層可以看著他們的應(yīng)用。換句話說,你在把簡單問題復(fù)雜化。如果你的應(yīng)用停了(正常退出或者崩潰),你必須要從你的進程管理日志里面去查看,而不能簡單的查看Docker提供的信息。
你可以負責(zé)把應(yīng)用放到容器中,但你是否應(yīng)該同時負責(zé)管理訪問策略和安全限制呢?在小機構(gòu)中,這都不是事。但是在大型機構(gòu)中,如果你是負責(zé)設(shè)立應(yīng)用容器的人,那很可能有另外一個人負責(zé)定義遠程訪問策略。你所在的公司很可能有嚴格的策略定義說明誰能訪問,如何訪問或者其他各種審查跟蹤的要求。那樣的話,你肯定不會被允許把一個SSH服務(wù)器扔進你的容器中。
但我該如何做…
備份我的數(shù)據(jù)?
你的數(shù)據(jù)應(yīng)該存在于 volume中. 然后你可以使用--volumes-from選項來運行另一個容器,與第一個容器共享這個volume。這樣做的好處:如果你需要安裝新的工具(如s75pxd)來將你備份的數(shù)據(jù)長期保存,或?qū)?shù)據(jù)轉(zhuǎn)移到其他永久存儲時,你可以在這個特定的備份容器中進行,而不是在主服務(wù)容器中。這很簡潔。
檢查日志?
再次使用 volume! 如果你將所有日志寫入一個特定的目錄下,且這個目錄是一個volume的話,那你可以啟動另一個log inspection" 容器(使用--volumes-from,還記得么?)且在這里面做你需要做的事。如果你還需要特殊的工具(或只需要一個有意思的ack-grep),你可以在這個容器中安裝它們,這樣可以保持主容器的原始環(huán)境。
重啟service?
新聞熱點
疑難解答
圖片精選