管理来自另一个容器的容器docker

Nei*_*ina 3 multi-tenant docker coreos

我需要能够部署一个新容器或管理另一个正在运行的Docker容器在CoreOS中运行的Docker容器。

docker版本是1.5.0 coreos版本是647.2.0

现在,我用于部署应用程序新实例的过程是使用Shell脚本。

它基本上可以做到:

  1. 将node.js应用程序的源代码复制到新文件夹中
  2. CD进入
  3. 在分离模式下将“ pwd”设置为-v到工作目录中部署一个新的Docker容器,然后该应用程序运行

我在想,是否有可能从容器内部执行shell脚本,以便它在coreos中部署新的容器,或者该方法是否有替代方法。

另一个目标是能够停止正在运行的容器。

任何意见或建议,将不胜感激。

Vin*_*met 5

在安装了Docker客户端和套接字的情况下运行控制容器,您将能够在容器内控制docker守护进程(在docker 容器内运行docker 客户端

编辑:请注意对Docker套接字需要root访问权限,这意味着容器能够控制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
Run Code Online (Sandbox Code Playgroud)

在最新的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:/#
Run Code Online (Sandbox Code Playgroud)

编辑:对于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)
Run Code Online (Sandbox Code Playgroud)

要找出哪个软件包为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
Run Code Online (Sandbox Code Playgroud)

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