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的更多相关文章
- 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. ...
- 关于/var/run/docker.sock
译者按: 这篇博客介绍了什么是/var/run/docker.sock,以及如何使用/var/run/docker.sock与Docker守护进程通信,并且提供了两个简单的示例.理解这些,我们就可以运 ...
- 输入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? 是由 ...
随机推荐
- Go语言学习笔记(2)——零散的话题(反射)
这部分是<Go语言编程>这本书的第9章的内容.书中给该章节的定位是一个文章集,其包含了一些Go语言中比较少涉及,或是比较深入的讨论的内容.因为第一节就是反射,而反射在我看来是比较重要的内容 ...
- SpringMVC传递JSON数据
文章目录 一.前后端传递和接收JSON数据 1:是要Ajax默认格式来传递数据(*) 2:使用application/json格式来传递数据 二.spring-web.xml中需要如下配置 一.前后端 ...
- JS 实现一个实时动态校验,将输入格式错误的显示为红色背景
功能描述: 源码: 功能描述: 实时动态校验,如果输入的格式错误,将弹窗提示输入格式错误并将背景展示为红色. 源码: 前台: <hy:formfield name="cxfdl&quo ...
- C链表-C语言入门经典例题
struct student { long num; float score; struct student *next; }; 注意:只是定义了一个struct student类型,并未实际分配存储 ...
- java调用shell脚本执行操作
//定时清空 日志 String shellString = "sh /home/jyapp/delete_log.sh"; Process process = Runtime.g ...
- Codeforces Round #673 (Div. 2) A. Copy-paste(贪心)
题目链接:https://codeforces.com/contest/1417/problem/A 题意 给出一个大小为 $n$ 的数组 $a$,每次操作可以选择两个数,然后将一个数加到另一个数上, ...
- 【bzoj 2038】 [2009国家集训队]小Z的袜子(算法效率--莫队分块算法 模版题)
题意:小Z有N只袜子,有不同的颜色.他有M个提问,问从编号为[L,R]的袜子中随机选一双同色的袜子的概率,用最简分数表示. 解法:经典的莫队算法--无修改.不强制在线(可离线).状态转移可以一步完成. ...
- 【noi 2.6_9267】核电站(DP)
题意:n个数中不能同时选连续m个或以上,问方案数. 解法:f[i][j]表示从前i个中选,到第i个已经连续选了j个.j!=0时, =f[i-1][j-1] ; j=0时, =f[i-1][0~m-1 ...
- 微服务架构学习Day01-SpringBoot入门
基本概念 SpringBoot的优点: 可以创建独立的Spring应用 SpringBoot嵌入Tomcat,Jetty和Unsertow, 不需要部署war文件 根据需要通过maven获取start ...
- [视频] 使用 JavaCV 来显示和保存来自摄像头的视频
目录 JavaCV 预览本机摄像头视频图像的简单实现 预览的同时,保存为FLV文件 JavaCV javacv开发包是用于支持java多媒体开发的一套开发包,可以适用于本地多媒体(音视频)调用以及音视 ...