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

时间:2014-11-09 02:10:19

标签: docker 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

数据为空,尽管有一个容器ID为&#39;&#39;。我怀疑这是因为OS X主机上没有/var/run/docker.sock,我需要使用类似的东西:

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

...但无法弄清楚如何在VirtualBox VM中配置boot2docker或docker以通过http或tcp启用访问。

3 个答案:

答案 0 :(得分:5)

对于遇到该问题的每个人,大多数时候你想在使用boot2docker之类的东西时禁用TLS - 这只是为开发和测试而构建的(为什么boot2docker默认决定启用TLS) 它会阻止您使用基本类似于您可以考虑的每个REST工具来访问远程API,因为它们都不支持基于TLS的身份验证,而无需进行大量配置。

因此,如果您只想在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命令重新定义的env变量的名称将来可能会更改。也许他们甚至会在将来的版本中默认禁用TLS。

答案 1 :(得分:3)

Docker,由Boot2Docker配置,默认支持从主机OSX机器端口2375 进行远程访问;这是在它告诉您执行export DOCKER_HOST=tcp://192.168.59.103:2375

时设置的内容

如果要从另一台计算机访问该端口,则需要配置VirtualBox网络以将流量路由到该端口。这可以通过使用此命令进行端口转发来完成:

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

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

您也可以在boot2docker-vm / settings / network / advanced / port forwarding下的VirtualBox GUI中进行配置。

请参阅VirtualBox docs

请注意,如here所述,现在允许任何对您的计算机具有IP访问权限的人控制您的Docker安装,这可能是一个安全问题。

答案 2 :(得分:3)

在当前版本的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 socket作为卷安装到容器中”。

也许像我一样,你认为由于boot2docker的工作方式,这是不可能的。毕竟,似乎最近的版本设置为从OS X主机而不是boot2docker vm共享卷,这是您大多数时候想要的。但是OS X主机上没有/var/run/docker.sock路径,所以发生了什么?

实际发生的是/Users目录从主机安装到boot2docker vm中。当您向boot2docker下的容器添加卷时,它仍然正在共享该路径在vm 中的任何内容...只是发生了vm中/Users下的任何路径都是从主人。但是/Users之外的任何路径都来自boot2docker vm本身,而不是你的主机。

$ 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套接字文件,因为它在/Users目录之外,我们可以将该路径作为卷链接到我们的容器中。

(由于某些原因,这不起作用:

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

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

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

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