溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么重啟service

發(fā)布時(shí)間:2021-12-13 17:44:49 來(lái)源:億速云 閱讀:90 作者:iii 欄目:云計(jì)算

這篇文章主要介紹“怎么重啟service”,在日常操作中,相信很多人在怎么重啟service問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”怎么重啟service”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

當(dāng)開(kāi)始使用Docker時(shí),人們經(jīng)常問(wèn):“我該如何進(jìn)入容器?”,其他人會(huì)說(shuō)“在你的容器里運(yùn)行一個(gè)SSH服務(wù)器”。但是,從這篇博文中你將會(huì)了解到你根本不需要運(yùn)行SSHd守護(hù)進(jìn)程來(lái)進(jìn)入你的容器。當(dāng)然,除非你的容器就是一個(gè)SSH服務(wù)器。

運(yùn)行SSH服務(wù)器是很想當(dāng)然的,因?yàn)樗峁┝诉M(jìn)入容器的簡(jiǎn)便方式。在我們公司基本上每個(gè)人都最少使用過(guò)一次SSH。我們中有很大一部分人每天都會(huì)使用它,并且他們很熟悉公鑰與私鑰,無(wú)密碼登錄,密鑰代理,甚至有時(shí)會(huì)使用端口轉(zhuǎn)發(fā)和其他不常用的功能。正因如此,人們建議你在容器中運(yùn)行SSH并不奇怪。但你應(yīng)該仔細(xì)考慮下。

假設(shè)你正在假設(shè)一個(gè)Redis Server或Java Webservice的Docker鏡像, 我會(huì)問(wèn)你以下幾個(gè)問(wèn)題:

  • 你需要用SSH來(lái)做什么? 一般來(lái)說(shuō), 你想做備份, 檢查日志, 或者重啟進(jìn)程, 調(diào)整配置, 還有可能用gdb, strace或其他類似的工具來(lái)debug服務(wù)器。那我們會(huì)看一下我們?cè)趺床皇褂肧SH來(lái)做這些事情。

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

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

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

  • 你可以負(fù)責(zé)把應(yīng)用放到容器中,但你是否應(yīng)該同時(shí)負(fù)責(zé)管理訪問(wèn)策略和安全限制呢?在小機(jī)構(gòu)中,這都不是事。但是在大型機(jī)構(gòu)中,如果你是負(fù)責(zé)設(shè)立應(yīng)用容器的人,那很可能有另外一個(gè)人負(fù)責(zé)定義遠(yuǎn)程訪問(wèn)策略。你所在的公司很可能有嚴(yán)格的策略定義說(shuō)明誰(shuí)能訪問(wèn),如何訪問(wèn)或者其他各種審查跟蹤的要求。那樣的話,你肯定不會(huì)被允許把一個(gè)SSH服務(wù)器扔進(jìn)你的容器中.

但我該如何做…

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

你的數(shù)據(jù)應(yīng)該存在于 volume中. 然后你可以使用--volumes-from選項(xiàng)來(lái)運(yùn)行另一個(gè)容器,與第一個(gè)容器共享這個(gè)volume。這樣做的好處:如果你需要安裝新的工具(如s75pxd)來(lái)將你備份的數(shù)據(jù)長(zhǎng)期保存,或?qū)?shù)據(jù)轉(zhuǎn)移到其他永久存儲(chǔ)時(shí),你可以在這個(gè)特定的備份容器中進(jìn)行,而不是在主服務(wù)容器中。這很簡(jiǎn)潔。

檢查日志?

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

重啟service?

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

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

# 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

很簡(jiǎn)單吧!

修改我的配置文件

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

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

這可能是唯一需要進(jìn)入container的場(chǎng)景了。因?yàn)槟阋\(yùn)行g(shù)db, strace, tweak配置,等。這種情況下,你需要 nsenter。

介紹 nsenter

nsenter是一個(gè)小的工具,用來(lái)進(jìn)入命名空間中。技術(shù)上,它可以進(jìn)入現(xiàn)有的命名空間,或者產(chǎn)生一個(gè)進(jìn)程進(jìn)入新的一組命名空間?!懊臻g是什么?”他們是容器的重要組成部分。簡(jiǎn)單點(diǎn)說(shuō):通過(guò)使用 nsenter ,你可以進(jìn)入一個(gè)已經(jīng)存在的container中,盡管這個(gè)container沒(méi)有運(yùn)行ssh 或者任意特殊用途的守護(hù)進(jìn)程。

從哪里獲得 nsenter ?

在GitHub上查看 jpetazzo/nsenter 。簡(jiǎn)單的安裝是:

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

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

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

如何使用?

首先,計(jì)算出你要進(jìn)入容器的PID:

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

然后進(jìn)入容器:

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

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

遠(yuǎn)程訪問(wèn)怎么樣?

如果你需要從一個(gè)遠(yuǎn)程主機(jī)進(jìn)入一個(gè)容器,有(至少)兩個(gè)方法:

  • SSH 進(jìn)入 Docker 主機(jī),并使用 nsenter;

  • SSH 進(jìn)入 Docker 主機(jī),通過(guò)一個(gè)特殊的密鑰參數(shù)授權(quán)esenter命令  (也就是,nsenter)。

第一種方法相對(duì)簡(jiǎn)單;但是需要root權(quán)限訪問(wèn)Docker主機(jī)(從安全角度來(lái)說(shuō)不是很好)。第二種方法在 SSH 的 authorized_keys 文件中使用 command= 模式。你可能熟悉 “古典的” authorized_keys文件,它看起來(lái)像這樣: 

ssh-rsa AAAAB3N…QOID== jpetazzo@tarrasque

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

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

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

到此,關(guān)于“怎么重啟service”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI