自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

為什么不需要在Docker容器中運行sshd

開發(fā) 項目管理 云安全
在一個容器中運行SSH服務器,這真的是一個錯誤(大寫字母W)嗎?老實說,沒那么嚴重。當你不去訪問Docker主機的時候,這樣做甚至是極其方便的,但是這仍然需要在容器中取得一個shell……

當開始使用Docker時,人們經(jīng)常問:“我該如何進入容器?”,其他人會說“在你的容器里運行一個SSH服務器”。但是,從這篇博文中你將會了解到你根本不需要運行SSHd守護進程來進入你的容器。當然,除非你的容器就是一個SSH服務器。

運行SSH服務器是很想當然的,因為它提供了進入容器的簡便方式。在我們公司基本上每個人都最少使用過一次SSH。我們中有很大一部分人每天都會使用它,并且他們很熟悉公鑰與私鑰,無密碼登錄,密鑰代理,甚至有時會使用端口轉發(fā)和其他不常用的功能。正因如此,人們建議你在容器中運行SSH并不奇怪。但你應該仔細考慮下。

假設你正在假設一個Redis Server或Java Webservice的Docker鏡像, 我會問你以下幾個問題:

  • 你需要用SSH來做什么? 一般來說, 你想做備份, 檢查日志, 或者重啟進程, 調(diào)整配置, 還有可能用gdb, strace或其他類似的工具來debug服務器。那我們會看一下我們怎么不使用SSH來做這些事情。

  • 你怎么管理你的密鑰和密碼的?一般來說,你要么把它們寫到你的鏡像中,要么就把它們放在一個卷中。你想一下如果你要更新這些密鑰或密碼你會怎么做呢。如果你把它們寫到鏡像里了,你就需要重建鏡像,重新部署它們,然后重啟容器。這還好,不算是世界末日,但是這絕不是一個高大上的方法。把它們放到卷中,然后通過管理卷來管理它們倒是比前一種好得多。這種方法是可用的,可是卻有嚴重的缺陷。你必須要確認容器沒有這個卷的寫權限;否則,容器有可能會破壞密鑰(這讓你之后就進不去容器了),如果你再用一個卷共享給多個容器的話,情況會變得更糟。如果不用SSH,我們不就少一個需要擔心的事了嗎?

  • 你如何管理安全升級呢?SSH服務器是挺安全的,但是仍然會有安全問題,你會在必要的時候不得不升級所有使用SSH的容器。這意味著大量的重建和重啟。也就是說,及時你有一個簡單小巧的memcached服務,你還是不得不確保及時的安全更新,否則千里之堤可能毀于蟻穴。所以還是這句話,如果不用SSH,我們不就少一個需要擔心的事了嗎?

  • 你需要“僅安裝一個SSH服務器”來達到目的嗎?當然不。你需要加裝進程管理器,比如Monit或者Supervisor。這是因為Docker自己只會監(jiān)視一個進程。如果你需要運行多個進程,你就必須在上面加裝一層可以看著他們的應用。換句話說,你在把簡單問題復雜化。如果你的應用停了(正常退出或者崩潰),你必須要從你的進程管理日志里面去查看,而不能簡單的查看Docker提供的信息。

  • 你可以負責把應用放到容器中,但你是否應該同時負責管理訪問策略和安全限制呢?在小機構中,這都不是事。但是在大型機構中,如果你是負責設立應用容器的人,那很可能有另外一個人負責定義遠程訪問策略。你所在的公司很可能有嚴格的策略定義說明誰能訪問,如何訪問或者其他各種審查跟蹤的要求。那樣的話,你肯定不會被允許把一個SSH服務器扔進你的容器中。

但我該如何做…

備份我的數(shù)據(jù)?

你的數(shù)據(jù)應該存在于 volume中. 然后你可以使用--volumes-from選項來運行另一個容器,與***個容器共享這個volume。這樣做的好處:如果你需要安裝新的工具(如s75pxd)來將你備份的數(shù)據(jù)長期保存,或將數(shù)據(jù)轉移到其他***存儲時,你可以在這個特定的備份容器中進行,而不是在主服務容器中。這很簡潔。

