在 OSX 上通过 docker-py 连接到 Docker-Machine
Connecting to Docker-Machine via docker-py on OSX
上下文
我正在尝试在 OSX 上使用 docker-py to connect to docker-machine。
我不能简单地使用标准 Client(base_url='unix://var/run/docker.sock')
,因为 docker 运行 宁在 docker-machine
虚拟机上,而不是我的本地 OS。
相反,我正在尝试使用 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-py
连接到特定 docker-machine
的替代方法的答案也是可以接受的。
更新
似乎 docker-machine
的 v0.5.2 试图通过 create
命令的 --tls-san
标志来解决这个问题。需要验证,但通过 brew
安装仍然提供 v0.5.1,所以我必须手动安装。
我安装了 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)
我在 CERTS
路径中替换了 <machine-name>
并在 base_url
.
中替换了 <machine-ip>
看起来像 Docker-py v1.8.0 你可以像下面那样连接到 Docker-机器;
import docker
client = docker.from_env(assert_hostname=False)
print client.version()
查看文档 here
上下文
我正在尝试在 OSX 上使用 docker-py to connect to docker-machine。
我不能简单地使用标准 Client(base_url='unix://var/run/docker.sock')
,因为 docker 运行 宁在 docker-machine
虚拟机上,而不是我的本地 OS。
相反,我正在尝试使用 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-py
连接到特定 docker-machine
的替代方法的答案也是可以接受的。
更新
似乎 docker-machine
的 v0.5.2 试图通过 create
命令的 --tls-san
标志来解决这个问题。需要验证,但通过 brew
安装仍然提供 v0.5.1,所以我必须手动安装。
我安装了 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)
我在 CERTS
路径中替换了 <machine-name>
并在 base_url
.
<machine-ip>
看起来像 Docker-py v1.8.0 你可以像下面那样连接到 Docker-机器;
import docker
client = docker.from_env(assert_hostname=False)
print client.version()
查看文档 here