当前位置:  开发笔记 > 后端 > 正文

任何人都可以解释docker.sock

如何解决《任何人都可以解释docker.sock》经验,为你挑选了2个好方法。

我想了解安装的实际原因docker.sockdocker-compose.yml文件.是自动发现吗?

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

Boynux.. 111

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> Boynux..:

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


除了@boynux提供的警告之外,您还可以在文章[Docker Security Best-practices](https://dev.to/petermbenjamin/docker-security-best-practices-45ih#docker-engine)中找到更多信息.在这一个他们说:_"在容器内安装`/ var/run/docker.sock`是一种常见但非常危险的做法.攻击者可以执行docker服务可以运行的任何命令,通常可以访问整个主机系统,因为docker服务以root身份运行."_

2> Narendranath..:

我知道有点晚了,但我希望我的回答会给我这么多见解

让我先谈谈 Unix套接字

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

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

泊坞窗守护程序可以监听通过三种不同类型的Socket泊坞引擎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
  }
]

一些命令

curl --unix-socket /var/run/docker.sock http:// localhost / images / json | q

curl --unix-socket /var/run/docker.sock http:// localhost / containers / json | q

curl -i -X POST --unix-socket /var/run/docker.sock“ http:// foo / images / a95fgf458dfd / tag?repo = redis&tag = foo ”

curl --no-buffer --unix-socket /var/run/docker.sock http:// localhost / events

您可以使用docker.sock做很多事情

看看这篇美丽的文章

推荐阅读
135369一生真爱_890
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有