檢查日志?

再次使用 volume! 如果你將所有日志寫入一個特定的目錄下,且這個目錄是一個volume的話,那你可以啟動另一個log inspection" 容器(使用--volumes-from,還記得么?)且在這里面做你需要做的事。如果你還需要特殊的工具(或只需要一個有意思的ack-grep),你可以在這個容器中安裝它們,這樣可以保持主容器的原始環(huán)境。

重啟service?

基本上所有service都可以通過信號來重啟。當你使用/etc/init.d/foo restart或service foo restart時,實際上它們都會給進程發(fā)送一個特定的信號。你可以使用docker kill -s <signal>來發(fā)送這個信號。一些service可能不會監(jiān)聽這些信號,但可以在一個特定的socket上接受命令。如果是一個TCP socket,只需要通過網(wǎng)絡連接上就可以了。如果是一個UNIX套接字,你可以再次使用volume。將容器和service的控制套接字設置到一個特定的目錄中,且這個目錄是一個volume。然后啟動一個新的容器來訪問這個volume;這樣就可以使用UNIX套接字了。

“但這也太復雜了吧!”-其實不然。假設你名為foo的servcie 在/var/run/foo.sock創(chuàng)建了一個套接字,且需要你運行fooctl restart來完成重啟。只需要使用-v /var/run(或在Docker文件中添加VOLUME /var/run)來啟動這個service就可以了。當你想重啟的時候,使用--volumes-from選項并重載命令來啟動相同的鏡像。像這樣:

  1. # Starting the service  
  2. CID=$(docker run -d -v /var/run fooservice)  
  3. # Restarting the service with a sidekick container  
  4. docker run --volumes-from $CID fooservice fooctl restart 

很簡單吧!

修改我的配置文件

如果你正在執(zhí)行一個持久的配置變更,你***把他的改變放在image中,因為如果你又啟動一個container,那么服務還是使用的老的配置,你的配置變更將丟失。所以,沒有您的SSH訪問!“但是我需要在服務存活期間,改變我的配置;例如增加一個新的虛擬站點!”這種情況下,你需要使用……等待……volume!配置應該在volume中,并且該volume應該和一個特殊目的“配置編輯器”容器共享。你可以在這個容器中使用任何你喜歡的東西:SSH + 你最喜歡的編輯器,或一個接受API調(diào)用的web服務,或一個從外部源抓取信息的定時任務;諸如此類。另外,分離關注:一個容器運行服務,另外一個處理配置更新。“但是我做臨時更改,因為我正在測試不同的值!”在這種情況下,查看下一章節(jié)!

調(diào)試我的應用?

這可能是唯一需要進入container的場景了。因為你要運行gdb, strace, tweak配置,等。這種情況下,你需要 nsenter。

介紹 nsenter

nsenter是一個小的工具,用來進入命名空間中。技術上,它可以進入現(xiàn)有的命名空間,或者產(chǎn)生一個進程進入新的一組命名空間。“命名空間是什么?”他們是容器的重要組成部分。簡單點說:通過使用 nsenter ,你可以進入一個已經(jīng)存在的container中,盡管這個container沒有運行ssh 或者任意特殊用途的守護進程。

從哪里獲得 nsenter ?

在GitHub上查看 jpetazzo/nsenter 。簡單的安裝是:

  1. docker run -v /usr/local/bin:/target jpetazzo/nsenter 

它將會把 nsenter 安裝到 /usr/local/bin 中,你就可以立刻使用它了。
 

nsenter 也可以在你的發(fā)行版中獲得(在 util-linux 包中)。

如何使用?

 

首先,計算出你要進入容器的PID:

  1. PID=$(docker inspect --format {{.State.Pid}} <container_name_or_ID>) 

然后進入容器:

  1. nsenter --target $PID --mount --uts --ipc --net --pid 

在容器里,可以操作shell解析器。如果要想以自動化的方式來運行特殊的腳本或程序,把它作為參數(shù)添加到nsenter中。除了它使用容器代替了簡單目錄來工作外,它的工作方式有點像chroot。

