访问容器内的Docker套接字
我正在尝试创build一个容器,可以通过docker套接字文件(主机 – /var/run/docker.sock)访问主机docker远程API。
这里的答案build议代理对套接字的请求。 我怎么去做这个?
我想到了。 您可以简单地通过卷parameter passing套接字文件
docker run -v /var/run/docker.sock:/container/path/docker.sock
正如@zarathustra所指出的那样,这可能不是最好的想法。 请参阅: https : //www.lvh.io/posts/dont-expose-the-docker-socket-not-even-to-a-container.html
如果有人打算从一个容器中使用Docker,他应该清楚地理解安全性的含义。
从容器中访问Docker很简单:
- 将unix套接字暴露给容器
- 将docker客户端二进制代码绑定到容器,这样可以避免在容器中安装docker包
这就是为什么
docker run -v /var/run/docker.sock:/var/run/docker.sock \ -v $(which docker):/bin/docker \ -ti ubuntu
应该做的伎俩,几乎没有副作用。
注意事项:
- 所有主机容器都可以被容器访问,所以它可以阻止它们,删除, 运行任何在顶层Docker容器中的用户的命令 。
- 所有创build的容器都是在顶级Docker中创build的。
- 当然,你应该明白,如果容器可以访问主机的Docker守护进程,它就可以访问整个主机系统。 根据容器和系统(AppArmor)的configuration,这可能会更less或更危险
- 其他警告在这里dont-expose-the-docker-socket
其他方法,如暴露/var/lib/docker
容器可能会导致数据损坏。 请参阅do-not-use-docker-in-docker-for-ci了解更多详情。
请注意官方Jenkins CI容器的用户
在这个容器(也许在其他许多)jenkins进程作为非root用户运行。 这就是为什么它没有与docker套接字进行交互的权限。 所以快速和肮脏的解决scheme运行
docker exec -u root ${NAME} /bin/chmod -v a+s $(which docker)
启动容器后。 这允许容器中的所有用户使用root权限运行docker二进制文件。 更好的方法是允许通过无密码的sudo运行docker二进制文件,但官方的jenkinsCI图像似乎缺乏sudo子系统。
我偶然发现这个页面,同时试图使docker套接字调用工作在一个以nobody
用户身份运行的容器中。
在我的情况下,当my-service
尝试调用docker套接字来列出可用的容器时, my-service
得到访问被拒绝的错误。
我结束了使用docker套接字代理代理docker套接字到my-service
。 这是访问容器内的docker套接字的不同方法,所以我尽pipe我会分享它。
我使得my-service
能够通过DOCKER_HOST
环境variables接收它应该与之通话的DOCKER_HOST
docker-socker-proxy
host,在这种情况下是DOCKER_HOST
docker-socker-proxy
DOCKER_HOST
docker-socker-proxy
。
请注意, docker-socket-proxy
将需要以root
用户身份运行,以便能够将docker套接字代理到my-service
。
示例docker-compose.yml
:
version: "3.1" services: my-service: image: my-service environment: - DOCKER_HOST=tcp://docker-socket-proxy:2375 networks: - my-service_my-network docker-socket-proxy: image: tecnativa/docker-socket-proxy environment: - SERVICES=1 - TASKS=1 - NETWORKS=1 - NODES=1 volumes: - /var/run/docker.sock:/var/run/docker.sock networks: - my-service_my-network deploy: placement: constraints: [node.role == manager] networks: my-network: driver: overlay
请注意,上面的组合文件是swarm( docker stack deploy my-service
),但它也应该在compose模式下工作( docker-compose up -d
)。 这种方法的好处在于, my-service
不再需要在swarmpipe理器上运行。