在Mac OS X中的Docker中启用远程API(boot2docker)

我似乎无法弄清楚如何使用boot2docker启用远程API。 我正在尝试使用dockerode,如下所示:

Docker = require('dockerode') docker = new Docker(socketPath: "/var/run/docker.sock") container = docker.getContainer('<my_container_id>') container.inspect (err, data) -> debug data 

数据是空的,尽pipe有一个id为''的容器。 我怀疑这是因为在OS X主机上没有/var/run/docker.sock,我需要使用类似于:

 var docker2 = new Docker({host: 'http://192.168.1.10', port: 3000}); 

…但无法弄清楚如何在VirtualBox虚拟机中configurationboot2docker或docker,以便通过http或tcp访问。

由Boot2Dockerconfiguration的Docker默认支持从主机OSX机器上的2375端口进行远程访问。 这是当它告诉你做export DOCKER_HOST=tcp://192.168.59.103:2375

如果要从另一台机器访问端口,则需要configurationVirtualBoxnetworking以将stream量路由到该端口。 这可以通过使用此命令的端口转发完成:

 VBoxManage modifyvm "boot2docker-vm" --natpf1 "guestssh,tcp,,2375,,2375" 

然后,在您的new Docker代码中使用的地址是Mac的IP地址。

您还可以在boot2docker-vm / settings / network / advanced / port forwarding下的VirtualBox GUI中对其进行configuration。

请参阅VirtualBox文档 。

请注意,正如这里所描述的,现在允许任何有IP访问权限的人来控制你的Docker安装,这可能是一个安全问题。

对于遇到这个问题的每个人来说,大多数情况下,当使用类似boot2docker的东西时,你想禁用TLS,而这只是为开发和testing而build立的(不知道为什么boot2docker默认启用TLS)基本上就像每个REST工具一样访问远程API,因为它们都不支持基于TLS的身份validation,而没有太多的configuration。

所以如果你只是想在boot2docker中开发,在你的boot2docker控制台中运行:

 cp /etc/init.d/docker ~/docker.bak sudo sed -i 's/DOCKER_TLS:=auto/DOCKER_TLS:=no/1' /etc/init.d/docker sudo /etc/init.d/docker stop sudo /etc/init.d/docker start 

它将禁用TLS并重新启动docker deamon。 一旦完成,你应该可以打开http://your-boot2docker-ip:2375/info并获得一些输出。 请注意,这是boot2docker 1.41。 以上sed命令所提示的envvariables的名称可能会在将来发生变化。 也许他们甚至会在未来的版本中默认禁用TLS。

在当前版本的boot2docker(1.3.1)中,只需将容器安装到容器中即可,例如:

 $ docker run -it -v /var/run/docker.sock:/home/docker.sock myimage bash [ root@51c0518f4d42:~ ]$ ls /home docker.sock Docker = require('dockerode') docker = new Docker(socketPath: "/home/docker.sock") // should work! 

恕我直言,这比使用VirtualBox端口转发来得简单,干净

这实际上与使用Docker API客户端的大多数示例相同,即“将docker套接字作为卷挂载到容器中”。

也许像我这样认为,由于boot2docker的工作方式,这是不可能的。 毕竟,最近的版本似乎设置为从您的OS X主机而不是boot2docker虚拟机共享卷而这正是您大部分时间所需要的。 但是OS X主机上没有/var/run/docker.sockpath,那么是怎么回事?

实际情况是/Users目录从主机挂载到boot2docker虚拟机中。 当您将卷添加到boot2docker下的容器时,它仍然会共享vm中该path上的任何内容……只是发生在vm中的/Users下的任何path都是从主机挂载的。 但是/Users之外的任何path将来自boot2docker虚拟机本身,而不是您的主机。

 $ boot2docker ssh docker@boot2docker:~$ ls /var/run acpid.pid acpid.socket docker.pid docker.sock sshd.pid udhcpc.eth0.pid udhcpc.eth1.pid utmp 

有docker socket文件,因为它在/Users目录之外,所以我们可以把这个path作为一个卷链接到我们的容器中。

(出于某种原因,这是行不通的:

 $ docker run -it -v /var/run/docker.sock 

…套接字文件在我们的容器中作为/var/run/docker.sock/目录出现 – 看起来像一个docker bug。)

我们必须使用冒号分隔的forms:

 $ docker run -it -v /var/run/docker.sock:/home/docker.sock