关于/var/run/docker.sock

译者按: 这篇博客介绍了什么是/var/run/docker.sock,以及如何使用/var/run/docker.sock与Docker守护进程通讯,而且提供了两个简单的示例。理解这些,咱们就能够运行一些可以管理Docker的Docker容器,好比Portainer、Kubernetes,是否是很神奇呢?javascript

原文: About /var/run/docker.sockjava

译者: Fundebugnginx

为了保证可读性,本文采用意译而非直译。docker

运行过Docker Hub的Docker镜像的话,会发现其中一些容器时须要挂载/var/run/docker.sock文件。这个文件是什么呢?为何有些容器须要使用它?简单地说,它是Docker守护进程(Docker daemon)默认监听的Unix域套接字(Unix domain socket),容器中的进程能够经过它与Docker守护进程进行通讯。json

图片来源: http://blog.honeybadger.ioubuntu

举例小程序

不妨看一下 [Portainer](http://portainer.io/),它提供了图形化界面用于管理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)...api

Portainer经过绑定的/var/run/docker.sock文件与Docker守护进程通讯,执行各类管理操做。ruby

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/<ID>/start接口,便可启动新建立的容器。

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 sh

2. 监听Docker守护进程的事件流

在alpine容器内,能够经过Docker套接字发送HTTP请求到/events接口。这个命令会一直等待Docker daemon的事件。当新的事件发生时(例如建立了新的容器),会看到输出信息。

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

3. 观察事件

基于Nginx镜像运行容器以后,经过aplpine容器的标准输出能够观察到Docker daemon生成的事件。

docker run -p 8080:80 -d nginx

能够观察到3个事件:

- 建立容器
- 链接默认的桥接网络(bridge network)
- 启动容器

结论

但愿这些简单的解释能够帮助你们理解/var/run/docker.sock文件,而且明白它绑定到容器时有何做用。显然,真正的应用会使用代码而不是curl命令给Docker守护进程发送HTTP请求。

注意: 绑定Docker套接字以后,容器的权限会很高,能够控制Docker守护进程。所以,这一点必须谨慎使用,只能用于足够信任的容器。

 

关于Fundebug

Fundebug专一于JavaScript、微信小程序、微信小游戏、支付宝小程序、React Native、Node.js和Java实时BUG监控。
自从2016年双十一正式上线,Fundebug累计处理了6亿+错误事件,获得了Google、360、金山软件等众多知名用户的承认。欢迎免费试用!

 

版权声明:


转载时请注明做者Fundebug以及本文地址:
https://blog.fundebug.com/2017/04/17/about-docker-sock/

相关文章
相关标签/搜索