2014-11-09 50 views
7

我似乎无法弄清楚如何在使用boot2docker时启用远程API。我试图使用dockerode如下:在Mac OS X上启用Docker中的远程API(boot2docker)

Docker = require('dockerode') 
docker = new Docker(socketPath: "/var/run/docker.sock") 

container = docker.getContainer('<my_container_id>') 

container.inspect (err, data) -> 
    debug data 

尽管存在一个id为''的容器,但数据为空。我怀疑这是因为在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

默认情况下,由Boot2Docker配置的Docker支持从主机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地址。

您可以在VirtualBox的GUI下boot2docker-VM /设置/网络/高级/端口转发也对此进行配置。

参见VirtualBox docs

注意,所描述的here,这现在允许任何人以IP访问您的计算机来控制你的码头工人的安装,这可能是一个安全问题。

+0

谢谢布莱恩。我正在努力解决的另一件事是如何使用curl与docker API交谈。你有没有一些指针? – akshayl 2014-11-22 03:12:28

+0

最好问,作为一个单独的问题。 – Bryan 2014-11-22 08:04:28

3

在boot2docker(1.3.1)的最新版本,你可以只安装一个体积容器,如做到这一点:

$ docker run -it -v /var/run/docker.sock:/home/docker.sock myimage bash 
[ [email protected]:~ ]$ ls /home 
docker.sock 

Docker = require('dockerode') 
docker = new Docker(socketPath: "/home/docker.sock") 
// should work! 

恕我直言,这是比VirtualBox的端口转发

乱搞简单和清晰

这实际上是如何使用泊坞窗API客户端的大多数例子阐述,即“只是泊坞窗插座安装到容器的体积”是一样的。

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

实际上会发生什么情况是,/Users DIR是从主机到boot2docker VM安装。当你下boot2docker它仍然是共享无论是在虚拟机这条道路添加卷到容器......它只是发生在虚拟机/Users下的任何路径从主机安装。但/Users以外的任何路径将来自boot2docker虚拟机本身,而不是您的主机。

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

有我们的搬运工套接字文件,因为它是/Users目录外,我们可以在路径链接到我们的容器为卷。

(出于某种原因,这不起作用:

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

...套接字文件出来在我们的容器/var/run/docker.sock/目录 - 似乎是一个码头工人的错误。)

我们有使用冒号分隔形式:

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

对于大家,运行到这个问题,大部分的时间你想使用类似boot2docker时禁用TLS - 这是BUI ld仅用于开发和测试(不知道为什么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并重新启动泊坞窗守护进程。一旦完成,你应该能够打开http://your-boot2docker-ip:2375/info并获得一些输出。请注意,这是boot2docker 1.41的版本。以上sed命令重新提供的env变量的名称可能会在未来发生变化。也许他们甚至会在未来版本中默认禁用TLS。

+0

两天后我终于得到了API工作谢谢你的帖子!非常感谢我! – pregmatch 2015-01-18 23:29:02

+0

这是否意味着我必须从https访问api以进行docker默认设置? – pregmatch 2015-01-18 23:38:16

+0

由于docker没有使用基本身份验证,而是使用基于证书的客户端身份验证,因此只使用https将不起作用。 – masi 2015-01-20 20:28:21