如何在容器中执行主机的Docker命令?

4
我想用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>;

这个脚本将执行哪些操作? - Erazihel
docker run/rm/stop <another container>; - Pahlevi Fikri Auliya
为什么要使用Python脚本而不是Shell脚本? - Erazihel
@Erazihel 可以,见下面我的回答。 - mattinbits
@mattinbits 哦,我不知道,谢谢! - Erazihel
显示剩余3条评论
3个回答

6

您可以将 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而不是进行命令行调用。有一个Python库可供您使用。


1
通过您的命令,我得到了 error while loading shared libraries: 的错误,所以我尝试了 docker run -v /lib64:/lib64 -v /usr:/usr -v /lib:/lib -v /var/run/docker.sock:/var/run/docker.sock debian docker --version,它可以正常工作。 - deFreitas
是的,这个答案已经过时了,而且只适用于Docker分发静态二进制文件的情况。对于动态二进制文件,最好的方案可能是在容器中安装Docker。 - Adrian Mouat

5
如果您使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程序并启动/停止其他容器。

是的,这就是我在寻找的文章。docker-py 库应该被 Compose 使用,所以应该很不错。 - Adrian Mouat
另外,值得指出的是,如果您安装了Docker客户端,仍然可以对远程API进行正常的命令行调用。 - Adrian Mouat

2
另一种方法是使用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


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