我正在试图了解安装docker的实际原因。埋头苦干。yml文件。是为了自动发现吗?

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

当前回答

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

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

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

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

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

下面是一个例子:

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

这个命令创建一个容器,docker客户端安装在其中。检查volume部分:-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

其他回答

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

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

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

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

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

下面是一个例子:

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

这个命令创建一个容器,docker客户端安装在其中。检查volume部分:-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

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

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

让我先谈谈Unix Sockets

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

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

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

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

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

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

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

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
  }
]

一些命令:

Curl——unix-socket /var/run/docker。袜子http://localhost/images/json | jq Curl——unix-socket /var/run/docker。袜子http://localhost/containers/json | jq curl -i -X POST——unix-socket /var/run/docker。袜子“http://foo/images/a95fgf458dfd/tag?回购= redis&tag = foo” Curl—no-buffer—unix-socket /var/run/docker。袜子http://localhost/events

你可以用docker.sock做很多事情

看看这篇漂亮的文章

码头工人。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