Machine: 从另一个客户端连接到现有计算机

创建于 2015-06-08  ·  85评论  ·  资料来源: docker/machine

让我们考虑一下我在Digital Ocean上创建了一个运行一些容器的机器。
创建机器后,我可以运行eval "$(docker-machine env test-machine)"
现在,我要移至另一台不了解该特定计算机的本地计算机,并且希望将其连接到该计算机。
我怎么做?

kinenhancement

最有用的评论

认真地说-Docker-Machine有什么用处,除非您可以从其他预定义的设备访问它。

用例-在工作时构建了docker机器,但随后需要笔记本电脑进行休假,以防服务器崩溃...

快来-Docker Admin在哪里插手?! 这是每个人都可以欣赏的用例。

所有85条评论

:+1:

如何使用“通用”驱动程序将其添加到第二个系统,然后在那里使用相同的eval命令呢?

@clnperez是一个提议还是您有信心的事情(意味着即使当前正在运行,该提议也将重用现有的远程计算机)?

好吧,事后看来,我不认为您可以这样做b / c,您不必再次设置ssh密钥或从其他系统导入它们。

我看你的案子一个人不能使用通用驱动程序在第二个系统上添加一个docker-machine条目,除非您想使原始的docker-machine设置无效(因为例如会生成新的证书)。 一个人可以在第二个系统上运行docker-machine create -d none --url [...]来镜像第一个系统上原始创建的重要选项(例如swarm标志),然后从第一台机器上手动将选定的.pem文件和id_rsa文件复制到第二台机器上AND手动添加用于SSH访问的部分(并将驱动程序从无手动更改为通用)。 这是一个PITA。 适当的导出/导入功能可以很好地共享。 一个人也可以只共享手动配置docker所需的cred文件。

正确。 当前唯一的方法是获取整个目录,但这不适用于某些驱动程序(即VirtualBox,因为它使用不匹配的UUID注册VM和网络)。 过去已经有关于导入/导出功能的讨论(https://github.com/docker/machine/issues/23)

我对此有一个PR / hacky解决方案...通常,我认为我想将配置移至可移植/模板化而不是像现在这样的硬编码。

+1

我希望能够快速重新连接到已经存在的云实例(我正在使用GCE)。

当然,具有可导入/可导出的配置将非常有用,但是我想知道是否(额外)解决有关驱动程序的问题可能不会带来更简单的用户体验。

这样,使用google驱动程序,只需提供有效的访问令牌(驱动程序可能会提示用户自动生成),就可以连接到备用计算机上的现有实例。

同样,例如,在使用aws驱动程序时(我尚未做过,但是我想),可以通过提供有效的密钥/秘密对(也许通过与特定于特定驱动程序的环境变量相对应)来连接到现有实例。标志-假设该过程将通过除“ create”之外的某些docker-machine子命令发生,因为期望值有所不同)。

只是想补充一下,这将是一个很棒的功能。 我真的很想能够与队友共享一台机器,但很失望地发现现在基本上没有办法做到这一点。 太棒了,例如,当某人运行docker-machine create时,例如generic驱动程序可以自动检测某个特定的盒子是否已经配置了docker-machine并重新使用tls证书等。再次在该框中输入docker-machine create

:+1。 我很想看到它的运作。 目前,我们正在与另一个人(在Google Compute Engine上)共同管理同一台计算机,而我发现工作的唯一方法是复制整个目录(+更改config.json文件中的绝对链接)。 真是me子我认为通用驱动程序不能以这种方式轻松使用-当然,运行时不能简单地重用身份验证问题(tls证书等)-使用通用驱动程序创建(以某种方式需要进行身份验证并证明您已可以访问对每个驱动程序都不同的计算机-在GCE中,您必须检查gcloud身份验证是否允许您访问计算机。 还有一个小问题,除非您之前已经使用给定的驱动程序创建过机器,否则缺少身份验证文件(唯一的身份验证方法是..创建计算机)。

我认为最好的解决方案是使用“导入”命令(针对不同的驱动程序使用不同的实现)。 例如,在GCE中,您可以将所有必要的详细信息(键等)存储在计算机的元数据中: https :

我真的很感激此功能!

@potiuk您复制哪个目录?

@AlexZeitler ~/.docker/machine/machines/<machinename>

+1!

+1我也希望看到解决方案:-)

我今天碰到的正是这个问题,以便与同事联系。

+1 !!!!!

似乎是#23的副本,对吧?
自从我们谈论此功能以来已有将近一年的时间,有人尝试为此制作PR,但已被关闭...
希望此功能将在下一个(主要)版本中发布:)

