日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

使用Golang玩轉Docker API的實踐

瀏覽:259日期:2024-10-29 08:20:25

Docker 提供了一個與 Docker 守護進程交互的 API (稱為Docker Engine API),我們可以使用官方提供的 Go 語言的 SDK 進行構建和擴展 Docker 應用程序和解決方案。

安裝 SDK

通過下面的命令就可以安裝 SDK 了:

go get github.com/docker/docker/client管理本地的 Docker

該部分會介紹如何使用 Golang + Docker API 進行管理本地的 Docker。

運行容器

第一個例子將展示如何運行容器,相當于 docker run docker.io/library/alpine echo 'hello world':

package mainimport ( 'context' 'io' 'os' 'github.com/docker/docker/api/types' 'github.com/docker/docker/api/types/container' 'github.com/docker/docker/client' 'github.com/docker/docker/pkg/stdcopy')func main() { ctx := context.Background() cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) if err != nil { panic(err) } reader, err := cli.ImagePull(ctx, 'docker.io/library/alpine', types.ImagePullOptions{}) if err != nil { panic(err) } io.Copy(os.Stdout, reader) resp, err := cli.ContainerCreate(ctx, &container.Config{ Image: 'alpine', Cmd: []string{'echo', 'hello world'}, }, nil, nil, '') if err != nil { panic(err) } if err := cli.ContainerStart(ctx, resp.ID, types.ContainerStartOptions{}); err != nil { panic(err) } statusCh, errCh := cli.ContainerWait(ctx, resp.ID, container.WaitConditionNotRunning) select { case err := <-errCh: if err != nil { panic(err) } case <-statusCh: } out, err := cli.ContainerLogs(ctx, resp.ID, types.ContainerLogsOptions{ShowStdout: true}) if err != nil { panic(err) } stdcopy.StdCopy(os.Stdout, os.Stderr, out)}后臺運行容器

還可以在后臺運行容器,相當于 docker run -d bfirsh/reticulate-splines:

