关于/var/run/docker.sock
译者按: 这篇博客介绍了什么是/var/run/docker.sock,以及如何使用/var/run/docker.sock与Docker守护进程通信,并且提供了两个简单的示例。理解这些,我们就可以运行一些能够管理Docker的Docker容器,比如Portainer、Kubernetes,是不是很神奇呢?
原文: About /var/run/docker.sock
译者: [Fundebug](https://fundebug.com/)
为了保证可读性,本文采用意译而非直译。
运行过Docker Hub的Docker镜像的话,会发现其中一些容器时需要挂载**/var/run/docker.sock**文件。**这个文件是什么呢?为什么有些容器需要使用它?**简单地说,它是**Docker守护进程(Docker daemon)**默认监听的**Unix域套接字(Unix domain socket)**,容器中的进程可以通过它与Docker守护进程进行通信。

图片来源: [http://blog.honeybadger.io](http://blog.honeybadger.io/how-unicorn-talks-to-nginx-an-introduction-to-unix-sockets-in-ruby/)
### 举例
不妨看一下 [Portainer](http://portainer.io/),它提供了图形化界面用于管理Docker主机和Swarm集群。如果使用Portainer管理本地Docker主机的话,需要绑定**/var/run/docker.sock**:
```bash
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 ):
```bash
-H unix:///var/run/docker.sock
```
注: 监听网络TCP套接字或者其他套接字需要配置相应的**-H**选项。
[Docker engine API v1.27](https://docs.docker.com/engine/api/v1.27) (最新版)定义的所有HTTP接口都可以通过/var/run/docker.sock调用。
### 运行容器
使用Portainer的UI,可以轻松创建容器。实际上,HTTP请求是通过docker.sock发送给Docker守护进程的。可以通过[*curl*](https://curl.haxx.se/)创建容器来说明这一点。使用HTTP接口运行容器需要两个步骤,先创建容器,然后启动容器。
#### 1. 创建nginx容器
curl命令通过Unix套接字发送**{“Image”:”nginx”}**到Docker守护进程的**/containers/create**接口,这个将会基于Nginx镜像创建容器并返回容器的ID。
```bash
curl -XPOST --unix-socket /var/run/docker.sock -d ‘{“Image”:”nginx”}’ -H ‘Content-Type: application/json’ http://localhost/containers/create
```
输出返回了容器ID:
```javascript
{“Id”:”fcb65c6147efb862d5ea3a2ef20e793c52f0fafa3eb04e4292cb4784c5777d65",”Warnings”:null}
```
#### 2. 启动nginx容器
使用返回的容器ID,调用**/containers/<ID>/start**接口,即可启动新创建的容器。
```bash
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。
```bash
docker run -v /var/run/docker.sock:/var/run/docker.sock -ti alpine sh
```
#### 2. 监听Docker守护进程的事件流
在alpine容器内,可以通过Docker套接字发送HTTP请求到**/events**接口。这个命令会一直等待Docker daemon的事件。当新的事件发生时(例如创建了新的容器),会看到输出信息。
```bash
curl --unix-socket /var/run/docker.sock http://localhost/events
```
#### 3. 观察事件
基于Nginx镜像运行容器之后,通过aplpine容器的标准输出可以观察到Docker daemon生成的事件。
```bash
docker run -p 8080:80 -d nginx
```
可以观察到3个事件:
- 创建容器
- 连接默认的桥接网络(bridge network)
- 启动容器
### 结论
希望这些简单的解释可以帮助大家理解**/var/run/docker.sock**文件,并且明白它绑定到容器时有何作用。显然,真正的应用会使用代码而不是curl命令给Docker守护进程发送HTTP请求。
注意: 绑定Docker套接字之后,容器的权限会很高,可以控制Docker守护进程。因此,这一点必须谨慎使用,只能用于足够信任的容器。
欢迎加入[我们Fundebug](https://fundebug.com/)的**Docker技术交流群: 305097057**。

版权声明:
转载时请注明作者Fundebug以及本文地址:
https://blog.fundebug.com/2017/04/17/about-docker-sock/
关于/var/run/docker.sock的更多相关文章
- 输入docker ps 报错信息处理Get http:///var/run/docker.sock/v1.19/containers/json: dial unix /var/run/docker.sock: permission denied.
完整错误信息 Get http:///var/run/docker.sock/v1.19/containers/json: dial unix /var/run/docker.sock: permis ...
- 安装Docker时错误提示 "could not change group /var/run/docker.sock to docker: group docker not found"的解决方案
安装Dock服务,主要命令是 yum install docker. 但是在启动的时候报错:warning msg="could not change group /var/run/doc ...
- 【转载】Docker 安装后 报 Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? 解决办法
Docker Docker 安装后 报 Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docke ...
- docker启动失败(can't create unix socket /var/run/docker.sock: is a directory)
现象 # service docker start Redirecting to /bin/systemctl start docker.service Job for docker.service ...
- Cannot connect to the Docker daemon at unix:///var/run/docker.sock.问题解决
出现Cannot connect to the Docker daemon at unix:///var/run/docker.sock时,先用tail -5f /var/log/upstart/do ...
- Docker未启动错误:Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
此问题是因为Docker安装后未启动所致,执行以下命令启动docker: systemctl start docker.service 具体日志如下: Connecting to ... Connec ...
- Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? 是由 ...
- Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.38/images/json: dial unix /var/run/docker.sock: conne
使用docker报如下错误信息: Got permission denied while trying to connect to the Docker daemon socket at unix:/ ...
- docker 解决:Get http:///var/run/docker.sock/v1.19/version: dial unix /var/run/docker.sock: no such file or directory. Are you trying to connect to a TLS-enabled daemon without TLS?
docker 安装之后,通过命令查看docker相关信息时,可能会出现错误:Get http:///var/run/docker.sock/v1.19/version: dial unix /var/ ...
随机推荐
- select函数的用法
首先介绍阻塞方式与非阻塞方式: 阻塞方式(block),就是进程或是线程执行到这些函数时必须等待某个事件的发生.如果事件没有发生,进程或线程就被阻塞,函数不能立即返回. 非阻塞方式(non-block ...
- MySQL Sniffer
MySQL Sniffer 是360开源的一个基于 MySQL 协议的抓包工具, 能实时抓取客户端端请求,并格式化输出操作语句,操作十分简单.对于问题的定位,操作的审核是个不错的利器. Github地 ...
- String类的indexOf方法的用法和举例
2017年3月3号博主第一次去郑州互联网公司面试,背景是这样的我先前去了农大龙子湖校园招聘投简历,然后第二天去面试了那经历可以说是很失败的一次面试,当然这跟自己的水平有关了接下来重点讲一下面试的题目: ...
- JavaScript 图片轮播入门
轮播要求:一个在页面居中的矩形框,图片依次从矩形框中经过 当图片完整占满矩形框时 停留一小段时间再向左边移动经过矩形框的图片自动跑到右边最后一个图的后面.核心原理:在一个for循环中利用offsetl ...
- Unity获取安卓手机运营商,电量,wifi信号强度,本地Toast,获取已安装apk,调用第三方应用,强制自动重启本应用
一个完整的游戏项目上线需要不断的完善优化,但是到了后期的开发不再仅仅是游戏了,它的复杂度远远大于纯粹的应用开发.首先必须要考虑的就是集成第三方SDK,支付这块渠道商已经帮你我们做好了,只需要按照文档对 ...
- python实现TCP/UDP通信
一.说明 对于TCP/udp的说明已经很多了,我在这里只是简单的说明一下 二.套接字scoket 套接字是一种具有之前所说的"通信端点"概念的计算网络数据结构.相当于电话插口,没它 ...
- (14)jdk1.5开始的一些新特性:静态导入,增强for循环,可变参数,自动装箱/拆箱,枚举类型
Jdk1.5新特性之静态导入 jdk1.5新特性值静态导入 静态导入的作用:简化缩写 静态导入的作用:可以作用一个类的所有静态成员. 静态导入的格式:import static 包名.类名.静态的成员 ...
- 手动编写JQUERY插件
就拿一个简单的示例来说,鼠标点击输入框,提示文字消息,鼠标移开,再显示提示文字. <script type="text/javascript"> //编写插件 (fun ...
- 初见 ThreadLocal 类
这个类能够将一个对象和一个线程绑定起来. 之所以写这个类是因为 DBUtils 工具类,在 JavaEE 经典三层结构中对于事务的操作,不方便放在 DAO 层,因为具有侵入性,只适合放在 Servic ...
- Butter Knife使用详解
Butter Knife Github地址: https://github.com/JakeWharton/butterknife 官方说明给出的解释是 Bind Android views and ...