一个Docker容器能否管理其他Docker容器?

8
我需要能够从另一个正在运行的Docker容器中部署新容器或管理在CoreOS上运行的Docker容器。
Docker版本为1.5.0 CoreOS版本为647.2.0
目前,我部署应用程序的流程是使用shell脚本。
它基本上做了以下几步:
1. 将Node.js应用程序的源代码复制到新文件夹中。 2. 进入该文件夹。 3. 在分离模式下部署新的Docker容器,并将pwd设置为-v以便于工作目录,然后应用程序就可以运行了。
我在想,如果可能的话,是否可以从容器内部执行shell脚本,以便在CoreOS中部署新容器,或者是否有其他替代方法。
另一个目标是能够停止正在运行的容器。
非常感谢您的任何意见或建议。

你可以配置Docker守护进程以侦听docker0,然后你就可以使用docker远程API - xuhdev
1个回答

12

使用Docker客户端和套接字挂载来运行控制容器,您将能够从容器内部控制Docker守护程序(在Docker 容器中运行docker 客户端)。

注意:需要root访问权限才能访问Docker套接字,这意味着容器可以控制Docker守护程序并启动一个容器以获取主机的root权限。因此,请只信任您信任的容器,并且只有您需要访问时再使用该功能。

$ docker run \ 
  -v /var/run/docker.sock:/var/run/docker.sock \   
  -v /usr/bin/docker:/usr/bin/docker \ 
  -v /usr/lib/libdevmapper.so.1.02:/usr/lib/libdevmapper.so.1.02 \
  ubuntu docker --version

Docker version 1.1.2, build d84a070

也在最新的CoreOS / Docker上进行了测试:

core@coreos2 /usr/lib $ docker run -it --name=test --rm -h=dod -v /var/run/docker.sock:/var/run/docker.sock -v `which docker`:/usr/bin/docker -v /usr/lib/libdevmapper.so.1.02:/usr/lib/libdevmapper.so.1.02 ubuntu bash
root@dod:/# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
6746d8cd1c8d        ubuntu:latest       "bash"              3 seconds ago       Up 2 seconds                            test
root@dod:/# docker --version
Docker version 1.6.2, build 7c8fca2-dirty
root@dod:/#

编辑:对于debian:jessie版本,如果没有libsqlite3-0,这将无法工作,我们可以从主机上安装它或搜索该软件包:

EDIT: 对于debian:jessie版本,如果没有libsqlite3-0,这将无法工作,我们可以从主机上挂载它或搜索该软件包:

root@066bf3df3f2e:/# ldd `which docker`
        linux-vdso.so.1 (0x00007ffdb7dc8000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fe8a77df000)
        libsqlite3.so.0 => not found
        libdevmapper.so.1.02 => /usr/lib/libdevmapper.so.1.02 (0x00007fe8a7593000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fe8a71ea000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fe8a79fc000)
        libudev.so.1 => /lib/x86_64-linux-gnu/libudev.so.1 (0x00007fe8a6fdb000)
        librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fe8a6dd3000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fe8a6bcf000)

要查找适用于Debian:jessie的包提供了这个文件,请使用packages.debian.org/search

编辑:如果容器内的用户需要从主机读取Docker套接字,则需要具有读取权限。如果是非root用户,则可以尝试在容器内创建docker组,但组gid应与主机docker组匹配(尚未确认是否实际有效)。

或者您可以使用apt-get install sudo

echo "<user_name> ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers.d/90-custom && \
chmod 0440 /etc/sudoers.d/90-custom

此时,您可以为该用户编写脚本以sudo docker ..控制宿主机的docker守护程序。


抱歉,我使用的是 Docker 版本 1.5.0,我尝试了这个方法但没有成功。 - Neil Molina
很奇怪,我好久没用这个了,但我期望它仍然能够工作,让我测试一下。 - Vincent De Smet
好的,谢谢。与此同时,我的CoreOS Hyper-V虚拟机无法启动,所以我从http://alpha.release.core-os.net/amd64-usr/current/下载了一个新的。但是我无法使云配置生效(上次我成功了:( :( ),所以到目前为止我还没能进行测试... - Vincent De Smet
1
酷!只有一个提示,如果您从远程客户端使用“which docker”,则Docker主机可能会将二进制文件放在不同的路径下,因此最好将其替换为Docker守护程序上Docker二进制文件的完整路径。 - Vincent De Smet
1
我在Docker Compose中使用它,这就是为什么which docker在yaml中不能静态使用的原因。顺便说一下,我将其与logrotate一起使用,用于存储在我的容器内部的日志,使用postrotate docker kill -s HUP container_apache。希望能对某些人有所帮助。 - Mikl
显示剩余2条评论

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