您好,登錄后才能下訂單哦!
這篇文章主要介紹“怎么重啟service”,在日常操作中,相信很多人在怎么重啟service問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”怎么重啟service”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
當開始使用Docker時,人們經常問:“我該如何進入容器?”,其他人會說“在你的容器里運行一個SSH服務器”。但是,從這篇博文中你將會了解到你根本不需要運行SSHd守護進程來進入你的容器。當然,除非你的容器就是一個SSH服務器。
運行SSH服務器是很想當然的,因為它提供了進入容器的簡便方式。在我們公司基本上每個人都最少使用過一次SSH。我們中有很大一部分人每天都會使用它,并且他們很熟悉公鑰與私鑰,無密碼登錄,密鑰代理,甚至有時會使用端口轉發和其他不常用的功能。正因如此,人們建議你在容器中運行SSH并不奇怪。但你應該仔細考慮下。
假設你正在假設一個Redis Server或Java Webservice的Docker鏡像, 我會問你以下幾個問題:
你需要用SSH來做什么? 一般來說, 你想做備份, 檢查日志, 或者重啟進程, 調整配置, 還有可能用gdb, strace或其他類似的工具來debug服務器。那我們會看一下我們怎么不使用SSH來做這些事情。
你怎么管理你的密鑰和密碼的?一般來說,你要么把它們寫到你的鏡像中,要么就把它們放在一個卷中。你想一下如果你要更新這些密鑰或密碼你會怎么做呢。如果你把它們寫到鏡像里了,你就需要重建鏡像,重新部署它們,然后重啟容器。這還好,不算是世界末日,但是這絕不是一個高大上的方法。把它們放到卷中,然后通過管理卷來管理它們倒是比前一種好得多。這種方法是可用的,可是卻有嚴重的缺陷。你必須要確認容器沒有這個卷的寫權限;否則,容器有可能會破壞密鑰(這讓你之后就進不去容器了),如果你再用一個卷共享給多個容器的話,情況會變得更糟。如果不用SSH,我們不就少一個需要擔心的事了嗎?
你如何管理安全升級呢?SSH服務器是挺安全的,但是仍然會有安全問題,你會在必要的時候不得不升級所有使用SSH的容器。這意味著大量的重建和重啟。也就是說,及時你有一個簡單小巧的memcached服務,你還是不得不確保及時的安全更新,否則千里之堤可能毀于蟻穴。所以還是這句話,如果不用SSH,我們不就少一個需要擔心的事了嗎?
你需要“僅安裝一個SSH服務器”來達到目的嗎?當然不。你需要加裝進程管理器,比如Monit或者Supervisor。這是因為Docker自己只會監視一個進程。如果你需要運行多個進程,你就必須在上面加裝一層可以看著他們的應用。換句話說,你在把簡單問題復雜化。如果你的應用停了(正常退出或者崩潰),你必須要從你的進程管理日志里面去查看,而不能簡單的查看Docker提供的信息。
你可以負責把應用放到容器中,但你是否應該同時負責管理訪問策略和安全限制呢?在小機構中,這都不是事。但是在大型機構中,如果你是負責設立應用容器的人,那很可能有另外一個人負責定義遠程訪問策略。你所在的公司很可能有嚴格的策略定義說明誰能訪問,如何訪問或者其他各種審查跟蹤的要求。那樣的話,你肯定不會被允許把一個SSH服務器扔進你的容器中.
你的數據應該存在于 volume中. 然后你可以使用--volumes-from選項來運行另一個容器,與第一個容器共享這個volume。這樣做的好處:如果你需要安裝新的工具(如s75pxd)來將你備份的數據長期保存,或將數據轉移到其他永久存儲時,你可以在這個特定的備份容器中進行,而不是在主服務容器中。這很簡潔。
再次使用 volume! 如果你將所有日志寫入一個特定的目錄下,且這個目錄是一個volume的話,那你可以啟動另一個log inspection" 容器(使用--volumes-from,還記得么?)且在這里面做你需要做的事。如果你還需要特殊的工具(或只需要一個有意思的ack-grep),你可以在這個容器中安裝它們,這樣可以保持主容器的原始環境。
基本上所有service都可以通過信號來重啟。當你使用/etc/init.d/foo restart或service foo restart時,實際上它們都會給進程發送一個特定的信號。你可以使用docker kill -s <signal>來發送這個信號。一些service可能不會監聽這些信號,但可以在一個特定的socket上接受命令。如果是一個TCP socket,只需要通過網絡連接上就可以了。如果是一個UNIX套接字,你可以再次使用volume。將容器和service的控制套接字設置到一個特定的目錄中,且這個目錄是一個volume。然后啟動一個新的容器來訪問這個volume;這樣就可以使用UNIX套接字了。
“但這也太復雜了吧!”-其實不然。假設你名為foo的servcie 在/var/run/foo.sock創建了一個套接字,且需要你運行fooctl restart來完成重啟。只需要使用-v /var/run(或在Docker文件中添加VOLUME /var/run)來啟動這個service就可以了。當你想重啟的時候,使用--volumes-from選項并重載命令來啟動相同的鏡像。像這樣:
# Starting the service CID=$(docker run -d -v /var/run fooservice) # Restarting the service with a sidekick container docker run --volumes-from $CID fooservice fooctl restart
很簡單吧!
如果你正在執行一個持久的配置變更,你最好把他的改變放在image中,因為如果你又啟動一個container,那么服務還是使用的老的配置,你的配置變更將丟失。所以,沒有您的SSH訪問!“但是我需要在服務存活期間,改變我的配置;例如增加一個新的虛擬站點!”這種情況下,你需要使用……等待……volume!配置應該在volume中,并且該volume應該和一個特殊目的“配置編輯器”容器共享。你可以在這個容器中使用任何你喜歡的東西:SSH + 你最喜歡的編輯器,或一個接受API調用的web服務,或一個從外部源抓取信息的定時任務;諸如此類。另外,分離關注:一個容器運行服務,另外一個處理配置更新。“但是我做臨時更改,因為我正在測試不同的值!”在這種情況下,查看下一章節!
這可能是唯一需要進入container的場景了。因為你要運行gdb, strace, tweak配置,等。這種情況下,你需要 nsenter。
介紹 nsenter
nsenter是一個小的工具,用來進入命名空間中。技術上,它可以進入現有的命名空間,或者產生一個進程進入新的一組命名空間。“命名空間是什么?”他們是容器的重要組成部分。簡單點說:通過使用 nsenter ,你可以進入一個已經存在的container中,盡管這個container沒有運行ssh 或者任意特殊用途的守護進程。
從哪里獲得 nsenter ?
在GitHub上查看 jpetazzo/nsenter 。簡單的安裝是:
docker run -v /usr/local/bin:/target jpetazzo/nsenter
它將會把 nsenter 安裝到 /usr/local/bin 中,你就可以立刻使用它了。
nsenter 也可以在你的發行版中獲得(在 util-linux 包中)。
首先,計算出你要進入容器的PID:
PID=$(docker inspect --format {{.State.Pid}} <container_name_or_ID>)
然后進入容器:
nsenter --target $PID --mount --uts --ipc --net --pid
在容器里,可以操作shell解析器。如果要想以自動化的方式來運行特殊的腳本或程序,把它作為參數添加到nsenter中。除了它使用容器代替了簡單目錄來工作外,它的工作方式有點像chroot。
如果你需要從一個遠程主機進入一個容器,有(至少)兩個方法:
SSH 進入 Docker 主機,并使用 nsenter;
SSH 進入 Docker 主機,通過一個特殊的密鑰參數授權esenter命令 (也就是,nsenter)。
第一種方法相對簡單;但是需要root權限訪問Docker主機(從安全角度來說不是很好)。第二種方法在 SSH 的 authorized_keys 文件中使用 command= 模式。你可能熟悉 “古典的” authorized_keys文件,它看起來像這樣:
ssh-rsa AAAAB3N…QOID== jpetazzo@tarrasque
(當然,實際上一個真正的密鑰是很長的,一般都會占據好幾行。)你也可以強制使用一個專有的命令。如果你想要在你的系統上查看一個遠程的主機上可以有效使用的內存,可以使用SSH密鑰,但是你不會希望交出所有的shell權限,你可以在authorized_keys文件中輸入下面的內容:
command="free" ssh-rsa AAAAB3N…QOID== jpetazzo@tarrasque
現在,當使用專有的密鑰進行連接時,替換取得的shell,它可以執行free命令。除此之外,就不能做其他的。(通常,你可能還想要添加no-port-forwarding;如果希望了解更多信息可以查看authorized_keys(5)的手冊(manpage))。這種機制的關鍵是使得責任分離。Alice把服務放在容器內部;她不用處理遠程的訪問,登陸等事務。Betty會添加SSH層,在特殊情況(調試奇怪的問題)下使用。Charlotte會考慮登陸。等等。
到此,關于“怎么重啟service”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。