原理
docker在被安装时默认会在/var/lib/docker.sock创建unix domain socket。docker daemon会通过它来监听Docker Engine API 请求。而docker命令本质上是在/bin/docker里包装了这些请求交互的细节(猜想,有研究过的朋友可以分享一下🤝)。所以我们只需要将这两个文件挂载到容器中即可。
如果只挂载/var/lib/docker.sock,我们查看容器列表(docker ps)就需要这样操作:
curl -s --unix-socket /var/run/docker.sock http://dummy/containers/json
总的来说:
/var/lib/docker.sock保证能跟docker daemon通信/bin/docker隐藏通信细节
具体操作
docker run -d --name <yourContainerName>
-v /var/run/docker.sock:/var/run/docker.sock \
-v /bin/docker:/bin/docker \
注意点
- 如果
docker容器内需要访问宿主机docker命令的用户不是root用户或者不属于docker组的用户,则还需执行:sudo usermod -aG docker $USER - 如果容器基于
Alpine Linux,基于glibc构建的/bin/docker是无法执行的。所以还需要执行如下操作:wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.34-r0/glibc-2.34-r0.apk apk add glibc-2.34-r0.apk