我正在试图了解安装docker的实际原因。埋头苦干。yml文件。是为了自动发现吗?
volumes:
- /var/run/docker.sock:/var/run/docker.sock
我正在试图了解安装docker的实际原因。埋头苦干。yml文件。是为了自动发现吗?
volumes:
- /var/run/docker.sock:/var/run/docker.sock
当前回答
我知道有点晚了,但我希望我的回答能给你很多启发
让我先谈谈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做很多事情
看看这篇漂亮的文章
其他回答
当你在机器上安装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
码头工人。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 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做很多事情
看看这篇漂亮的文章
它基本上将主机docker守护进程暴露给容器。所以你可以从容器中调用docker api/client,启动/停止/构建镜像/容器,就像直接在主机上调用这些命令一样。