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

时间:2015-12-13 21:34:45

标签: macos ssl docker docker-machine dockerpy

上下文

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

我不能简单地使用标准Client(base_url='unix://var/run/docker.sock'),因为docker正在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'

我一直在尝试跟github issue关于boot2docker的类似问题,即。 docker-machine的旧版本,但我不太了解如何实现SSL证书。我尝试按照github问题的建议将192.168.99.100 localhost添加到/etc/hosts文件的末尾,但这并没有解决问题(即使在export DOCKER_HOST=tcp://localhost:2376之后)。

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

更新 似乎docker-machine的v0.5.2试图通过--tls-san命令的create标志来解决这个问题。需要验证,但是brew的安装仍然是v0.5.1,所以我必须手动安装。

2 个答案:

答案 0 :(得分:6)

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

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

请参阅文档here

答案 1 :(得分:4)

我安装了docker-machine v0.5.2,详见release on github。然后我只需要创建一个新机器如下:

$ 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)

我替换了<machine-name>路径中的CERTS并替换了<machine-ip>中的base_url