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

Ped*_*ori 6 macos ssl docker dockerpy docker-machine

上下文

我正在尝试使用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)
Run Code Online (Sandbox Code Playgroud)

问题

当我尝试运行此代码(print client.containers()在下一行运行类似的东西)时,我收到此错误:

requests.exceptions.SSLError: hostname '192.168.99.100' doesn't match 'localhost'
Run Code Online (Sandbox Code Playgroud)

我一直试图在类似问题上遵循github问题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.2 docker-machine试图通过命令的--tls-san标志来解决这个问题create.需要验证但安装brew过程仍然给出v0.5.1,所以我必须手动安装.

小智 6

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

import docker
client = docker.from_env(assert_hostname=False)
print client.version()
Run Code Online (Sandbox Code Playgroud)

请参阅此处的文档


Ped*_*ori 4

我按照github 上的发行版docker-machine中的详细信息安装了 v0.5.2 。然后我只需创建一台新机器,如下所示:

$ docker-machine create -d virtualbox --tls-san <hostname> <machine-name>
Run Code Online (Sandbox Code Playgroud)

然后我添加<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)
Run Code Online (Sandbox Code Playgroud)

<machine-name>CERTS路径中替换的位置并<machine-ip>base_url.