docker.sock
的实际原因。 是为了自动发现吗?
docker-compose.yml
Docker守护程序正在听的Unix插座。这是Docker API的主要切入点。它也可以是TCP套接字,但由于安全原因,默认情况下Docker默认使用Unix套接字。 docker CLI客户端使用此套接字默认执行Docker命令。您也可以覆盖这些设置。 可能需要将Docker插座安装在容器中的不同原因。就像从另一个容器内启动新容器一样。或用于自动服务发现和记录目的。这会增加攻击表面,因此,如果将Docker插座安装在容器中,则应该小心。在该容器内部有可信赖的代码,否则您可以简单地损害正在运行Docker Daemon的主机,因为Docker默认情况下将所有容器都启动为root。 docker插座在大多数安装中都有一个docker组) 我希望它回答您的问题。
MoreInfo:Https://docs.docker.com/engine/reference/commandline/dockerd/#examples
我知道这一点很晚,但我希望我的回答能够提供很多见解
我第一次谈论
unix插座术语术语通常是指IP插座。这些是绑定到端口(和地址)的,我们将TCP请求发送到并从中获得答复。 其他类型的套接字是Unix套接字,这些插座用于
IPC
(概要通信)。它们也被称为Unix域插座(UDS)。 UNIX插座使用本地文件系统进行通信,而IP套接字使用网络。 Docker守护程序可以通过三种不同类型的插座收听Docker Engine API请求:
volumes:
- /var/run/docker.sock:/var/run/docker.sock
:标志与Unix插座交谈。由于Docker Server API被暴露为REST,因此我们需要发送命令 http。另外,由于该服务器是本地的(请记住,文件系统),我们 可以传递URL中的任何主机名(或坚持到Local主机, 工作也很好!)。服务器不在乎主机名,只是 路径Docker Server使用此套接字来收听REST API,客户使用套接字将API请求发送到服务器。 Curl可以通过
docker.sock
unix, tcp, and fd
--unix-socket
:
curl --unix-socket /var/run/docker.sock http://localhost/images/json | jq
[
{
"Containers": -1,
"Created": 1525888860,
"Id": "sha256:24a77bfbb9ee3aeef9e24766ad6e9fa57f85c67596f154e8916e4f314067e149",
"Labels": null,
"ParentId": "",
"RepoDigests": [
"postgres@sha256:b06cdddba62f1550a1c674270814e72eaa8734d95912019b4ddc288b650ad67d"
],
"RepoTags": null,
"SharedSize": -1,
"Size": 39507096,
"VirtualSize": 39507096
}
]
你可以用docker.sockcurl --unix-socket /var/run/docker.sock http://localhost/images/json | jq
curl --unix-socket /var/run/docker.sock http://localhost/containers/json | jq
docker客户端 docker服务器
当客户端和服务器在同一台计算机上运行时,它们可以通过称为套接字的特殊文件连接。而且由于它们可以通过文件进行通信,并且Docker可以在主机和容器之间有效共享文件,这意味着您可以在Docker本身内运行客户端。这里是一个样本:
curl -i -X POST --unix-socket /var/run/docker.sock "http://foo/images/a95fgf458dfd/tag?repo=redis&tag=foo"
该命令创建一个docker客户端安装的容器。并检查卷部分:curl --no-buffer --unix-socket /var/run/docker.sock http://localhost/events
docker run --rm -it -v /var/run/docker.sock:/var/run/docker.sock docker sh
-v /var/run/docker.sock:/var/run/docker.sock
在主机终端上的run。
-v
基本上将主机码头守护程序暴露于容器中。因此,您可以从容器中调用Docker API/客户端,以开始/停止/构建图像/容器,例如直接调用主机上的这些命令。