我正在尝试创建一个容器,该容器可以通过docker套接字文件(主机 - /var/run/docker.sock)访问主机泊坞窗远程API。访问容器内的Docker套接字
答案here建议代理请求到套接字。我会如何去做这件事?
我正在尝试创建一个容器,该容器可以通过docker套接字文件(主机 - /var/run/docker.sock)访问主机泊坞窗远程API。访问容器内的Docker套接字
答案here建议代理请求到套接字。我会如何去做这件事?
我想通了。你可以简单的通过量参数
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
官方图片或安装泊坞窗的容器内。或描述 here这就是为什么
docker run -v /var/run/docker.sock:/var/run/docker.sock \
-ti docker
应该做的伎俩,你可以下载存档与泊坞窗客户端二进制文件。
或者,你可能会暴露到容器中,并使用 Docker REST API
UPD:这个答案的前版本(基于以前的版本的 jpetazzo post)建议绑定贴装从主机到容器中的泊坞窗二进制文件。这不再可靠,因为Docker Engine不再是(几乎)静态库。
喜欢暴露/var/lib/docker
集装箱都可能导致数据损坏的其他方法。有关更多详细信息,请参见 do-not-use-docker-in-docker-for-ci。
的用户在该容器中(也可能在其他很多)詹金斯进程作为非root用户。这就是为什么它没有与docker套接字进行交互的权限。这么快&肮脏的解决方案开始容器运行后
docker exec -u root ${NAME} /bin/chmod -v a+s $(which docker)
。这允许容器中的所有用户使用root权限运行docker二进制文件。更好的方法是允许通过无密码的sudo运行docker二进制文件,但官方的Jenkins CI映像似乎缺少sudo子系统。
另外,还有一篇很棒的高级文章:http://jpetazzo.github.io/2016/04/03/one-container-to-rule-them-all/ – Dmitriusan
装载docker二进制文件[阻止](https: //jpetazzo.github.io/2015/09/03/do-not-use-docker-in-docker-for-ci/#the-solution):'此版本的前版本建议绑定挂载docker二进制文件从主机到容器。这是不可靠的,因为Docker引擎不再作为(几乎)静态库来分发。“ – Murmel
谢谢,将会更新一个帖子 – Dmitriusan
我偶然发现这个页面,同时试图让Docker套接字调用在作为nobody
用户运行的容器中工作。
在我的情况下,当my-service
尝试调用docker套接字来列出可用容器时,我得到拒绝访问错误。
我结束了使用docker-socket-proxy代理码头插座my-service
。这是访问容器内的docker套接字的不同方法,所以我尽管我会分享它。
我使my-service
能够通过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
注意上面撰写文件被群聚就绪(docker stack deploy my-service
),但它应该在撰写模式工作,以及(docker-compose up -d
)。这种方法的好处在于my-service
不再需要在swarm管理器上运行。
你不应该这样做,请参阅https://www.lvh.io/posts/dont-expose-the-docker-socket-not-even-to-a-container.html – Zarathustra
@Zarathustra同意并感谢。然而,问题不在于是否应该完成。我会在此更新答案并提出警告。 –