Docker over SSH

我最近在我的一個(gè)業(yè)余項(xiàng)目中遇到了挑戰(zhàn)乐埠。我需要將在一臺機(jī)器上構(gòu)建的docker容器轉(zhuǎn)移到另一臺可以通過SSH訪問的機(jī)器上。我不想將我的容器推送到公共docker注冊表,也不想設(shè)置自己的私有注冊表。

使用內(nèi)置工具

很快就在stack overflow找到了答案(https://stackoverflow.com/a/26226261/272958

docker save <image> | bzip2 | \
     ssh user@host 'bunzip2 | docker load'

讓我們分解一下:

  1. docker save <image> 獲取所有圖像數(shù)據(jù)姨蟋,并將其及其標(biāo)簽序列化為二進(jìn)制數(shù)據(jù)流。
  2. docker load 接收二進(jìn)制數(shù)據(jù)流并將其反序列化為帶有標(biāo)簽的圖像立帖。
  3. bzip2壓縮流并bunzip2解壓縮流眼溶。
  4. ssh user@host 'some command' ssh進(jìn)入遠(yuǎn)程主機(jī)并運(yùn)行指定的命令。

事實(shí)證明晓勇,docker load它能夠自動解壓縮bzip'd內(nèi)容堂飞,因此您可以將命令簡化為:

docker save <image> | bzip2 | \
  ssh user@host 'docker load'

您可以刪除灌旧,bzip2但是docker映像通常很大,從進(jìn)行壓縮bzip2可以節(jié)省大量帶寬酝静。

我仍然有一個(gè)問題节榜。我通過慢速的3G Internet連接進(jìn)行所有操作,并且遠(yuǎn)程主機(jī)已經(jīng)具有要推送的映像中的大多數(shù)層别智,我只需要推送包含我的應(yīng)用程序邏輯的微小新層即可宗苍。

Pushing With Layers

經(jīng)過更多研究,我發(fā)現(xiàn)docker-push-ssh薄榛。使用此命令讳窟,您可以執(zhí)行以下操作:

docker-push-ssh user@host <image>

它僅傳輸所需的層。為此:

  1. 在本地計(jì)算機(jī)上設(shè)置一個(gè)臨時(shí)Docker注冊表-這很容易做到敞恋,因?yàn)樵诿麨閐ocker的鏡像中有一個(gè)docker注冊表 registry:2
  2. 難道一個(gè)docker push到本地注冊表丽啡。因?yàn)樗榧氨镜赜?jì)算機(jī)的網(wǎng)絡(luò),所以速度很快硬猫。
  3. 使用SSH代理遠(yuǎn)程服務(wù)器上的端口补箍,以便它連接到本地計(jì)算機(jī)上的代理。
  4. 難道一個(gè)docker pull遠(yuǎn)程服務(wù)器上啸蜜。該拉取在SSH隧道上運(yùn)行坑雅,但是docker pull非常聰明,僅拉取它尚不具備的層衬横。

我自己的解決方案

這是一個(gè)好主意裹粤,但是我遇到了三個(gè)問題:

  1. 它是用Python編寫的,并且需要Python 2.7蜂林,我不想依賴于已安裝遥诉。
  2. 它已經(jīng)有一段時(shí)間沒有更新了,通常不會有什么問題噪叙,但是考慮到它依賴于舊版本的Python矮锈,這有點(diǎn)令人擔(dān)憂。
  3. 目前尚不清楚遠(yuǎn)程計(jì)算機(jī)上所需的特權(quán)級別睁蕾。我希望能夠?qū)⑹虑殒i定下來苞笨,以便進(jìn)行推送的用戶只能將特定的已命名docker映像推送到遠(yuǎn)程計(jì)算機(jī),而不能做其他任何事情惫霸。

為了解決所有這些問題,我決定在Node.js中創(chuàng)建一個(gè)名為docker-over-ssh的CLI 葱弟。盡管名稱如此壹店,但docker-over-ssh實(shí)際上完全與傳輸無關(guān)。它僅需要一種通過stdin和stdout與自身的遠(yuǎn)程實(shí)例進(jìn)行通信的方法芝加。要使用它硅卢,請docker-over-ssh同時(shí)在本地和遠(yuǎn)程計(jì)算機(jī)上安裝射窒。然后,您可以運(yùn)行:

docker-over-ssh push <image> \
  ssh user@host "docker-over-ssh pull <image>"

該圖看起來與先前的解決方案完全相同将塑。

docker-over-ssh push命令將啟動本地docker注冊表脉顿,將映像推送到其中,然后運(yùn)行“子命令”(在本示例中為ssh user@host "docker-over-ssh pull <image>")点寥,并將tcp流量從該子命令的stdio代理到本地docker注冊表艾疟。