遠程訪問怎么樣?

如果你需要從一個遠程主機進入一個容器,有(至少)兩個方法:

  • SSH 進入 Docker 主機,并使用 nsenter;

  • SSH 進入 Docker 主機,通過一個特殊的密鑰參數(shù)授權esenter命令  (也就是,nsenter)。

***種方法相對簡單;但是需要root權限訪問Docker主機(從安全角度來說不是很好)。第二種方法在 SSH 的 authorized_keys 文件中使用 command= 模式。你可能熟悉 “古典的” authorized_keys文件,它看起來像這樣:

  1. ssh-rsa AAAAB3N…QOID== jpetazzo@tarrasque 

(當然,實際上一個真正的密鑰是很長的,一般都會占據(jù)好幾行。)你也可以強制使用一個專有的命令。如果你想要在你的系統(tǒng)上查看一個遠程的主機上可以有效使用的內(nèi)存,可以使用SSH密鑰,但是你不會希望交出所有的shell權限,你可以在authorized_keys文件中輸入下面的內(nèi)容:

  1. command="free" ssh-rsa AAAAB3N…QOID== jpetazzo@tarrasque 

現(xiàn)在,當使用專有的密鑰進行連接時,替換取得的shell,它可以執(zhí)行free命令。除此之外,就不能做其他的。(通常,你可能還想要添加no-port-forwarding;如果希望了解更多信息可以查看authorized_keys(5)的手冊(manpage))。這種機制的關鍵是使得責任分離。Alice把服務放在容器內(nèi)部;她不用處理遠程的訪問,登陸等事務。Betty會添加SSH層,在特殊情況(調(diào)試奇怪的問題)下使用。Charlotte會考慮登陸。等等。

總結

在一個容器中運行SSH服務器,這真的是一個錯誤(大寫字母W)嗎?老實說,沒那么嚴重。當你不去訪問Docker主機的時候,這樣做甚至是極其方便的,但是這仍然需要在容器中取得一個shell。除此之外,我們還有許多方式可以在容器中運行SSH服務器,并能取得所有我們想要的特性,而且其架構還非常清晰。Docker允許你使用任何最適合你的工作流。但是,在做這些之前,迅速步入“我的容器真的是一個小的VPS”這句流行語的(語境)時,請注意還有其他的解決方案,這樣你才可以做出一個明智的決定。

英文原文:WHY YOU DON'T NEED TO RUN SSHD IN YOUR DOCKER CONTAINERS

譯文出自:http://www.oschina.net/translate/why-you-dont-need-to-run-sshd-in-docker

責任編輯:林師授 來源: 開源中國社區(qū) 編譯
相關推薦

2021-12-12 22:20:47

Docker開發(fā)容器

2014-01-17 13:09:48

Linux碎片整理

2019-07-15 08:00:00

AI人工智能

2021-05-07 15:18:26

比特幣禁令監(jiān)管

2021-07-06 11:10:22

LinuxmacOSWindows

2020-05-07 10:09:30

MAC地址網(wǎng)絡協(xié)議網(wǎng)絡

2012-06-12 09:46:21

Linux碎片整理

2021-04-27 08:52:55

Linux MacOS碎片

2017-09-19 15:40:23

Linuxsudo命令密碼

2020-07-28 08:28:07

JavaScriptswitch開發(fā)

2021-07-02 09:00:00

自動駕駛特斯拉技術

2022-06-02 16:04:02

DeFi金融比特幣

2021-05-26 10:19:01

jreJava應用程序

2024-09-19 13:00:26

悲觀鎖SQL樂觀鎖

2017-03-13 13:54:40

戴爾

2015-07-29 09:42:09

工程師全棧工程師

2022-03-22 13:39:10

框架react面試

2022-06-29 13:41:43

物聯(lián)網(wǎng)零信任

2012-08-23 09:50:07

測試測試人員軟件測試

2015-06-23 09:10:04

Spark主機托管云平臺
點贊
收藏

51CTO技術棧公眾號