在OSX上通过docker-py连接到Docker-Machine

上下文

我正在尝试使用docker-py连接到OSX上的docker-machine 。

我不能简单地使用标准的Client(base_url='unix://var/run/docker.sock')因为Client(base_url='unix://var/run/docker.sock') docker-machine虚拟机上运行,​​而不是我的本地操作系统。

相反,我试图使用docker.tls 安全地连接到VM:

 from docker import Client import docker.tls as tls from os import path CERTS = path.join(path.expanduser('~'), '.docker', 'machine', 'certs') tls_config = tls.TLSConfig( client_cert=(path.join(CERTS, 'cert.pem'), path.join(CERTS,'key.pem')), ca_cert=path.join(CERTS, 'ca.pem'), verify=True #verify=False ) client = docker.Client(base_url='https://192.168.99.100:2376', tls=tls_config) 

问题

当我尝试运行这个代码(在下一行运行类似print client.containers()东西),我得到这个错误:

 requests.exceptions.SSLError: hostname '192.168.99.100' doesn't match 'localhost' 

我一直在试图跟随与boot2docker的类似问题的github问题 ,即。 docker-machine的旧版本,但我不太了解如何实施SSL证书。 我试图添加192.168.99.100 localhost到我的/etc/hosts文件的结尾在github问题build议,但是这并没有解决问题(即使export DOCKER_HOST=tcp://localhost:2376 )。

也许通过证书连接不是docker-machine ,所以任何通过docker-py连接到特定docker-machine替代方法的答案也是可以接受的。

更新好像docker docker-machine v0.5.2试图通过create命令的--tls-san标志来解决这个问题。 需要validation,但通过brew安装仍然给v0.5.1,所以我不得不手动安装。

看起来像Docker-py v1.8.0,你可以像下面那样连接到Docker-machine;

 import docker client = docker.from_env(assert_hostname=False) print client.version() 

在这里看到文档

我安装了docker docker-machine v0.5.2,详见github上的发行版 。 然后,我只需要创build一个新的机器,如下所示:

 $ docker-machine create -d virtualbox --tls-san <hostname> <machine-name> 

然后,我将<hostname> <machine-ip>/etc/hosts 。 代码在那之后工作

 from docker import Client import docker.tls as tls from os import path CERTS = path.join(path.expanduser('~'), '.docker', 'machine', 'machines', <machine-name>) tls_config = tls.TLSConfig( client_cert=(path.join(CERTS, 'cert.pem'), path.join(CERTS,'key.pem')), ca_cert=path.join(CERTS, 'ca.pem'), verify=True ) client = docker.Client(base_url='https://<machine-ip>:2376', tls=tls_config) 

我在CERTSpath中replace了<machine-ip> ,并在base_urlreplace了<machine-ip>