docker-over-ssh pull <image>命令啟動一個(gè)本地TCP代理(用幾行node.js代碼編寫),并將該代理連接到stdio敢辩,以便它可以與本地docker注冊表通信蔽莱。然后,它docker pull指向本地注冊表運(yùn)行戚长。僅傳輸新的層盗冷,從而使所有工作保持高效。

用戶唯一需要的許可是docker-over-ssh pull <image>在遠(yuǎn)程計(jì)算機(jī)上運(yùn)行的能力同廉,而無需任何其他操作仪糖。

與CircleCI一起使用

在這一點(diǎn)上,我有一個(gè)可行的解決方案迫肖,但是我想使它自動化锅劝,以便可以從CircleCI進(jìn)行部署。向CircleCI添加SSH密鑰非常容易咒程。面臨的挑戰(zhàn)是如何通過其復(fù)雜的docker網(wǎng)絡(luò)設(shè)置來完成這項(xiàng)工作:

  • 您的本地代碼(即終止代理的node.js代碼)無法與使用運(yùn)行的容器對話docker run鸠天。
  • docker守護(hù)進(jìn)程(用于運(yùn)行docker push)不能跟跑為主要CircleCI工作服務(wù)容器。

我找不到直接解決這兩個(gè)問題的任何實(shí)用方法帐姻,但是我發(fā)現(xiàn)NGROK可以很容易地創(chuàng)建一個(gè)可以訪問本地服務(wù)的Internet訪問地址稠集。有了這個(gè),我能夠告訴CircleCI啟動Docker注冊表作為構(gòu)建服務(wù)饥瓷,然后使用ngrok啟動一個(gè)臨時(shí)代理以將其公開給docker守護(hù)程序剥纷。它甚至支持使用用戶名和密碼(由我自動生成)來保護(hù)它,以確保一切安全呢铆。

最后晦鞋,我要做的就是更新CircleCI配置:

docker:
  - image: circleci/node:12
    environment:
      LOCAL_DOCKER_REGISTRY_PORT: '5000'
  - image: registry:2

并將DOCKER_REGISTRY_NGROK環(huán)境變量設(shè)置為我的ngrok API密鑰,您可以免費(fèi)獲取棺克。

然后悠垛,我向docker-over-ssh添加了一些代碼來處理這兩個(gè)環(huán)境變量。

結(jié)論

我做所有這些事情的原因是嘗試安裝一個(gè)dokku服務(wù)器娜谊,我可以在其中運(yùn)行很多輔助項(xiàng)目确买,并避免在heroku上花費(fèi)很少的金錢來處理很少使用的東西。我對這個(gè)問題的解決方案感到非常滿意纱皆,但是由于Digital Ocean擁有托管的Kubernetes服務(wù)湾趾,而且價(jià)格似乎非常實(shí)惠芭商,因此我現(xiàn)在決定研究Kubernetes 。這將需要我弄清楚運(yùn)行具有某種身份驗(yàn)證/授權(quán)的持久性Docker注冊表搀缠。

翻譯自:https://itnext.io/docker-over-ssh-51ab25a79f2e

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末铛楣,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子艺普,更是在濱河造成了極大的恐慌簸州,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件衷敌,死亡現(xiàn)場離奇詭異勿侯,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)缴罗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進(jìn)店門蝶柿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來外里,“玉大人,你說我怎么就攤上這事♀颍” “怎么了祠够?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵综芥,是天一觀的道長忘蟹。 經(jīng)常有香客問我,道長呻拌,這世上最難降的妖魔是什么葱轩? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮藐握,結(jié)果婚禮上靴拱,老公的妹妹穿的比我還像新娘。我一直安慰自己猾普,他們只是感情好袜炕,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著初家,像睡著了一般偎窘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上溜在,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天陌知,我揣著相機(jī)與錄音,去河邊找鬼掖肋。 笑死仆葡,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的培遵。 我是一名探鬼主播浙芙,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼籽腕!你這毒婦竟也來了嗡呼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤皇耗,失蹤者是張志新(化名)和其女友劉穎南窗,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體郎楼,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡万伤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了呜袁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片敌买。...
    茶點(diǎn)故事閱讀 40,664評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖阶界,靈堂內(nèi)的尸體忽然破棺而出虹钮,到底是詐尸還是另有隱情,我是刑警寧澤膘融,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布芙粱,位于F島的核電站,受9級特大地震影響氧映,放射性物質(zhì)發(fā)生泄漏春畔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一岛都、第九天 我趴在偏房一處隱蔽的房頂上張望律姨。 院中可真熱鬧,春花似錦疗绣、人聲如沸线召。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缓淹。三九已至,卻和暖如春塔逃,著一層夾襖步出監(jiān)牢的瞬間讯壶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工湾盗, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留伏蚊,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓格粪,卻偏偏與公主長得像躏吊,于是被迫代替她去往敵國和親氛改。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內(nèi)容