我想了解在docker.sock
文件中挂载docker-compose.yml
的实际原因。是自动发现吗?
volumes:
- /var/run/docker.sock:/var/run/docker.sock
答案 0 :(得分:88)
docker.sock
是Docker守护程序正在侦听的UNIX套接字。它是Docker API的主要入口点。它也可以是TCP套接字,但出于安全原因,默认情况下Docker默认使用UNIX套接字。
Docker cli客户端默认使用此套接字执行docker命令。您也可以覆盖这些设置。
可能有不同的原因可能需要在容器内安装Docker套接字。就像从另一个容器中启动新容器一样。或者用于自动服务发现和日志记录。这会增加攻击面,所以如果你在一个容器内安装docker socket,你应该小心,在该容器内运行可信代码,否则你只能破坏运行docker守护进程的主机,因为Docker默认以root身份启动所有容器。
Docker套接字在大多数安装中都有一个docker组,因此该组中的用户可以在没有root权限的情况下针对docker socket运行docker命令,但实际的docker容器仍然获得root权限,因为docker守护进程有效地以root身份运行(它需要root权限才能访问名称空间和cgroups)。
我希望它能回答你的问题。
更多信息:https://docs.docker.com/engine/reference/commandline/dockerd/#examples
答案 1 :(得分:8)
我知道有点晚了,但是我希望我的回答会给我这么多见识
让我先谈谈 Unix套接字
术语“套接字”通常是指IP套接字。这些是绑定到端口(和地址)的地址,我们向其中发送TCP请求并从中获取响应。
另一种类型的套接字是Unix套接字,这些套接字用于 IPC (进程间通信)。它们也称为Unix域套接字( UDS )。 Unix套接字使用本地文件系统进行通信,而IP套接字使用网络。
Docker守护程序可以通过三种不同类型的Socket来监听Docker Engine API请求:unix, tcp, and fd
。
默认情况下,在/var/run/docker.sock中创建unix域套接字(或IPC套接字)
让我们看看一些实时示例:
Docker Server使用此套接字监听REST API,而客户端使用该套接字向服务器发送API请求。
curl 可以通过
--unix-socket
标志与Unix套接字通信。由于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
答案 2 :(得分:4)
当你在一台机器上安装 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
答案 3 :(得分:2)
它基本上将主机docker守护程序暴露给容器。因此您可以从容器中调用docker api / client,以启动/停止/构建映像/容器,就像直接在主机上调用这些命令一样。