Docker 个容器可以管理其他 Docker 个容器吗?
Can a Docker container manage other Docker containers?
我需要能够在 CoreOS 中从另一个 运行 docker 容器部署新容器或管理 Docker 个容器 运行。
Docker 版本为 1.5.0
CoreOS 版本为 647.2.0
现在,我部署应用程序新实例的过程正在使用 shell 脚本。
基本上是:
- 将 Node.js 应用程序的源代码复制到新文件夹
- cd 进去
- 在分离模式下部署一个新的docker容器,设置
pwd
作为-v
到工作目录然后应用程序运行
我在想,是否可以从容器内部执行 shell 脚本,以便它在 CoreOS 中部署一个新容器,或者是否有任何替代方法。
另一个 objective 是能够停止 运行 容器。
如有任何意见或建议,我们将不胜感激。
运行 安装了 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
还在最新的 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,这将无法工作,我们可以从主机安装它或搜索包:
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 套接字的权限,如果它是非根用户,您可以尝试拥有 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 守护程序。
我需要能够在 CoreOS 中从另一个 运行 docker 容器部署新容器或管理 Docker 个容器 运行。
Docker 版本为 1.5.0
CoreOS 版本为 647.2.0
现在,我部署应用程序新实例的过程正在使用 shell 脚本。
基本上是:
- 将 Node.js 应用程序的源代码复制到新文件夹
- cd 进去
- 在分离模式下部署一个新的docker容器,设置
pwd
作为-v
到工作目录然后应用程序运行
我在想,是否可以从容器内部执行 shell 脚本,以便它在 CoreOS 中部署一个新容器,或者是否有任何替代方法。
另一个 objective 是能够停止 运行 容器。
如有任何意见或建议,我们将不胜感激。
运行 安装了 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
还在最新的 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,这将无法工作,我们可以从主机安装它或搜索包:
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 套接字的权限,如果它是非根用户,您可以尝试拥有 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 守护程序。