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

6

背景

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

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

相反,我正在尝试使用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'

我一直在尝试关注与boot2docker有类似问题的Github issue,即旧版本的docker-machine,但我并不了解SSL证书的实现方式。我尝试按照Github issue中建议的方法,在我的/etc/hosts文件末尾添加192.168.99.100 localhost,但这并没有解决问题(即使在执行export DOCKER_HOST=tcp://localhost:2376之后)。也许通过证书连接不是使用docker-machine的正确方法,因此任何提供使用docker-py连接到特定docker-machine的替代方法的答案也是可接受的。

更新:看起来docker-machine的v0.5.2尝试通过--tls-san标志来解决这个问题,需要验证,但是通过brew安装仍然会得到v0.5.1,所以我必须手动安装。

2个回答

6

看起来,使用Docker-py v1.8.0,您可以像下面这样连接到Docker-machine;

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

请查看此处的文档。

1
谢谢@cdagli,但我想消除对环境变量的依赖,并通过Python代码完成所有配置。 - Pedro Cattori

4

我按照 Github 上的发布说明 安装了 docker-machine v0.5.2。之后,我只需按照以下步骤创建新的虚拟机:

$ 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 路径中替换 <machine-name>,并在 base_url 中替换 <machine-ip>


我正在尝试这个解决方案,但是我一直遇到以下问题:requests.exceptions.HTTPError: 404客户端错误:找不到网址:https://192.168.99.100:2376/v1.21/containers/create在/etc/hosts中,我尝试了两种方法:dockerhost 192.168.99.100和:192.168.99.100 dockerhost - Berco Beute
请运行 docker-machine ip 命令,并使用该 IP。 - enderland

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接