本地操作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)
}
}