Answers:
docker.sock
是Docker守护程序正在侦听的UNIX套接字。这是Docker API的主要入口点。它也可以是TCP套接字,但是出于安全原因,默认情况下,Docker默认使用UNIX套接字。
Docker cli客户端默认使用此套接字执行docker命令。您也可以覆盖这些设置。
您可能需要将Docker套接字安装在容器内的原因可能有所不同。就像从另一个容器中启动新容器一样。或用于自动服务发现和日志记录目的。这会增加攻击面,因此如果您将Docker套接字安装在容器内时要小心,该容器内运行的是受信任的代码,否则您可以简单地破坏正在运行docker daemon的主机,因为Docker默认将所有容器作为根启动。
Docker套接字在大多数安装中都有一个docker组,因此该组中的用户可以在没有root许可的情况下针对docker socket运行docker命令,但由于docker daemon有效地以root身份运行,因此实际的Docker容器仍然具有root许可(它需要root许可才能访问命名空间和cgroups) 。
我希望它能回答您的问题。
更多信息:https : //docs.docker.com/engine/reference/commandline/dockerd/#examples
/var/run/docker.sock
在容器内挂载是一种常见但非常危险的做法。攻击者可以执行docker服务可以运行的任何命令,当docker服务以root身份运行时,通常可以访问整个主机系统。 “
我知道有点晚了,但我希望我的回答会给我这么多见解
首先让我说说 Unix套接字
术语“套接字”通常是指IP套接字。这些是绑定到端口(和地址)的端口,我们向其发送TCP请求并从中获取响应。
套接字的另一种类型是Unix套接字,这些套接字用于IPC(进程间通信)。它们也称为Unix域套接字(UDS)。Unix套接字使用本地文件系统进行通信,而IP套接字使用网络。
Docker守护程序可以通过三种不同类型的Socket监听Docker Engine API请求: unix, tcp, and fd
。
默认情况下,在/var/run/docker.sock中创建unix域套接字(或IPC套接字)
让我们看一些现场的例子:
Docker Server使用此套接字监听REST API,而客户端使用该套接字向服务器发送API请求。
curl可以通过该
--unix-socket
标志与Unix套接字通信。由于Docker Server API作为REST公开,因此我们需要通过HTTP发送命令。另外,由于该服务器是本地服务器(请记住,文件系统),因此我们可以在URL中传递任何主机名(或坚持使用localhost,这也可以正常工作!)。服务器不关心主机名,仅关心路径。
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.sock做很多事情
看看这篇漂亮的文章