Golang 本地或遠程雲服務器Docker操作


本地操作Docker

環境准備

安裝 SDK

$ go get github.com/docker/docker/client

初始化客戶端對象

使用如下方式直接連接本地的 Docker Daemon,不需要過多配置,直接用環境變量的參數初始化客戶端即可。

// NewEnvClient 直接使用環境變量中的 DOCKER_HOST, DOCKER_TLS_VERIFY, DOCKER_CERT_PATH, DOCKER_API_VERSION 配置
c, err := client.NewEnvClient()

完整代碼

開啟一個MongoDB鏡像容器,5s后刪除該容器

package main

import (
	"context"
        "fmt"
	"github.com/docker/docker/api/types"
	"github.com/docker/docker/api/types/container"
	"github.com/docker/docker/client"
	"github.com/docker/go-connections/nat"
        "time"
)

func main() {
	c, err := client.NewEnvClient()
	if err != nil {
		panic(err)
	}
	ctx := context.Background()
	resp, err := c.ContainerCreate(ctx,
		&container.Config{
			Image: "mongo:latest",
			ExposedPorts: nat.PortSet{
				"27017/tcp": {},  //要暴露的端口
			},
		},
		&container.HostConfig{
			PortBindings: nat.PortMap{
				"27017/tcp": []nat.PortBinding{ //容器端口
					{
						HostIP:   "0.0.0.0",
						HostPort: "0",  //宿主機端口, 0代表隨機端口
					},
				},
			},
		}, nil, nil, "")
	if err != nil {
		panic(err)
	}
	err = c.ContainerStart(ctx, resp.ID, types.ContainerStartOptions{})
	if err != nil {
		panic(err)
	}
        fmt.Println("container started")
	time.Sleep(5*time.Second)
	inspectRes, err := c.ContainerInspect(ctx, resp.ID)
	if err != nil {
		panic(err)
	}
	fmt.Printf("listening at %+v\n",inspectRes.NetworkSettings.Ports["27017/tcp"][0])//查看當前所監聽的IP端口信息
	fmt.Println("killing container")
	err = c.ContainerRemove(ctx, resp.ID, types.ContainerRemoveOptions{
		Force: true,	//停掉容器
	})	//刪除該Docker容器
	if err != nil {
		panic(err)
	}
}

遠程操作雲服務器Docker

前提

遠程操作前提下需要進行配置免密登錄,請參考我另一篇博客VSCode搭建遠程服務器開發Ubuntu第一小節部分, 其次要先在雲服務器上把鏡像docker pull xxx拉取下來

准備好以上重要操作,就可以進行下面的操作,否則會報錯返回錯誤信息

環境准備

安裝 SDK

$ go get github.com/docker/cli/cli/connhelper
$ go get github.com/docker/docker/client

初始化 Docker 客戶端

不再使用環境變量默認的配置,而是通過配置參數的方式初始化 Docker 客戶端,同時指定連接的 HTTP 客戶端和上下文等信息。這樣當嘗試連接遠程服務器的 Docker Daemon 時,connhelper 就會自動完成 ssh key 的驗證操作

helper, _ := connhelper.GetConnectionHelper("ssh://Username@IP:22")
httpClient := &http.Client{
    Transport: &http.Transport{
        DialContext: helper.Dialer,
    },
}
c, err := client.NewClientWithOpts(
    client.WithHTTPClient(httpClient),
    client.WithHost(helper.Host),
    client.WithDialContext(helper.Dialer),
)

完整代碼

開啟一個MongoDB鏡像容器,5s后刪除該容器

package main

import (
	"context"
        "fmt"
	"github.com/docker/cli/cli/connhelper"
	"github.com/docker/docker/api/types"
	"github.com/docker/docker/api/types/container"
	"github.com/docker/docker/client"
	"github.com/docker/go-connections/nat"
	"net/http"
        "time"
)

func main() {
	helper, _ := connhelper.GetConnectionHelper("ssh://username@IP:22")
	httpClient := &http.Client{
		Transport: &http.Transport{
			DialContext: helper.Dialer,
		},
	}
	c, err := client.NewClientWithOpts(
		client.WithHTTPClient(httpClient),
		client.WithHost(helper.Host),
		client.WithDialContext(helper.Dialer),
	)
	ctx := context.Background()
	resp, err := c.ContainerCreate(ctx,
		&container.Config{
			Image: "mongo:latest",
			ExposedPorts: nat.PortSet{
				"27017/tcp": {},  //要暴露的端口
			},
		},
		&container.HostConfig{
			PortBindings: nat.PortMap{
				"27017/tcp": []nat.PortBinding{  //容器端口
					{
						HostIP:   "0.0.0.0",
						HostPort: "0",  //宿主機端口, 0代表隨機端口
					},
				},
			},
		}, nil, nil, "")
	if err != nil {
		panic(err)
	}
	err = c.ContainerStart(ctx, resp.ID, types.ContainerStartOptions{})
	if err != nil {
		panic(err)
	}
        fmt.Println("container started")
	time.Sleep(5*time.Second)
	inspectRes, err := c.ContainerInspect(ctx, resp.ID)
	if err != nil {
		panic(err)
	}
	fmt.Printf("listening at %+v\n",inspectRes.NetworkSettings.Ports["27017/tcp"][0])//查看當前所監聽的IP端口信息
	fmt.Println("killing container")
	err = c.ContainerRemove(ctx, resp.ID, types.ContainerRemoveOptions{
		Force: true,	//停掉容器
	})	//刪除該Docker容器
	if err != nil {
		panic(err)
	}
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM