Docker over SSH

我最近在我的一个业余项目中遇到了挑战。我需要将在一台机器上构建的docker容器转移到另一台可以通过SSH访问的机器上。我不想将我的容器推送到公共docker注册表,也不想设置自己的私有注册表。

使用内置工具

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

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

让我们分解一下:

  1. docker save <image> 获取所有图像数据,并将其及其标签序列化为二进制数据流。
  2. docker load 接收二进制数据流并将其反序列化为带有标签的图像。
  3. bzip2压缩流并bunzip2解压缩流。
  4. ssh user@host 'some command' ssh进入远程主机并运行指定的命令。

事实证明,docker load它能够自动解压缩bzip'd内容,因此您可以将命令简化为:

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

您可以删除,bzip2但是docker映像通常很大,从进行压缩bzip2可以节省大量带宽。

我仍然有一个问题。我通过慢速的3G Internet连接进行所有操作,并且远程主机已经具有要推送的映像中的大多数层,我只需要推送包含我的应用程序逻辑的微小新层即可。

Pushing With Layers

经过更多研究,我发现docker-push-ssh。使用此命令,您可以执行以下操作:

docker-push-ssh user@host <image>

它仅传输所需的层。为此:

  1. 在本地计算机上设置一个临时Docker注册表-这很容易做到,因为在名为docker的镜像中有一个docker注册表 registry:2
  2. 难道一个docker push到本地注册表。因为它遍及本地计算机的网络,所以速度很快。
  3. 使用SSH代理远程服务器上的端口,以便它连接到本地计算机上的代理。
  4. 难道一个docker pull远程服务器上。该拉取在SSH隧道上运行,但是docker pull非常聪明,仅拉取它尚不具备的层。

我自己的解决方案

这是一个好主意,但是我遇到了三个问题:

  1. 它是用Python编写的,并且需要Python 2.7,我不想依赖于已安装。
  2. 它已经有一段时间没有更新了,通常不会有什么问题,但是考虑到它依赖于旧版本的Python,这有点令人担忧。
  3. 目前尚不清楚远程计算机上所需的特权级别。我希望能够将事情锁定下来,以便进行推送的用户只能将特定的已命名docker映像推送到远程计算机,而不能做其他任何事情。

为了解决所有这些问题,我决定在Node.js中创建一个名为docker-over-ssh的CLI 。尽管名称如此,但docker-over-ssh实际上完全与传输无关。它仅需要一种通过stdin和stdout与自身的远程实例进行通信的方法。要使用它,请docker-over-ssh同时在本地和远程计算机上安装。然后,您可以运行:

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

该图看起来与先前的解决方案完全相同。

docker-over-ssh push命令将启动本地docker注册表,将映像推送到其中,然后运行“子命令”(在本示例中为ssh user@host "docker-over-ssh pull <image>"),并将tcp流量从该子命令的stdio代理到本地docker注册表。

docker-over-ssh pull <image>命令启动一个本地TCP代理(用几行node.js代码编写),并将该代理连接到stdio,以便它可以与本地docker注册表通信。然后,它docker pull指向本地注册表运行。仅传输新的层,从而使所有工作保持高效。

用户唯一需要的许可是docker-over-ssh pull <image>在远程计算机上运行的能力,而无需任何其他操作。

与CircleCI一起使用

在这一点上,我有一个可行的解决方案,但是我想使它自动化,以便可以从CircleCI进行部署。向CircleCI添加SSH密钥非常容易。面临的挑战是如何通过其复杂的docker网络设置来完成这项工作:

  • 您的本地代码(即终止代理的node.js代码)无法与使用运行的容器对话docker run
  • docker守护进程(用于运行docker push)不能跟跑为主要CircleCI工作服务容器。

我找不到直接解决这两个问题的任何实用方法,但是我发现NGROK可以很容易地创建一个可以访问本地服务的Internet访问地址。有了这个,我能够告诉CircleCI启动Docker注册表作为构建服务,然后使用ngrok启动一个临时代理以将其公开给docker守护程序。它甚至支持使用用户名和密码(由我自动生成)来保护它,以确保一切安全。

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

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

并将DOCKER_REGISTRY_NGROK环境变量设置为我的ngrok API密钥,您可以免费获取。

然后,我向docker-over-ssh添加了一些代码来处理这两个环境变量。

结论

我做所有这些事情的原因是尝试安装一个dokku服务器,我可以在其中运行很多辅助项目,并避免在heroku上花费很少的金钱来处理很少使用的东西。我对这个问题的解决方案感到非常满意,但是由于Digital Ocean拥有托管的Kubernetes服务,而且价格似乎非常实惠,因此我现在决定研究Kubernetes 。这将需要我弄清楚运行具有某种身份验证/授权的持久性Docker注册表。

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,585评论 4 365
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,923评论 1 301
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,314评论 0 248
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,346评论 0 214
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,718评论 3 291
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,828评论 1 223
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,020评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,758评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,486评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,722评论 2 251
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,196评论 1 262
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,546评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,211评论 3 240
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,132评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,916评论 0 200
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,904评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,758评论 2 274

推荐阅读更多精彩内容