6

语境

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

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

相反,我正在尝试使用以下方式安全地连接到 VM docker.tls

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的替代方法的答案也是可以接受的。

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

4

2 回答 2

6

看起来使用 Docker-py v1.8.0,您可以连接到 Docker-machine,如下所示;

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

请参阅此处的文档

于 2016-03-27T10:55:32.283 回答
4

我安装了docker-machinev0.5.2,详见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.

于 2015-12-14T03:22:21.583 回答