curl可以通过--unix-socket标志与Unix Socket通信。由于Docker Server API公开为REST,因此我们需要通过HTTP发送命令。此外,由于该服务器是本地的(记住,是文件系统),因此我们可以在URL中传递任何主机名(或者坚持使用localhost,这也可以正常工作!)。服务器不关心主机名,只关心路径。
/ # 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
4条答案
按热度按时间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
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,这也可以正常工作!)。服务器不关心主机名,只关心路径。部分命令:
你可以用docker做很多事情。sock
看看这个美丽的article
sycxhyv73#
当你在机器上安装Docker时。有两个不同的程序:
Docker Server通过套接字接收命令(通过网络或通过“文件”)
Docker客户端通过网络进行通信,并向Docker服务器发送消息,以创建容器,启动容器,停止容器等。
当客户端和服务器在同一台计算机上运行时,它们可以通过一个称为套接字的特殊文件进行连接。由于它们可以通过文件进行通信,并且Docker可以在主机和容器之间有效地共享文件,这意味着您可以在Docker本身内部运行客户端。
下面是一个示例:
此命令创建一个容器,docker客户端安装在其中。并检查音量部分:
-v /var/run/docker.sock:/var/run/docker.sock
通过
-v
标志,它共享主机docker.sock
文件,因此您可以通过容器操作主机内的容器。在主机终端上运行
docker ps
。7ajki6be4#
它基本上将主机Docker守护进程暴露给容器。所以你可以从你的容器中调用docker API/client,来启动/停止/构建镜像/容器,就像直接在主机上调用这些命令一样。