本文转载自Docker Tips: 关于/var/run/docker.sock

导语

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


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

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

然后我们可以通过本地9000端口来访问图形界面,可以管理我们的container,images,volumes等等

为了做到以上所有的管理功能,Portainer与本地Docker进程进行通信就是通过挂载/var/run/docker.sock文件来实现的。

Docker daemon API

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

-H unix:///var/run/docker.sock

Notes: 由于-H参数的提供,Docker守护进程还可以监听tcp 主机/端口或者其他的Unix sockets

所有HTTP接口定义在Docker engine API v1.27。所有接口的底层通信都是通过Unix socket。

Container Creation

通过Portainer界面,我们可以轻松的运行container。在引擎后面,Http请求通过docker.socket发送到Docker进程。

下面来演示一下这个以及通过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//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上使用。

Docker Tips: 关于/var/run/docker.sock的更多相关文章

  1. docker dial unix /var/run/docker.sock: connect: permission denied

    Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker. ...

  2. 关于/var/run/docker.sock

    译者按: 这篇博客介绍了什么是/var/run/docker.sock,以及如何使用/var/run/docker.sock与Docker守护进程通信,并且提供了两个简单的示例.理解这些,我们就可以运 ...

  3. 输入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 ...

  4. 安装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 ...

  5. 【转载】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 ...

  6. 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 ...

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

  8. 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 ...

  9. 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? 是由 ...

随机推荐

  1. spring MVC 3.2中@ResponseBody(Post接口)返回乱码的完美解决方案

    本来因为ajax跨域http远程调用时有问题,在服务端响应时用以下方式解决了,但IE8及下有问题. response.addHeader("Access-Control-Allow-Orig ...

  2. Selenium爬虫实践(踩坑记录)之ajax请求抓包、浏览器退出

    上一篇: 使用Selenium截取网页上的图片 前言 最近在搞公司内部系统,累的一批,需要从另一个内部系统导出数据存到数据库做分析,有大量的数据采集工作,又没办法去直接拿到那个系统的接口,太难了,只能 ...

  3. redis分布式锁的这些坑,我怀疑你是假的开发

    摘要:用锁遇到过哪些问题? 一.白话分布式 什么是分布式,用最简单的话来说,就是为了较低单个服务器的压力,将功能分布在不同的机器上面:就比如: 本来一个程序员可以完成一个项目:需求->设计-&g ...

  4. 2019牛客暑期多校训练营(第十场)B-Coffee Chicken

    >传送门< 题意:S(1)="COFFEE",S(2)="CHICKEN" ,S(n) = S(n−2)+S(n−1),请输出 S(n) 中从第 k ...

  5. 2019牛客暑期多校训练营(第八场)A.All-one Matrices(dp)

    题意:又是最大01矩阵的模型了 这次要找的是极大0/1矩阵的个数 思路:我们像处理最大01矩阵那样处理一下边界 由于我们上左右已经无法再继续扩展 我们只需要用前缀和记录一下是否可以向下扩展(即判断当前 ...

  6. codeforces578C. Weakness and Poorness

    time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...

  7. F(x) HDU - 4734

    题意: 给你一个n位的数x(A(n)A(n-1)...A(1)),那么F(x)=A(n)*2^(n-1)+A(n-1)*2^(n-2)......+A(1)*2^(0) 题目输入A.B 你需要找出来在 ...

  8. 获取txt编码方式

    在操作txt的时候,有时会出现乱码,这是因为没有使用正确的编码方式来操作txt,我们需要先获取txt的编码方式,再进行读写操作.下面是获取txt编码的方法: /// <summary> / ...

  9. spring再学习之AOP事务

    spring中的事务 spring怎么操作事务的: 事务的转播行为: 事务代码转账操作如下: 接口: public interface AccountDao { //加钱 void addMoney( ...

  10. markdown嵌入图片

    这里嵌入指不会因为本地文件丢失而丢失. 参考:https://blog.csdn.net/testcs_dn/article/details/78952358 https://blog.csdn.ne ...