在使用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启用访问。
答案 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