在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.sock
path,那么是怎么回事?
实际情况是/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
- boot2docker是autoupgrading
- 为什么我的docker容器的Apache服务将被closures,每当我附上我的容器,然后退出?
- Docker for Windows不起作用
- 泊坞窗内的docker,发布http错误
- 通过boot2docker将卷挂载到postgres容器
- Docker守护进程configuration文件在boot2docker / docker-machine / Docker Toolbox上
- dockerbuild设是行不通的
- 在Windows 10中添加docker for TensorFlow可访问的CPU
- Dockerlogin:无法在Windows + PowerShell中input用户名的值