摘要:创建容器命令通过套接字发送到守护进程的接口,这个将会基于镜像创建容器并返回容器的。注意绑定套接字之后,容器的权限会很高,可以控制守护进程。
译者按: 这篇博客介绍了什么是/var/run/docker.sock,以及如何使用/var/run/docker.sock与Docker守护进程通信,并且提供了两个简单的示例。理解这些,我们就可以运行一些能够管理Docker的Docker容器,比如Portainer、Kubernetes,是不是很神奇呢?
原文: About /var/run/docker.sock
译者: Fundebug
为了保证可读性,本文采用意译而非直译。
运行过Docker Hub的Docker镜像的话,会发现其中一些容器时需要挂载/var/run/docker.sock文件。这个文件是什么呢?为什么有些容器需要使用它?简单地说,它是Docker守护进程(Docker daemon)默认监听的Unix域套接字(Unix domain socket),容器中的进程可以通过它与Docker守护进程进行通信。
图片来源: http://blog.honeybadger.io
举例不妨看一下 Portainer,它提供了图形化界面用于管理Docker主机和Swarm集群。如果使用Portainer管理本地Docker主机的话,需要绑定/var/run/docker.sock:
docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer
访问9000端口可以查看图形化界面,可以管理容器(container),镜像(image),数据卷(volume)...
Portainer通过绑定的/var/run/docker.sock文件与Docker守护进程通信,执行各种管理操作。
Docker守护进程的API安装Docker之后,Docker守护进程会监听Unix域套接字:/var/run/docker.sock。这一点可以通过Docker daemon的配置选项看出来(在ubuntu上执行cat /etc/default/docker ):
-H unix:///var/run/docker.sock
注: 监听网络TCP套接字或者其他套接字需要配置相应的-H选项。
Docker engine API v1.27 (最新版)定义的所有HTTP接口都可以通过/var/run/docker.sock调用。
运行容器使用Portainer的UI,可以轻松创建容器。实际上,HTTP请求是通过docker.sock发送给Docker守护进程的。可以通过curl创建容器来说明这一点。使用HTTP接口运行容器需要两个步骤,先创建容器,然后启动容器。
1. 创建nginx容器curl命令通过Unix套接字发送{“Image”:”nginx”}到Docker守护进程的/containers/create接口,这个将会基于Nginx镜像创建容器并返回容器的ID。
curl -XPOST --unix-socket /var/run/docker.sock -d ‘{“Image”:”nginx”}’ -H ‘Content-Type: application/json’ http://localhost/containers/create
输出返回了容器ID:
{“Id”:”fcb65c6147efb862d5ea3a2ef20e793c52f0fafa3eb04e4292cb4784c5777d65",”Warnings”:null}2. 启动nginx容器
使用返回的容器ID,调用/containers/
curl -XPOST --unix-socket /var/run/docker.sock http://localhost/containers/fcb6...7d65/start
查看已启动的容器:
docker ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES fcb65c6147ef nginx “nginx -g ‘daemon …” 5 minutes ago Up 5 seconds 80/tcp, 443/tcp ecstatic_kirch ...
可知,使用docker.sock运行容器其实非常简单。
Docker守护进程的事件流Docker的API提供了/events接口,可以用于获取Docker守护进程产生的所有事件流。负载均衡组件(load balancer)组件可以通过它获取容器的创建/删除事件,从而动态地更新配置。通过创建一个简单的容器,我们可以了解如何利用Docker守护进程的事件。
1. 运行alpine容器下面的命令用于运行容器,并采用交互模式(interactive mode,该模式下会直接进入容器内),同时绑定docker.sock。
docker run -v /var/run/docker.sock:/var/run/docker.sock -ti alpine sh2. 监听Docker守护进程的事件流
在alpine容器内,可以通过Docker套接字发送HTTP请求到/events接口。这个命令会一直等待Docker daemon的事件。当新的事件发生时(例如创建了新的容器),会看到输出信息。
curl --unix-socket /var/run/docker.sock http://localhost/events3. 观察事件
基于Nginx镜像运行容器之后,通过aplpine容器的标准输出可以观察到Docker daemon生成的事件。
docker run -p 8080:80 -d nginx
可以观察到3个事件:
创建容器
连接默认的桥接网络(bridge network)
启动容器
结论希望这些简单的解释可以帮助大家理解/var/run/docker.sock文件,并且明白它绑定到容器时有何作用。显然,真正的应用会使用代码而不是curl命令给Docker守护进程发送HTTP请求。
注意: 绑定Docker套接字之后,容器的权限会很高,可以控制Docker守护进程。因此,这一点必须谨慎使用,只能用于足够信任的容器。
欢迎加入我们Fundebug的Docker技术交流群: 305097057。
版权声明:
转载时请注明作者Fundebug以及本文地址:
https://blog.fundebug.com/201...
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/26875.html
摘要:基本概念采用与相同的机制,只是运行在不同的抽象层次上。它是一个为分布式应用提供一致性服务的软件,提供的功能包括配置维护名字服务分布式同步组服务等。它是集群的分布式,能够原样运行任何二进制发布版本,如等等。部署为了部署的方便全部使用部署。 筋斗云 岂安运维工程师爱游泳、爱旅行、爱计算机。 前言 目前越来越多的互联网企业开始使用 docker,在这之前,虚拟机占据着大部分的企业市场...
摘要:基本概念采用与相同的机制,只是运行在不同的抽象层次上。它是一个为分布式应用提供一致性服务的软件,提供的功能包括配置维护名字服务分布式同步组服务等。它是集群的分布式,能够原样运行任何二进制发布版本,如等等。部署为了部署的方便全部使用部署。 筋斗云 岂安运维工程师爱游泳、爱旅行、爱计算机。 前言 目前越来越多的互联网企业开始使用 docker,在这之前,虚拟机占据着大部分的企业市场...
摘要:是一个键值存储,用于共享配置以及服务发现。对于我们而言,意味着注册进程必须考虑到端口映射。这个方法被用于管理服务发现。如果未指定,将被从的端口映射找到意味着,你必须在运行的命令中指定它,比如。为了测试取消登记,停止一个容器将立即从中移除。 注:该文由 adetante 编写,该文的原文地址为 Service discovery with Docker - 2 该文紧接着上篇文...
摘要:本文的目的最主要是备忘其次是分享疗效并不能让你一下子掌握这只是一个比较完整的解决方案其他基础知识自行补充基调首先这不是屠龙刀不要奢望一篇文章可以走遍天下这里只是提供一个具体的落地方案一个具体的技术选型阶段代码仓库关于代码仓库本文选取的方案是 本文的目的:最主要是备忘, 其次是分享 疗效: 并不能让你一下子掌握CI/CD, 这只是一个比较完整的解决方案,其他基础知识,自行补充. 基调...
摘要:我一直在寻找尽可能小的容器入手,并且发现了一个镜像是完美的,真正的完美它简洁,小巧以及快速。所以这可能就是最小的镜像。尽管如此,这样看起来会很复杂并且导致容器很大。 注:本文由 Adriaan de Jonge 编写,本文的原文地址为 Create The Smallest Possible Docker Container 当我们在使用 Docker 的时候,你会很快注意到...
阅读 1147·2021-11-24 10:43
阅读 3102·2021-11-22 09:34
阅读 3549·2021-10-08 10:04
阅读 3931·2021-09-23 11:58
阅读 3114·2019-08-30 15:44
阅读 483·2019-08-30 13:01
阅读 1155·2019-08-28 18:07
阅读 1447·2019-08-26 13:42