美文网首页
通过 socket 访问 docker 的接口

通过 socket 访问 docker 的接口

作者: 追风骚年 | 来源:发表于2021-08-05 11:55 被阅读0次

由于 docker 是一个 cs 架构的设计,他后台会起一个服务,server 对外提供的是一个 socket 方式的访问入口,我们在终端使用 docker ps 等命令时,终端内的 docker 命令相当于一个客户端程序。

这里以 golang 程序为例,参考 docker 官方提供的技术文档。

package main

import (
    "context"
    "io/fs"
    "io/ioutil"
    "net"
    "net/http"
    "testing"
)

func getDockerClient() http.Client {
    return http.Client{
        Transport: &http.Transport{
            DialContext: func(_ context.Context, _, _ string) (net.Conn, error) {
                // /var/run/docker.sock 为 docker 对外提供的 socket 路径
                return net.Dial("unix", "/var/run/docker.sock")
            },
        },
    }
}

func TestDockerPs(t *testing.T) {
    client := getDockerClient()
    resp, err := client.Get("http://docker.sock/containers/json") // 这里的 host 没有意义,可以随便填

    if err != nil {
        t.Fatal(err)
    }
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        t.Fatal(err)
    }
    t.Log(string(body))
}

func TestDockerInspect(t *testing.T) {
    client := getDockerClient()

    resp, err := client.Get("http://docker.sock/containers/0b3606c482d4/json")

    if err != nil {
        t.Fatal(err)
    }
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        t.Fatal(err)
    }

    t.Log(string(body))
}

func TestDockerExport(t *testing.T) {
    client := getDockerClient()
    resp, err := client.Get("http://docker.sock/containers/0b3606c482d4/export")

    if err != nil {
        t.Fatal(err)
    }

    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        t.Fatal(err)
    }

    err = ioutil.WriteFile("0b3606c482d4.tar", body, fs.ModePerm)
    if err != nil {
        t.Fatal(err)
    }
}

通过测试可以发现 socket 访问程序速度非常快,有网友测试通过 socket 比普通的 tcp 请求快 15% 左右。

参考文档

相关文章

  • 通过 socket 访问 docker 的接口

    由于 docker 是一个 cs 架构的设计,他后台会起一个服务,server 对外提供的是一个 socket ...

  • 2019-11-28,socket --- 底层网络接口

    socket --- 底层网络接口源代码: Lib/socket.py 这个模块提供了访问BSD套接字的接口。在所...

  • Got permission denied while tryi

    非root用户在执行 docker ps报如下错误 原因:访问unix socket需要root权限docker启...

  • java socket学习

    Socket(套接字) socket是处在应用层之下、传输层之上的接口层,它是操作系统提供用户访问网络的接口,借助...

  • 浅谈linux中的网络

    linux网络栈和tcp/ip 简单的来说,socket就是对tcp/ip的api接口。通过socket接口,两个...

  • 二十四:Python之socket

    socket:通过网络完成进程间通信的方式,socket也被称作 ‘套接字’ Socket本质是编程接口(API)...

  • 使用 SSH 隧道连接远端 Docker Daemon

    通常来说,docker daemon 只能通过 unix domain socket 进行连接,但是通过 SSH ...

  • socket到底是什么

    socket是对TCP/UDP协议的封装的接口,socket本身并不是协议。Http是基于socket之上的,通过...

  • iOS中的Socket的使用

    Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,...

  • iOS中socket使用

    Socket是对TCP/IP协议的封装,Socket本身并不是协议, 而是一个调用接口(API),通过Socket...

网友评论

      本文标题:通过 socket 访问 docker 的接口

      本文链接:https://www.haomeiwen.com/subject/irjmvltx.html