文件“docker.sock”的用途是什么?

qhhrdooz  于 2023-05-22  发布在  Docker
关注(0)|答案(4)|浏览(682)

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

volumes:
  - /var/run/docker.sock:/var/run/docker.sock
du7egjpx

du7egjpx1#

docker.sock是Docker守护进程正在监听的UNIX套接字。它是Docker API的主要入口点。它也可以是TCP套接字,但出于安全原因,Docker默认使用UNIX套接字。
Docker cli client默认使用此套接字执行docker命令。您也可以覆盖这些设置。
您可能需要在容器中挂载Docker套接字的原因可能有很多。就像从另一个容器中启动新容器一样。或用于自动服务发现和日志记录目的。这增加了攻击面,因此如果您在容器内安装Docker套接字,则应该小心,该容器内运行受信任的代码,否则您可以简单地危害正在运行Docker守护程序的主机,因为Docker默认情况下以root身份启动所有容器。
Docker socket在大多数安装中都有一个docker组,因此该组中的用户可以在没有root权限的情况下对docker socket运行docker命令,但实际的docker容器仍然获得root权限,因为docker守护进程有效地以root身份运行(它需要root权限才能访问namespace和cgroups)。
我希望它能回答你的问题。
更多信息:https://docs.docker.com/engine/reference/commandline/dockerd/#examples

uttx8gqw

uttx8gqw2#

我知道有点晚了,但我希望我的回答能给予你很多启发
先说说Unix Sockets
术语套接字通常指IP套接字。这些是绑定到端口(和地址)的,我们向其发送TCP请求并从中获得响应。
另一种Socket是Unix Socket,这些Socket用于IPC(进程间通信)。它们也被称为Unix域套接字(UDS)。Unix套接字使用本地文件系统进行通信,而IP套接字使用网络。
Docker守护进程可以通过三种不同类型的Socket侦听Docker Engine API请求:unix, tcp, and fd .
默认情况下,unix域套接字(或IPC套接字)创建在/var/run/docker.sock

让我们看一些示例

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

curl可以通过--unix-socket标志与Unix Socket通信。由于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
看看这个美丽的article

sycxhyv7

sycxhyv73#

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

  • Docker客户端
  • Docker服务器

Docker Server通过套接字接收命令(通过网络或通过“文件”)
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
7ajki6be

7ajki6be4#

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

相关问题