从容器内访问主机docker计算机

从容器内访问主机docker计算机,docker,continuous-integration,docker-machine,Docker,Continuous Integration,Docker Machine,我有一个映像,用于运行我的CI/CD构建(使用GitLab CE)。我想在容器中部署我的应用程序,执行以下操作: eval "$(docker-machine env manager)" sudo docker stack deploy --compose-file docker-stack.yml web docker run -v /var/run/docker.sock:/var/run/docker.sock <gitlab-image> 但是,我希望docker机器访问

我有一个映像,用于运行我的CI/CD构建(使用GitLab CE)。我想在容器中部署我的应用程序,执行以下操作:

eval "$(docker-machine env manager)"
sudo docker stack deploy --compose-file docker-stack.yml web
docker run -v /var/run/docker.sock:/var/run/docker.sock <gitlab-image>
但是,我希望docker机器访问主机系统上定义的机器,因为容器将被销毁,我不希望在映像中包含访问详细信息

我试过一些方法

通过
docker机器访问远程主机

  • 在主机上创建docker机器并装载
    机器存储路径
    ,使其可用于容器
  • 从容器内手动连接到远程docker机器,并将
    机器存储路径设置为等于已装入的卷
  • 安装docker插座
在这两种情况下,我都可以看到机器存储被持久化,但每当我创建一个新容器并运行
docker machine ls
时,都不会列出任何机器

通过
DOCKER\u主机访问远程主机

  • 将远程机器docker端口转发到主机docker端口
    docker机器ssh manager-1-N-L 2376:localhost:2376
  • 导出DOCKER\u主机=:2376
  • 告诉docker使用docker机器使用的相同证书:
    export docker\u TLS\u VERIFY=1
    export docker\u CERT\u PATH=/Users/me/.docker/machine/machines/manager-‌​1
  • 使用
    docker信息进行测试
这给了我连接时的
错误:Gethttps://localhost:2376/v1.26/info: x509:由未知机构签署的证书

关于如何从容器中执行远程部署,有什么想法吗

谢谢

编辑

下面是一个图表,试图帮助更好地沟通该场景


如果您想从CI容器与Docker主机通信,只需在启动CI容器时挂载Docker套接字即可:

eval "$(docker-machine env manager)"
sudo docker stack deploy --compose-file docker-stack.yml web
docker run -v /var/run/docker.sock:/var/run/docker.sock <gitlab-image>
docker-run-v/var/run/docker.sock:/var/run/docker.sock

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

不要为此使用docker机器

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

解决方案是挂载docker套接字,并以root用户身份或从与docker套接字具有相同gid的用户处挂载(请注意,容器内外的组名称可能不匹配,因此gid很重要),正常运行
docker…
命令。您可以完全跳过
docker机器
eval,因为您正在对本地docker套接字运行命令


如果您需要远程运行命令,我发现手动定义
DOCKER\u主机
DOCKER\u TLS\u验证
变量比使用
DOCKER机器

更容易-是的,所以我已经在这么做了。我可以执行类似于
docker build
docker login
的操作,但是当我想要实际部署到远程机器时,
docker machine ls
不显示任何机器。但是,在主机上运行
docker machine ls
会显示多台机器。docker机器是否需要安装插座?不建议这样做。装载
docker.sock
是一个安全问题。有很多关于这方面的文章,如果你在生产中使用docker,这是不建议的。所以,我已经安装了用于创建图像等操作的插座。如果我设置一个从主机到远程计算机的隧道:
docker-machine ssh-manager-1-N-L 2376:localhost:2376
,然后尝试设置
docker\u-host=:2376
,并运行
docker-info
I get:get:畸形HTTP响应“\x15\x03\x01\x00\x02\x02”。然后我尝试了
导出DOCKER\u TLS\u VERIFY=1
导出DOCKER\u CERT\u PATH=/Users/me/.DOCKER/machine/machines/manager-1
,现在
DOCKER info
在连接过程中给出了
错误:Gethttps://localhost:2376/v1.26/info: x509:由未知权限签署的证书
看起来您仍在尝试使用docker机器。还不清楚从主机和容器中使用了哪些命令和文件/目录。从定义上讲,这两种情况是不同的。有关使用远程docker套接字的更多详细信息,请参阅此链接:对不起,上面的注释是在主机上运行的,只是为了确保我可以使用此方法连接到远程计算机(到目前为止,这是否定的)。请注意,远程计算机是由主机使用
docker machine create…
创建的,因此我指向docker machine cert路径,并使用
docker machine ssh
转发端口。我在原始位置添加了一个图表,我不会装载
docker.sock
类似的内容。请参阅这篇文章,了解您正在打开一个大的安全漏洞。如果在套接字上运行的唯一容器是构建容器,您会认为这有很大的风险吗?通常,您不希望在容器中运行容器。如果需要访问卷,则应改为使用
--link
,或使用
docker>=1.12
创建网络覆盖。使用一个容器来启动其他容器没有什么错,只是让它们在主机上启动,而不是在容器内部启动。在容器中使用容器是一种反模式,随着时间的推移,您会发现很难管理。通过将gitlab与ansible相结合,您可以更轻松地完成您正在尝试的操作。e、 g.使用gitlab ce->passs构建容器,下一个构建步骤是执行ansible playbook,在主机vm上部署/更新docker容器。这是在不引入安全风险的情况下做你想做的事情的最简单的方法