我想用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>;
答案 0 :(得分:5)
您可以将docker binary和socket挂载到容器中:
$ 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 API而不是进行命令行调用。有python library可以帮助您。
答案 1 :(得分:5)
如果您通过HTTPS访问Docker守护程序,那么您可以从远程计算机或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程序停止并启动其他容器。 / p>
答案 2 :(得分:2)
另一种方法是使用CoreOS工具箱访问python和exec 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