在要使用Travis或Circle CI的密钥进行部署的连续交付方案中,这是绝对必需的。 关于ETA有任何线索吗?

也要给这个+1

+1

+1

除了复制~/.docker/machine/machines/<name>文件夹并更改绝对路径外,您还需要做什么吗? 我收到与我的证书相关的错误消息,并且尝试重新生成它们也失败。

@jbasrai您尝试访问的内容的IP是否发生了变化?

我已提交https://github.com/docker/machine/issues/2516 ,开始考虑朝着正确方向迈出的步骤,以使其更轻松。

这是一项至关重要的功能,我很想在不久的将来看到它。 在我看来,机器配置应该对客户端保持唯一,而不是导入/导出。 相反(如其他人所提到的那样),使用相同参数运行的docker-machine create应该能够为该机器创建配置,即使该机器已经远程存在而不是像现在那样失败。 当为现有的amazonec2计算机重新运行create命令时,出现此错误,告诉我主机已经存在:

Error creating machine: Error with pre-create check: There is already a keypair with the name testing-recreate.  Please either remove that keypair or use a different machine name.

相反,它可能会警告我主机已经存在,并像最初创建时一样继续添加计算机(可能要求传递覆盖标志)。 这样,我可以使我的dev / CI环境设置脚本保持简单,而不必担心必须将此配置存储在队友(或其他各方)可以访问的位置。

确实令人惊讶的是,对于多个人在同一个虚拟机上工作,我们必须将证书从一台计算机导出/导入到另一台计算机。 如果有人找到了实用的,可用于生产的解决方案,那将是一个很好的消息。

+1

+1

正确。 当前唯一的方法是获取整个目录,但这不适用于某些驱动程序(即VirtualBox,因为它使用不匹配的UUID注册VM和网络)。 过去,有关导入/导出功能的讨论(#23)

@ehazlett,所以我正在使用aws驱动程序,我可以:

  1. 压缩云机~/.docker/machine/machines/staging
  2. 与团队成员共享,他们将以~/.docker/machine/machines/解压缩
  3. 他们会像我一样拥有登台机吗? docker-machine ls (或者他们需要执行其他命令)

@leandromoreira这种方法的一个障碍是,

cat ~/.docker/machine/machines/local/config.json

outputs:

...
        "AuthOptions": {
            "CertDir": "/Users/pretzel/.docker/machine/certs",
            "CaCertPath": "/Users/pretzel/.docker/machine/certs/ca.pem",
            "CaPrivateKeyPath": "/Users/pretzel/.docker/machine/certs/ca-key.pem",
            "CaCertRemotePath": "",
            "ServerCertPath": "/Users/pretzel/.docker/machine/machines/local/server.pem",
            "ServerKeyPath": "/Users/pretzel/.docker/machine/machines/local/server-key.pem",
            "ClientKeyPath": "/Users/pretzel/.docker/machine/certs/key.pem",
            "ServerCertRemotePath": "",
            "ServerKeyRemotePath": "",
            "ClientCertPath": "/Users/pretzel/.docker/machine/certs/cert.pem",
            "ServerCertSANs": [],
            "StorePath": "/Users/pretzel/.docker/machine/machines/local"
        }

所以简单地复制整个目录不是一个完整的解决方案

@bhurlow非常感谢:smile config.json ? 那是唯一的障碍吗?

@leandromoreira我像这样编写脚本,更新版本的docker-machine不再在配置文件中使用base64编码密钥。 归根结底,想要使用远程docker-machine _must_的任何人都必须具有TLS证书,因此各方之间需要进行一些交换

谢谢@bhurlow

@bcwalrus做得很好,直到我们获得官方

npm install -g machine-share

# export
machine-share export amazon

# import
machine-share import  amazon.tar

# fix locations :D (it seems this is not using base64 anymore)
machine-share driverfix amazon

@leandromoreira看起来很棒,我能够成功导出和导入配置。

@muhammadghazali这是@blowlow的想法和努力:stuck_out_tongue:

+1关于官方解决方案的任何更新?

在Docker 1.10.1版本中,我注意到config.json文件从〜/ docker / machine / certs目录引用了以下内容

        "CertDir": "/home/abc/.docker/machine/certs",
        "CaCertPath": "/home/abc/.docker/machine/certs/ca.pem",
        "CaPrivateKeyPath": "/home/abc/.docker/machine/certs/ca-key.pem",
        "ClientKeyPath": "/home/abc/.docker/machine/certs/key.pem",
        "ClientCertPath": "/home/abc/.docker/machine/certs/cert.pem",

您还需要从原始计算机上复制〜/ .docker / machine / certs文件夹,此方案才能起作用。

当前的解决方案似乎是(例如,如果您要在一台计算机上在AWS上创建Docker Machine,并从另一台计算机查看日志或SSH):

  1. 为要共享的Docker机器创建一个新目录my-dirmy-dir/machine ,以便它不使用默认证书
  2. 使用--storage-path my-dir/machine选项创建Docker Machine(确保您指定了绝对路径)
  3. 要共享的机器,编辑config.jsonmy-dir/machine/machines/machine-name和替换的绝对路径my-dir/machine$MACHINE_STORAGE_PATH
  4. 上传my-dir到某个地方,例如到Github

当有人要导入此计算机时:

  1. 克隆或下载my-dir
  2. 编辑config.json在机my-dir/machine/machines/machine-name和替换$MACHINE_STORAGE_PATH用的绝对路径my-dir/machine本地计算机上
  3. chmod 0600id_rsa my-dir/machine/machines/machine-name

现在,您可以使用--storage-path my-dir/machine选项使用Docker Machine命令(确保您指定了绝对路径)。

可以通过以下方法对此进行改进:

  • Docker Machine将相对路径存储在config.json中,因此不必进行编辑
  • Docker Machine SSH(及相关命令)自动将id_rsa修改为0600(如果他们有权)

快速一点,如果您使用envsubst则可以以编程方式替换$ MACHINE_STORAGE_PATH,而不必手动进行编辑。 对于试图使用docker-machine系统群的团队来说,整件事还是很不方便。

但是,如果人们正在寻找解决方法,我发现最简单的方法是:

  1. .docker/machine/certs复制到一个私人位置。 请注意_not_将此内容放入存储库中,因为它具有使您能够访问其他计算机的秘密。 我们为此目的使用私人商店
  2. 在新的主机上,将证书复制到新的.docker/machine/certs
  3. 现在重新运行您的docker-machine创建,您将能够使用它而无需更改所有配置。 它花费的时间更长,但更便于携带,您不必编辑所有这些配置文件。

我有两台工作的计算机,这对我来说是一个真正的问题。
我在这里描述使用docker-machine时期望的梦境行为:

1)使用docker-machine和DigitalOcean驱动程序在DigitalOcean中创建一个小滴(带有从DigitalOcean的控制面板中获得的一些令牌)。

