杂谈之容器内访问宿主机docker命令

671 阅读1分钟

原理

docker在被安装时默认会在/var/lib/docker.sock创建unix domain socketdocker 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

总的来说:

  1. /var/lib/docker.sock保证能跟docker daemon通信
  2. /bin/docker隐藏通信细节

具体操作

docker run -d --name <yourContainerName>
    -v /var/run/docker.sock:/var/run/docker.sock \
	-v /bin/docker:/bin/docker \

注意点

  1. 如果docker容器内需要访问宿主机docker命令的用户不是root用户或者不属于docker组的用户,则还需执行:
    sudo usermod -aG docker $USER
    
  2. 如果容器基于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
    

参考

杂谈之普通用户运行docker命令

Daemon socket option

alpine-pkg-glibc