访问容器内的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很简单:

  1. 将unix套接字暴露给容器
  2. 将docker客户端二进制代码绑定到容器,这样可以避免在容器中安装docker包

这就是为什么

 docker run -v /var/run/docker.sock:/var/run/docker.sock \ -v $(which docker):/bin/docker \ -ti ubuntu 

应该做的伎俩,几乎没有副作用。

注意事项:

  1. 所有主机容器都可以被容器访问,所以它可以阻止它们,删除, 运行任何在顶层Docker容器中的用户的命令
  2. 所有创build的容器都是在顶级Docker中创build的。
  3. 当然,你应该明白,如果容器可以访问主机的Docker守护进程,它就可以访问整个主机系统。 根据容器和系统(AppArmor)的configuration,这可能会更less或更危险
  4. 其他警告在这里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理器上运行。