docker-machine create --driver digitalocean --digitalocean-access-token \
    [token_goes_here] --digitalocean-image ubuntu-16-04-x64 --digitalocean-size \
    1gb [host_name_goes_here]

2)转到另一台计算机,从DigitalOcean获取另一个令牌,然后使用魔术般的附加命令将其附加到现有计算机,如下所示:

docker-machine **attach** --driver digitalocean --digitalocean-access-token \
    [token_goes_here]  [host_name_goes_here]

进行这项工作有哪些障碍? 我认为DigitalOcean访问令牌提供了足够的特权来连接到现有主机并设置所有安全通信。

现在,我将尝试使用@bhurlow进行机器共享: https :

为此+1凹凸-有人对此有更新吗?

@brandontamm :我写了一些脚本来自己解决这个问题。 我不知道他们是否会解决您的问题,但我至少可以尝试。 在这里查看要点

要点摘要:有两个功能-store_machine和load_machine。 store_machine将有关机器的所有信息存储在安全存储区中(在磁盘数据存储区上加密)。 您将必须提供密码。 load_machine函数从磁盘数据存储上加载计算机。

请注意,此python代码假定您已安装sstash(Python安全存储)。 您可以通过运行来安装它

pip install sstash

+1

认真地说-Docker-Machine有什么用处,除非您可以从其他预定义的设备访问它。

用例-在工作时构建了docker机器,但随后需要笔记本电脑进行休假,以防服务器崩溃...

快来-Docker Admin在哪里插手?! 这是每个人都可以欣赏的用例。

@realcr您是否尝试过机器共享

我拒绝使用任何其他依赖项:)将.docker文件夹复制到两台OSX机器上对我来说都是完美的。 我的路径和用户名在两台计算机上都相同,因此这是无需手动编辑路径的关键。

布兰登·塔姆
由手机发出

2016年11月4日上午3:36,SébastienBoulet [email protected]写道:

@realcr您是否尝试过机器共享?

-
您收到此邮件是因为有人提到您。
直接回复此电子邮件,在GitHub上查看,或使该线程静音。

+1

+1

+1

+1

我写了docker_machinator尝试解决这个问题。
这是一个python工具,可让您将所有docker-machine凭据和配置保存到加密的存储区中,例如,可以存储在云提供商处。 然后,您可以从另一台主机下载此文件,然后从存储中加载计算机。
这是一个python工具,因此您应该可以使用pip install

