Docker Tips: 关于/var/run/docker.sock

原文:medium.com/better-prog…nginx

你keneng1已经运行过docker hub上的container而且注意到其中的一些须要绑定挂载(mount)/var/run/docker.sock文件。这个文件是什么呢,为何有些时候会被container所用到?剪短的回答:这个是Unix socket,Docker进程默认监听文件,为进行container进程间通讯所用。docker


咱们先来看看Portainer,是一个用于管理docker host或者Swarm集群的开源工具。若是用来管理本地Docker host Protaner能够用如下命令运行,绑定挂载到本地的docker的Unix socket上json

$ docker container run -d \
  -p 9000:9000 \
  -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer
复制代码

而后咱们能够经过本地9000端口来访问图形界面,能够管理咱们的container,images,volumes等等api

为了作到以上全部的管理功能,Portainer与本地Docker进程进行通讯就是经过挂载/var/run/docker.sock文件来实现的。bash

Docker daemon API

当Docker在主机上安装之后,Docker守护进程监听默认监听/var/run/docker.sock文件。固然这个路径是能够设置的,经过-H参数app

-H unix:///var/run/docker.sock
复制代码

Notes: 因为-H参数的提供,Docker守护进程还能够监听tcp 主机/端口或者其余的Unix socketscurl

全部HTTP接口定义在 Docker engine API v1.27。全部接口的底层通讯都是经过Unix socket。socket

Container Creation

经过Portainer界面,咱们能够轻松的运行container。在引擎后面,Http请求经过docker.socket发送到Docker进程。tcp

下面来演示一下这个以及经过curl建立一个Nginx containue工具

Notes: 当使用HTTP API,运行container须要两步,首先要先建立conatiner而后启动。

建立一个Nginx Container

下面命令使用curl发送{“Image”:”nginx”}请求体经过Unix socket发送到到Docker进程的接口/containers/create。最终会建立一个Nginx的container而且会返回他的ID。

$ curl -XPOST --unix-socket /var/run/docker.sock -d '{"Image":"nginx"}' -H 'Content-Type: application/json' http://localhost/containers/create

{"Id":"fcb65c6147efb862d5ea3a2ef20e793c52f0fafa3eb04e4292cb4784c5777d65","Warnings":null}
复制代码

启动Container

经过返回的ID,咱们能够经过 /containers/<ID>/start 来运行刚刚新建立的container

$ curl -XPOST --unix-socket /var/run/docker.sock http://localhost/containers/fcb6...7d65/start
复制代码

咱们能够看到Nginx container就被启起来而且正在运行状态

$ docker container 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套接字轻松地从容器内部建立容器。 显然,他实际并非经过curl建立容易的,只是我这么演示能更方便读者理解。

Docker进程的Streaming events

Docker API暴露一个/events 的接口,能够用来获取全部Docker进程生成的事件流,举个例子,他能够用来经过负载匀衡去建立或者删除container的事件,以便动态地更新他的配置。

跑一个简单的container而且检查一下咱们如何使用docker进程事件

Apline container

下面命令会以交互模式启动一个Apline container并绑定docker.sock

$ docker run -v /var/run/docker.sock:/var/run/docker.sock -ti alpine sh
复制代码

监听docker进程的事件

在Apline container内部,咱们首先经过apk安装curl

$ apk update && apk add curl
复制代码

如今能够经过docker socket发送HTTP请求到/events接口。命令会被挂起,等待新的事件从进程中进来。每一个新的事件都会是一个来自docker进程的事件流。

curl --unix-socket /var/run/docker.sock http://localhost/events
复制代码

观察事件

咱们建立了一个新的基于Nginx的container,而后监听他,经过Apline container的标准输出,这个事件由Docker进程生成。

docker container run -p 8080:80 -d nginx
复制代码

咱们能够观察到以前的请求会接收到一系列的事件

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

{
  "status": "create",
  "id": "277786a066994b4d842dc097c4544e2ddcf50ffe0b6aa8352812ca0aadec4078",
  "from": "nginx",
  "Type": "container",
  "Action": "create",
  "Actor": {
    "ID": "277786a066994b4d842dc097c4544e2ddcf50ffe0b6aa8352812ca0aadec4078",
    "Attributes": {
      "image": "nginx",
      "name": "hardcore_carson"
    }
  },
  "time": 1491683503,
  "timeNano": 1491683503003280100
}
{
  "Type": "network",
  "Action": "connect",
  "Actor": {
    "ID": "18147ed9f4510d0149a0810916434df19b3d03f30e17ac4effcbcc1d2371ba97",
    "Attributes": {
      "container": "277786a066994b4d842dc097c4544e2ddcf50ffe0b6aa8352812ca0aadec4078",
      "name": "bridge",
      "type": "bridge"
    }
  },
  "time": 1491683503,
  "timeNano": 1491683503061245700
}
{
  "status": "start",
  "id": "277786a066994b4d842dc097c4544e2ddcf50ffe0b6aa8352812ca0aadec4078",
  "from": "nginx",
  "Type": "container",
  "Action": "start",
  "Actor": {
    "ID": "277786a066994b4d842dc097c4544e2ddcf50ffe0b6aa8352812ca0aadec4078",
    "Attributes": {
      "image": "nginx",
      "name": "hardcore_carson"
    }
  },
  "time": 1491683503,
  "timeNano": 1491683503389984300
}
复制代码

基本上,三个事件发生:

  • container的建立
  • 默认网桥的创建
  • container的启动

总结

我但愿快速解释能让你给/var/run/docker.sock文件有更好的理解以及他是如何被用来绑定container的。很明显,应用经过socket链接并非经过curl可是会用其余库来进行HTTP请求传输给Docker进程。

注意:Docker进程socket的绑定挂载给了container很大的力量去控制Docker进程。因此必须谨慎使用而且只在咱们能够信任的container上使用。

相关文章
相关标签/搜索