使用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:/
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6746d8cd1c8d ubuntu:latest "bash" 3 seconds ago Up 2 seconds test
root@dod:/
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守护程序。
docker0
,然后你就可以使用docker远程API。 - xuhdev