谁能解释一下docker.sock

我试图了解在docker-compose.yml文件中挂载docker.sock的实际原因。是为了自动发现吗?

volumes:
- /var/run/docker.sock:/var/run/docker.sock
115733 次浏览

docker.sock是Docker守护进程正在侦听的UNIX套接字。它是Docker API的主要入口点。它也可以是TCP套接字,但出于安全原因,Docker默认使用UNIX套接字。

Docker命令行客户端默认使用该套接字执行Docker命令。您也可以重写这些设置。

在容器中挂载Docker套接字可能有不同的原因。比如从另一个容器中启动新的容器。或者用于自动服务发现和日志记录。这增加了攻击面,所以如果你在容器中挂载docker套接字,你应该小心,因为容器中运行着受信任的代码,否则你可以简单地破坏正在运行docker守护进程的主机,因为docker默认情况下以root启动所有容器。

Docker套接字在大多数安装中都有一个Docker组,因此该组中的用户可以在没有root权限的情况下对Docker套接字运行Docker命令,但实际的Docker容器仍然具有root权限,因为Docker守护进程有效地以root身份运行(它需要root权限才能访问命名空间和cgroups)。

我希望这能回答你的问题。

更多信息:https://docs.docker.com/engine/reference/commandline/dockerd/#examples

我知道有点晚了,但我希望我的回答能给你很多启发

让我先谈谈Unix的套接字

术语套接字通常指的是IP套接字。这些是绑定到端口(和地址)的,我们向其发送TCP请求,并从其获得响应。

另一种套接字是Unix套接字,这些套接字用于IPC(进程间通信)。它们也被称为Unix域套接字(UDS)。Unix套接字使用本地文件系统进行通信,而IP套接字使用网络。

Docker守护进程可以通过三种不同类型的Socket监听Docker Engine API请求:unix, tcp, and fd

默认情况下,unix域套接字(或IPC套接字)创建在/var/run/docker.sock

让我们看一些活生生的例子:

Docker服务器使用该套接字监听REST API,客户端使用该套接字向服务器发送API请求。

旋度可以通过--unix-socket标志与Unix套接字对话。由于Docker服务器API被公开为REST,我们需要发送命令 HTTP。另外,由于这个服务器是本地的(记住,是文件系统),我们 可以在URL中传递任何主机名(或坚持本地主机,那将? 工作也很顺利!)服务器不关心主机名,只关心 路径。< / p >
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做很多事情

看看这个漂亮的文章

它基本上将主机docker守护进程暴露给容器。所以你可以从容器中调用docker api/client,启动/停止/构建镜像/容器,就像直接在主机上调用这些命令一样。

当你在机器上安装docker时。有两个不同的程序:

  • 码头工人的客户
  • 码头工人服务器

Docker服务器通过套接字接收命令(通过网络或“文件”)

Docker客户端通过网络进行通信,并向Docker服务器发送消息来创建容器、启动容器、停止容器等。

当客户端和服务器运行在同一台计算机上时,它们可以通过一个称为套接字的特殊文件进行连接。由于它们可以通过文件进行通信,Docker可以有效地在主机和容器之间共享文件,这意味着你可以在Docker内部运行客户端。

下面是一个例子:

docker run --rm -it -v /var/run/docker.sock:/var/run/docker.sock docker sh

这个命令创建一个容器,docker客户端安装在其中。并检查音量部分:-v /var/run/docker.sock:/var/run/docker.sock

通过-v标志,它共享主机docker.sock文件,因此您可以通过容器操作主机中的容器。

/ # docker run --rm -it ubuntu bash --> Creates a new container via container

在主机终端上运行docker ps

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
0f9e333b59fe   ubuntu    "bash"                   5 seconds ago    Up 4 seconds              zealous_wilson
b4a8af31416b   docker    "docker-entrypoint.s…"   16 minutes ago   Up 16 minutes             epic_elion