package mainimport ( '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()) if err != nil { panic(err) } imageName := 'bfirsh/reticulate-splines' out, err := cli.ImagePull(ctx, imageName, types.ImagePullOptions{}) if err != nil { panic(err) } io.Copy(os.Stdout, out) resp, err := cli.ContainerCreate(ctx, &container.Config{ Image: imageName, }, nil, nil, '') if err != nil { panic(err) } if err := cli.ContainerStart(ctx, resp.ID, types.ContainerStartOptions{}); err != nil { panic(err) } fmt.Println(resp.ID)}查看容器列表

列出正在運行的容器,就像使用 docker ps 一樣:

package mainimport ( '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()) if err != nil { panic(err) } containers, err := cli.ContainerList(ctx, types.ContainerListOptions{}) if err != nil { panic(err) } for _, container := range containers { fmt.Println(container.ID) }}

如果是 docker ps -a,我們可以通過修改 types.ContainerListOptions 中的 All 屬性達到這個目的:

// type ContainerListOptions struct {// Quiet bool// Size bool// All bool// Latest bool// Since string// Before string// Limit int// Filters filters.Args// }options := types.ContainerListOptions{ All: true,}containers, err := cli.ContainerList(ctx, options)if err != nil { panic(err)}停止所有運行中的容器

通過上面的例子,我們可以獲取容器的列表,所以在這個案例中,我們可以去停止所有正在運行的容器。

注意:不要在生產服務器上運行下面的代碼。

package mainimport ( '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()) if err != nil { panic(err) } containers, err := cli.ContainerList(ctx, types.ContainerListOptions{}) if err != nil { panic(err) } for _, container := range containers { fmt.Print('Stopping container ', container.ID[:10], '... ') if err := cli.ContainerStop(ctx, container.ID, nil); err != nil { panic(err) } fmt.Println('Success') }}獲取指定容器的日志

通過指定容器的 ID,我們可以獲取對應 ID 的容器的日志:

package mainimport ( '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()) if err != nil { panic(err) } options := types.ContainerLogsOptions{ShowStdout: true} out, err := cli.ContainerLogs(ctx, 'f1064a8a4c82', options) if err != nil { panic(err) } io.Copy(os.Stdout, out)}查看鏡像列表

獲取本地所有的鏡像,相當于 docker image ls 或 docker images:

package mainimport ( '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()) if err != nil { panic(err) } images, err := cli.ImageList(ctx, types.ImageListOptions{}) if err != nil { panic(err) } for _, image := range images { fmt.Println(image.ID) }}拉取鏡像

拉取指定鏡像,相當于 docker pull alpine:

package mainimport ( '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()) if err != nil { panic(err) } out, err := cli.ImagePull(ctx, 'alpine', types.ImagePullOptions{}) if err != nil { panic(err) } defer out.Close() io.Copy(os.Stdout, out)}拉取私有鏡像

除了公開的鏡像,我們平時還會用到一些私有鏡像,可以是 DockerHub 上私有鏡像,也可以是自托管的鏡像倉庫,比如 harbor。這個時候,我們需要提供對應的憑證才可以拉取鏡像。

值得注意的是:在使用 Docker API 的 Go SDK 時,憑證是以明文的方式進行傳輸的,所以如果是自建的鏡像倉庫,請務必使用 HTTPS!

package mainimport ( 'context' 'encoding/base64' 'encoding/json' '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()) if err != nil { panic(err) } authConfig := types.AuthConfig{ Username: 'username', Password: 'password', } encodedJSON, err := json.Marshal(authConfig) if err != nil { panic(err) } authStr := base64.URLEncoding.EncodeToString(encodedJSON) out, err := cli.ImagePull(ctx, 'alpine', types.ImagePullOptions{RegistryAuth: authStr}) if err != nil { panic(err) } defer out.Close() io.Copy(os.Stdout, out)}保存容器成鏡像

我們可以將一個已有的容器通過 commit 保存成一個鏡像:

package mainimport ( 'context' 'fmt' '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()) if err != nil { panic(err) } createResp, err := cli.ContainerCreate(ctx, &container.Config{ Image: 'alpine', Cmd: []string{'touch', '/helloworld'}, }, nil, nil, '') if err != nil { panic(err) } if err := cli.ContainerStart(ctx, createResp.ID, types.ContainerStartOptions{}); err != nil { panic(err) } statusCh, errCh := cli.ContainerWait(ctx, createResp.ID, container.WaitConditionNotRunning) select { case err := <-errCh: if err != nil { panic(err) } case <-statusCh: } commitResp, err := cli.ContainerCommit(ctx, createResp.ID, types.ContainerCommitOptions{Reference: 'helloworld'}) if err != nil { panic(err) } fmt.Println(commitResp.ID)}管理遠程的 Docker

當然,除了可以管理本地的 Docker, 我們同樣也可以通過使用 Golang + Docker API 管理遠程的 Docker。

遠程連接

默認 Docker 是通過非網絡的 Unix 套接字運行的,只能夠進行本地通信(/var/run/docker.sock),是不能夠直接遠程連接 Docker 的。我們需要編輯配置文件 /etc/docker/daemon.json,并修改以下內容(把 192.168.59.3 改成你自己的 IP 地址),然后重啟 Docker:

# vi /etc/docker/daemon.json{ 'hosts': [ 'tcp://192.168.59.3:2375', 'unix:///var/run/docker.sock' ]}systemctl restart docker修改 client

創建 client 的時候需要指定遠程 Docker 的地址,這樣就可以像管理本地 Docker 一樣管理遠程的 Docker 了:

cli, err = client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation(), client.WithHost('tcp://192.168.59.3:2375'))總結

現在已經有很多可以管理 Docker 的產品,它們便是這樣進行實現的,比如:portainer。

到此這篇關于使用Golang玩轉Docker API的實踐的文章就介紹到這了,更多相關Golang運行Docker API內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Docker
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
蜜桃久久av一区| 国产亚洲人成a在线v网站| 日韩一区二区在线免费| 精品免费av在线| 日韩午夜av在线| 午夜久久av| 欧美激情福利| 久久视频一区| 综合激情网...| 国产精品一区二区av日韩在线| 欧美国产先锋| 欧美日韩在线二区| 日韩av三区| 国产高潮在线| 伊人国产精品| 国产亚洲电影| 久久精品国内一区二区三区水蜜桃| 丝袜a∨在线一区二区三区不卡| 欧美日本不卡高清| 国产亚洲一区二区手机在线观看| 久久亚洲二区| 精品一区二区三区免费看| 亚洲精品2区| 国产日本亚洲| 狠狠久久婷婷| 精品一区二区三区中文字幕视频 | 久久中文字幕av| 亚洲精品高潮| 国产美女高潮在线| 亚洲免费专区| 国产精品久久久久蜜臀| 中文不卡在线| 四虎4545www国产精品| 日韩精品a在线观看91| 日韩欧美一区二区三区免费看| 最近国产精品视频| 久久久国产亚洲精品| 欧美一级二级视频| 美女一区网站| 欧美一区成人| 午夜日韩在线| 黄色亚洲在线| 久久蜜桃精品| 日韩国产欧美一区二区三区| 水蜜桃精品av一区二区| 视频在线在亚洲| 精品美女在线视频| 国产精品日韩| 久草精品视频| 在线视频免费在线观看一区二区| 精品国产午夜| 欧美在线黄色| 99国产精品久久久久久久| 欧美日韩亚洲一区三区| 亚洲免费影视| 日本欧美不卡| 成人在线免费观看网站| 欧美一区激情| 亚洲人成亚洲精品| 在线一区免费| 久久久久免费av| 国产不卡精品| 国产精品日韩精品中文字幕| 视频在线观看一区二区三区| 欧美日韩中文一区二区| 成人国产精品一区二区免费麻豆| 日本99精品| 在线精品视频一区| 久久国产成人午夜av影院宅| 国产一区二区三区四区二区| 国产女人18毛片水真多18精品| 亚洲三级毛片| 一区二区三区四区日韩| 婷婷激情综合| 亚洲黑丝一区二区| av在线日韩| 欧美激情另类| 久久精品国产网站| 欧美经典一区| 欧美视频一区| 欧美在线91| 欧美一区91| 欧美在线看片| 日本一区中文字幕| 伊人久久大香伊蕉在人线观看热v| 91久久久精品国产| 美女网站一区| 亚洲精品中文字幕乱码| 国产在线成人| 91精品观看| 五月精品视频| 99视频在线精品国自产拍免费观看| 久久久久国产| 女人av一区| 樱桃成人精品视频在线播放| 亚洲精品在线观看91| 黄色亚洲大片免费在线观看| 日韩一区二区免费看| 欧美日韩视频| 久久国产成人| 一级欧美视频| 日韩高清三区| 国产精品对白| 成人在线丰满少妇av| 久久中文字幕导航| 国产精品成久久久久| 亚洲国产福利| 999国产精品视频| 婷婷色综合网| 亚洲最新av| 欧美日一区二区三区在线观看国产免| 91嫩草精品| 久久精品资源| 在线人成日本视频| 亚洲小说欧美另类婷婷| 亚洲免费影院| 欧美中文高清| 国产精品二区不卡| 欧美日韩国产在线一区| 亚洲人成亚洲精品| 久久99久久久精品欧美| 午夜精品成人av| 在线综合亚洲| 91成人福利| 在线手机中文字幕| 在线视频精品| 欧美日韩亚洲国产精品| 97人人精品| 精品一区欧美| 日韩一区二区三区在线看| 国产劲爆久久| 极品日韩av| 亚洲一级大片| 嫩呦国产一区二区三区av| 黑人精品一区| 天使萌一区二区三区免费观看| 日本va欧美va欧美va精品| 精品国产午夜| 夜夜嗨网站十八久久| 国产精品一区亚洲| 日韩不卡在线| 亚洲tv在线| 日韩综合在线| 亚洲视频播放| 国产欧美欧美| 久久精品国产99久久| 日韩区欧美区| 日韩免费福利视频| 一区二区电影| 亚洲欧洲美洲av| 亚洲综合专区| 国产黄大片在线观看| 久久www成人_看片免费不卡| 国产精品亚洲人成在99www| 成人啊v在线| 日韩区一区二| 欧美一区二区性| 三级亚洲高清视频| 欧美xxxx性| 视频一区中文字幕国产| 国产一区二区久久久久| 免费视频久久| 91亚洲国产成人久久精品| 亚洲图片久久| 久久久久久久久99精品大| 欧美日韩一区二区三区不卡视频| 影视先锋久久| 日韩中文字幕1| 欧洲精品一区二区三区| 女人天堂亚洲aⅴ在线观看| 欧美在线看片| 欧洲亚洲一区二区三区| 男女男精品网站| 国产一区二区三区四区大秀| 国产99在线| 91精品在线免费视频| 欧美亚洲国产精品久久| 国产极品嫩模在线观看91精品| 9色精品在线| 亚洲一区资源| 欧美精品国产| 快she精品国产999| 99久久www免费| 精品一级视频| 欧美日韩18| 一区二区三区四区精品视频| 久久亚洲成人| 国产成人精品一区二区三区视频| 伊人www22综合色| 激情丁香综合| 正在播放日韩精品| 你懂的国产精品永久在线| 亚洲免费毛片| 黄色av一区| 久久精品动漫| 97精品一区| 久久久亚洲欧洲日产| 日韩中文av| 石原莉奈一区二区三区在线观看| 国产在线成人|