zoukankan      html  css  js  c++  java
  • Docker Tips: 关于/var/run/docker.sock

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

    导语

    img

    你可能已经运行过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等等

    img

    为了做到以上所有的管理功能,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上使用。

  • 相关阅读:
    问题事件名称 clr20r3
    DataTable.Compute()用法
    XmlDocument.LoadXml(string) 转换问题
    反射原理读取对象属性并设置属性值
    读取XML某一个节点 条件筛选
    linq 对象属性排序
    winform与webbrowse之间的交互
    Linux(CentOS)下安装NVIDIA GPU驱动
    基于英伟达GPU训练TensorFlow模型
    基于Hadoop伪分布式模式集群搭建Spark环境
  • 原文地址:https://www.cnblogs.com/yungyu16/p/12989953.html
Copyright © 2011-2022 走看看