我不认为这是完美的解决方案,但是在我们提出更好的解决方案之前,这可以使您前进。

伙计们,您应该知道machine-share会导出您使用带有通用驱动程序的docker-machine创建docker主机时使用的私有ssh密钥。 因此,您发送导出的存档的每个人都将能够访问运行docker的服务器。

@mxl docker -machine提供了ssh子命令,该子命令将授予您对服务器的访问权限,因此,如果您拥有一个可将整个配置创建为可导入文件的工具,则所描述的情况是不可避免的。

➜ docker-machine
Usage: docker-machine [OPTIONS] COMMAND [arg...]
...
Commands:
...
  ssh                   Log into or run a command on a machine with SSH.

我猜想避免这种情况的方法是创建一个命令,该命令能够从远程计算机下载当前配置。 这样的下载将要求您能够SSH到计算机,而不是将访问权限打包在可导入文件中。

仅能从一个主机控制docker-machine是一个不舒服的限制。
我也希望看到类似docker-machine config-from <otherhost>

所以我也+1。

/编辑:我目前正在通过将.docker从“主服务器”同步到所有其他需要相同配置的服务器(通过cron和rsync)来解决该问题。 例如,这对于多个构建从属都是必需的。 这不是一个很好的解决方案。

+1

这是一种不同的情况,使我来到这里。

我创建了一个小滴来构建一堆docker映像,以便以后意识到我需要移动主机区域...

问题是如何附加从新主机上运行的快照还原的docker-machine实例?

2017年3月10日星期五,上午6:16,exjimsk [email protected]写道:

我创建了一个小滴来构建一堆docker映像,后来才意识到
需要移动主机区域。 我如何附加docker-machine实例
从在新主机上运行的快照还原?

如果证书没有更改,您应该可以只更改本地证书
docker-machine config将其指向新的IP地址。 您会发现
文件位于〜/ .docker / machine / machines / your-machine-name / config.json。

另外,如果您从不将数据持久保存在Docker容器中,则改为
移动主机,只需杀死它,制作一个新主机,然后启动相同的主机
新主机上的容器。

+1

+1

+1

+1

+1

+1

+1

+1

docker-machine attach

非常明显的是,这种明显的功能仍然不存在。 我们将共同管理Docker主机,这很麻烦。

就我而言,很高兴将现有主机${HOST}

docker-machine --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem create \
    --drive none --url tcp://${HOST}:2376

但是需要将证书( ca.pem,cert.pem,key.pem )手动复制到DOCKER_CERT_PATH

有什么计划吗? 在config.json记录了完整路径令人沮丧。

我的用例:我有一个带有机器配置的git repo(我使用-s将docker-machine指向它)。 机密信息存储在git encrypt ,其构想是CI作业能够利用这些配置来操纵他们需要访问的计算机。

仅供参考: #3212

@lyda我们在https://github.com/dmstr/docker-roj上使用了这种方法-但没有加密,实际上这将是一个非常不错的功能!

尽管roj始终使用相同的路径,但由于它位于容器中,因此还有其他解决方案,例如:

基本上会改变config.json的一些路径。
除非我在这里完全缺少某些东西,否则这不是什么大魔术。

Docker是否正在积极开发docker-machine ? 我问,因为从提交到掌握已经过去了一个多月: https

+1

+1

+1

天哪,恐怖! 近三年后,该线程仍然存在吗? 这是一个用例,每个人都碰到了,或者似乎会碰到。 我想念什么?

好吧,我认为docker-machine已经死了(至少对我而言:D)。 我切换到kubernetes 。 甚至在alfa版本中自托管的kubeadm都比实际更好。 我可以推荐:)

请支持这个:(

将“〜/ .docker”添加到两台计算机上已同步的rsync或符号链接到云文件夹的文件夹中。 有几个预建的解决方案。 不要太努力,只是做些研究-设置30秒一次就没问题了。

+1

+1

如何实现此功能以及指定静态IP(这是docker-machine项目历史上最需要的两个功能)如何超出我的范围。

差不多4年过去了😮是否有任何更新?

目前,有关Docker的许多文章/教程仍建议使用docker-machine作为管理主机的实际工具。 但是,此问题的存在是一个强大的限制因素!

我目前一直在使用docker-machine,并使用“ copy-certs-dirs”方法在本地计算机之间共享。 我想升级到Kubernetes,但对我的项目来说太过分了。

从Docker容器中运行docker-machine create怎么样? 然后可以将该容器导出,导入另一台计算机上,然后在该计算机上运行。

仍然没有依恋,天哪

此页面是否有帮助?
0 / 5 - 0 等级