我需要创建一个docker(1.13)容器,该容器将作为服务在docker群中运行以调度作业(例如在需要时执行“docker exec”的整个Swarm范围的crontab)。
我是一个相当系统管理员的人,而不是真正的编码人员,所以我开始使用bash,curl和jq进行操作。
它可以工作,但是肯定还有改进的空间。

为了让您了解我正在处理的Mumbo-jumpo,以下是我传递给docker套接字以查找服务运行位置的一些摘录:

# Get local docker node ID:
curl -s --unix-socket /var/run/docker.sock http:/v1.26/info | jq -r '.Name + " " + .Swarm.NodeID'

# List swarm node ID's:
curl -s --unix-socket /var/run/docker.sock http:/v1.26/nodes | jq -r '.[] | .Description.Hostname + " " + .ID'

# List swarm services:
curl -s --unix-socket /var/run/docker.sock http:/v1.26/nodes | jq -r '.[] | .Description.Hostname + " " + .ID'

# List running tasks:
curl -s --unix-socket /var/run/docker.sock http:/v1.26/tasks | jq -r '.[] | select( .Status.State | contains("running")) | .NodeID + " " + .ServiceID + " " + .ID + " " + .Status.State'

我想用 golang 做得更好。

我了解与TCP套接字通话时http.Get的工作原理:
res, err := http.Get(url)
body, err := ioutil.ReadAll(res.Body)
err = json.Unmarshal(body, &p)
// p is then populated with the content of my request

但是我该如何处理unix文件袋(/var/run/docker.sock)?我假设我必须使用 net.DialUnix ,但到目前为止无法正常工作。

任何想法或建议都欢迎。

最佳答案

试试这个:

package main

import (
    "fmt"
    "net"
    "log"
    "bufio"

)

func main() {
    conn, err := net.Dial("unix", "/var/run/docker.sock")

    if err != nil {
        panic(err)
    }
    fmt.Fprintf(conn, "GET /images/json HTTP/1.0\r\n\r\n")
    status, err := bufio.NewReader(conn).ReadString('\t')
    if err != nil {
        log.Println(err)
    }

    fmt.Print("Message from server: "+status)
}

另一种方法:

使用docker SDK,可用于python,go和其他一些语言。

关于sockets - 有没有一种直接的方法可以从Go中的unix套接字获取html响应(像curl一样)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42636989/

10-12 22:31
查看更多