如何从容器执行主机的Docker命令?
How to execute host's Docker command from container?
我想在 Python 中编写 Docker 容器管理脚本。但是,由于我使用 CoreOS,因此 Python 未作为标准命令包含在内。所以,我正在考虑使用 Python Docker 容器 (https://registry.hub.docker.com/_/python/) 来执行我的脚本。但是,在这种情况下,脚本将在容器的 VM 中执行,该 VM 无法访问主机的 Docker CLI。
有没有办法使用 Python(或其他未打包在 CoreOS 中的编程语言)来管理主机环境,而无需在主机上安装它?
PS,该脚本将执行如下操作:
docker run/rm/stop <another container>;
您可以将 docker 二进制文件和套接字挂载到容器中:
$ docker run -v $(which docker):/usr/bin/docker -v /var/run/docker.sock:/var/run/docker.sock debian docker --version
Docker version 1.7.0, build 0baf609
或者设置 docker 以允许远程访问(我目前找不到很好的参考资料)。
您还应该考虑使用可用的 Docker API rather than making command line calls. There is a python library 来帮助您。
如果您使 Docker 守护进程可以通过 HTTPS 访问,那么您可以从远程机器或 Docker 容器中与守护进程通信。在守护程序中启用 HTTPS 的说明在这里 https://docs.docker.com/articles/https/
简而言之,它涉及创建客户端和服务器证书(为了安全)和 运行 Docker 守护程序,使用诸如
之类的命令
docker -d --tlsverify --tlscacert=ca.pem \
--tlscert=server-cert.pem --tlskey=server-key.pem \
-H=0.0.0.0:2376
当运行处于这种模式时,您可以使用适合您选择的编程语言的客户端库https://docs.docker.com/engine/reference/api/remote_api_client_libraries/
python docker-py
有一个我没试过,但根据经验可以说这种方法使用 docker-java
客户端库有效,有一个 Java 程序在容器内停止和启动其他容器。
另一种方法是使用 CoreOS 工具箱访问 python 并执行 docker。例如,我的 CoreOS 机器 运行 来自 CoreOS 的一个简单的 python 命令来查看 docker 进程状态":
core@zz1 ~ $ toolbox python -c 'import os;os.system("/media/root/usr/bin/docker -H unix:///media/root/var/run/docker.sock ps")'
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2f5480ebc129 gcr.io/google_containers/etcd:2.0.12 "/usr/local/bin/etcd 47 minutes ago Up 46 minutes k8s_etcd.3a160ccf_kube-dns-45.55.230.109_kube-system_790a48cfb2e2a5ae0abfcb6e3221275f_9d4fc659
ddbbc5e5033c gcr.io/google_containers/skydns:2015-03-11-001 "/skydns -addr=0.0.0 47 minutes ago Up 47 minutes k8s_skydns.db942972_kube-dns-45.55.230.109_kube-system_790a48cfb2e2a5ae0abfcb6e3221275f_59835376
...
-g
我想在 Python 中编写 Docker 容器管理脚本。但是,由于我使用 CoreOS,因此 Python 未作为标准命令包含在内。所以,我正在考虑使用 Python Docker 容器 (https://registry.hub.docker.com/_/python/) 来执行我的脚本。但是,在这种情况下,脚本将在容器的 VM 中执行,该 VM 无法访问主机的 Docker CLI。
有没有办法使用 Python(或其他未打包在 CoreOS 中的编程语言)来管理主机环境,而无需在主机上安装它?
PS,该脚本将执行如下操作:
docker run/rm/stop <another container>;
您可以将 docker 二进制文件和套接字挂载到容器中:
$ docker run -v $(which docker):/usr/bin/docker -v /var/run/docker.sock:/var/run/docker.sock debian docker --version
Docker version 1.7.0, build 0baf609
或者设置 docker 以允许远程访问(我目前找不到很好的参考资料)。
您还应该考虑使用可用的 Docker API rather than making command line calls. There is a python library 来帮助您。
如果您使 Docker 守护进程可以通过 HTTPS 访问,那么您可以从远程机器或 Docker 容器中与守护进程通信。在守护程序中启用 HTTPS 的说明在这里 https://docs.docker.com/articles/https/
简而言之,它涉及创建客户端和服务器证书(为了安全)和 运行 Docker 守护程序,使用诸如
之类的命令docker -d --tlsverify --tlscacert=ca.pem \
--tlscert=server-cert.pem --tlskey=server-key.pem \
-H=0.0.0.0:2376
当运行处于这种模式时,您可以使用适合您选择的编程语言的客户端库https://docs.docker.com/engine/reference/api/remote_api_client_libraries/
python docker-py
有一个我没试过,但根据经验可以说这种方法使用 docker-java
客户端库有效,有一个 Java 程序在容器内停止和启动其他容器。
另一种方法是使用 CoreOS 工具箱访问 python 并执行 docker。例如,我的 CoreOS 机器 运行 来自 CoreOS 的一个简单的 python 命令来查看 docker 进程状态":
core@zz1 ~ $ toolbox python -c 'import os;os.system("/media/root/usr/bin/docker -H unix:///media/root/var/run/docker.sock ps")'
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2f5480ebc129 gcr.io/google_containers/etcd:2.0.12 "/usr/local/bin/etcd 47 minutes ago Up 46 minutes k8s_etcd.3a160ccf_kube-dns-45.55.230.109_kube-system_790a48cfb2e2a5ae0abfcb6e3221275f_9d4fc659
ddbbc5e5033c gcr.io/google_containers/skydns:2015-03-11-001 "/skydns -addr=0.0.0 47 minutes ago Up 47 minutes k8s_skydns.db942972_kube-dns-45.55.230.109_kube-system_790a48cfb2e2a5ae0abfcb6e3221275f_59835376
...
-g