在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)
我在CERTS
path中replace了<machine-ip>
,并在base_url
replace了<machine-ip>
。