golang遠程操作docker api方式
golang遠程操作docker api
Docker 可以監(jiān)聽并處理 3 種 socket 形式的 API 請求,分別是unix(unix 域協(xié)議)、tcp(tcp 協(xié)議)和fd。
一般來說,在安裝好 docker 后,默認就已經(jīng)開啟了unix socket,并且我們在執(zhí)行需要有root權(quán)限或者docker用戶組成員才有權(quán)限訪問。例如:
curl --unix-socket /var/run/docker.sock http://docker/version
添加遠程 API 訪問接口
編輯 docker 守護進程的配置文件/lib/systemd/system/docker.service,找到運行主命令的那一行,其內(nèi)容大致為"ExecStart=/usr/bin/dockerd -H fd:// … "的那一行,給dockerd命令加參數(shù)-H tcp://0.0.0.0:2375,意思是在 2375 端口開放 API 訪問。
例如在我的設(shè)備上,配置文件相應(yīng)的那一行原本為
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
添加參數(shù)后變?yōu)?/p>
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375 --containerd=/run/containerd/containerd.sock
重新加載
systemctl daemon-reload # 重新加載守護進程配置 systemctl restart docker.service # 重啟 docker 服務(wù)
測試
comp@Linux system % docker -H tcp://192.168.64.7:2375 version Client: Cloud integration: v1.0.22 Version: 20.10.11 API version: 1.41 Go version: go1.16.10 Git commit: dea9396 Built: Thu Nov 18 00:36:09 2021 OS/Arch: darwin/arm64 Context: default Experimental: true
測試可以訪問
comp@Linux system % docker -H tcp://192.168.64.7:2375 images REPOSITORY TAG IMAGE ID CREATED SIZE gossh v01 fa111aaaec47 8 days ago 35.6MB <none> <none> 670ae487e585 8 days ago 35.6MB nginx latest eeb9db34b331 8 days ago 134MB httpd latest 1c2ff9e4eb7d 2 weeks ago 136MB arm64v8/alpine latest 8e1d7573f448 6 weeks ago 5.33MB alpine latest 8e1d7573f448 6 weeks ago 5.33MB
go 獲取啟動的容器
package main
import (
"context"
"fmt"
"github.com/docker/docker/api/types"
"github.com/docker/docker/client"
)
func main() {
ctx := context.Background()
//cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation(),
client.WithHost("tcp://192.168.64.7:2375"))
if err != nil {
panic(err)
}
containers, err := cli.ContainerList(ctx, types.ContainerListOptions{})
if err != nil {
panic(err)
}
for _, container := range containers {
fmt.Println(container.Names, container.Image, container.Ports, container.Status,
container.ImageID)
}
}

啟動一個容器
package main
import (
"context"
"fmt"
"io"
"os"
"github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/container"
"github.com/docker/docker/client"
)
func main() {
ctx := context.Background()
cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation(),
client.WithHost("tcp://192.168.64.7:2375"))
//cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
if err != nil {
panic(err)
}
imageName := "httpd:latest"
out, err := cli.ImagePull(ctx, imageName, types.ImagePullOptions{})
if err != nil {
panic(err)
}
defer out.Close()
io.Copy(os.Stdout, out)
resp, err := cli.ContainerCreate(ctx, &container.Config{
Image: imageName,
}, nil, nil, nil, "")
if err != nil {
panic(err)
}
if err := cli.ContainerStart(ctx, resp.ID, types.ContainerStartOptions{}); err != nil {
panic(err)
}
fmt.Println(resp.ID)
}

拉取鏡像
package main
import (
"context"
"io"
"os"
"github.com/docker/docker/api/types"
"github.com/docker/docker/client"
)
func main() {
ctx := context.Background()
cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation(),
client.WithHost("tcp://192.168.64.7:2375"))
//cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
if err != nil {
panic(err)
}
out, err := cli.ImagePull(ctx, "httpd:latest", types.ImagePullOptions{})
if err != nil {
panic(err)
}
defer out.Close()
io.Copy(os.Stdout, out)
}

官網(wǎng)參考
https://docs.docker.com/engine/api/sdk/examples/
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
windows下使用GoLand生成proto文件的方法步驟
本文主要介紹了windows下使用GoLand生成proto文件的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
Go垃圾回收提升內(nèi)存管理效率優(yōu)化最佳實踐
這篇文章主要為大家介紹了Go垃圾回收提升內(nèi)存管理效率優(yōu)化最佳實踐,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12
四種Golang實現(xiàn)middleware框架的方式小結(jié)
middleware是一般框架里面常用的形式,比如web框架、rpc框架等,本文為大家詳細介紹了四種實現(xiàn)middleawre的方式,感興趣的可以了解一下2024-03-03
Golang中多個線程和多個協(xié)程的使用區(qū)別小結(jié)
本文主要介紹了Golang中多個線程和多個協(xié)程的使用區(qū)別小結(jié),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-06-06
Golang+Vue輕松構(gòu)建Web應(yīng)用的方法步驟
本文主要介紹了Golang+Vue輕松構(gòu)建Web應(yīng)用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05

