从容器内访问主机docker-machine

时间:2017-02-14 22:25:29

标签: docker continuous-integration docker-machine

我有一个用于运行CI / CD版本的图像(使用GitLab CE)。我想从容器中部署我的app做类似的事情:

prtcl.localIdentifier = "Test iOS device"
prtcl.remoteIdentifier = server.name

但是,我希望docker-machine访问主机系统上定义的机器,因为容器将被销毁,我不想在图像中包含访问细节。

我尝试了一些事情

通过eval "$(docker-machine env manager)" sudo docker stack deploy --compose-file docker-stack.yml web

访问远程主机
  • 在主机上创建docker-machine并挂载docker-machine以便容器可以使用
  • 从容器内手动连接到远程泊坞机,并将MACHINE_STORAGE_PATH设置为等于已安装的卷
  • 安装docker socket

在这两种情况下,我都可以看到机器存储是持久存在的,但每当我创建一个新容器并运行MACHINE_STORAGE_PATH时,都没有列出任何机器。

通过docker-machine ls

访问远程主机
  • 将远程计算机泊坞窗口转发到主机泊坞窗端口DOCKER_HOST
  • docker-machine ssh manager-1 -N -L 2376:localhost:2376
  • 告诉docker使用docker-machine使用的相同证书:export DOCKER_HOST=:2376export DOCKER_TLS_VERIFY=1
  • 使用export DOCKER_CERT_PATH=/Users/me/.docker/machine/machines/manager-‌​1
  • 进行测试

这给了我docker info

关于如何在容器内执行远程部署的任何想法?

由于

修改

这是一个尝试帮助更好地传达场景的图表。

architectur

2 个答案:

答案 0 :(得分:0)

请勿使用docker-machine。

Docker-machine将文件存储在$ HOME / .docker / machine中,因此当您使用此文件夹的新副本重新启动时,将删除所有先前定义的计算机。您可以将此文件夹存储为卷,但有一种更简单的方法可用于您的目的。

解决方案是安装docker socket,以root身份或者与具有与docker socket相同gid的用户(注意容器内部和外部的组名称可能不匹配,因此gid很重要),运行你的docker ...命令正常。您可以完全跳过docker-machine eval,因为您正在对本地docker socket运行命令。

如果您需要远程运行命令,我发现手动定义DOCKER_HOSTDOCKER_TLS_VERIFY变量更容易,而不是使用docker-machine

答案 1 :(得分:-1)

如果您想要从CI容器与Docker主机进行通信,只需在启动CI容器时安装Docker套接字:

docker run -v /var/run/docker.sock:/var/run/docker.sock <gitlab-image>

现在,您可以在CI容器中的主机上运行docker命令。