电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

使用Golang玩轉Docker API的實踐

瀏覽:118日期: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

創(chuàng)建 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內容請搜索好吧啦網以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Docker
相關文章:
主站蜘蛛池模板: 纸塑分离机-纸塑分离清洗机设备-压力筛-碎浆机厂家金双联环保 | 防爆正压柜厂家_防爆配电箱_防爆控制箱_防爆空调_-盛通防爆 | 档案密集架,移动密集架,手摇式密集架,吉林档案密集架-厂家直销★价格公道★质量保证 | 许昌奥仕达自动化设备有限公司 | 网带通过式抛丸机,,网带式打砂机,吊钩式,抛丸机,中山抛丸机生产厂家,江门抛丸机,佛山吊钩式,东莞抛丸机,中山市泰达自动化设备有限公司 | 防爆电机生产厂家,YBK3电动机,YBX3系列防爆电机,YBX4节防爆电机--河南省南洋防爆电机有限公司 | 捆扎机_气动捆扎机_钢带捆扎机-沈阳海鹞气动钢带捆扎机公司 | 标准件-非标紧固件-不锈钢螺栓-非标不锈钢螺丝-非标螺母厂家-三角牙锁紧自攻-南京宝宇标准件有限公司 | 必胜高考网_全国高考备考和志愿填报信息平台 | 合肥风管加工厂-安徽螺旋/不锈钢风管-通风管道加工厂家-安徽风之范 | 新型锤式破碎机_新型圆锥式_新型颚式破碎机_反击式打沙机_锤式制砂机_青州建源机械 | 纯化水设备-纯水设备-超纯水设备-[大鹏水处理]纯水设备一站式服务商-东莞市大鹏水处理科技有限公司 | 全自动固相萃取仪_高通量真空平行浓缩仪-勤业永为 | 集菌仪_智能集菌仪_全封闭集菌仪_无菌检查集菌仪厂家-那艾 | 兰州牛肉面加盟,兰州牛肉拉面加盟-京穆兰牛肉面 | 雨燕360体育免费直播_雨燕360免费NBA直播_NBA篮球高清直播无插件-雨燕360体育直播 | 聚天冬氨酸,亚氨基二琥珀酸四钠,PASP,IDS - 远联化工 | 洁净棚-洁净工作棚-无菌室-净化工程公司_北京卫护科技有限公司 | 天命文免费算命堂_自助算命_自由算命系统_长文周易 | 聚合氯化铝厂家-聚合氯化铝铁价格-河南洁康环保科技 | 液压油缸-液压缸厂家价格,液压站系统-山东国立液压制造有限公司 液压油缸生产厂家-山东液压站-济南捷兴液压机电设备有限公司 | 青岛成人高考_山东成考报名网| 北京网站建设|北京网站开发|北京网站设计|高端做网站公司 | 安平县鑫川金属丝网制品有限公司,声屏障,高速声屏障,百叶孔声屏障,大弧形声屏障,凹凸穿孔声屏障,铁路声屏障,顶部弧形声屏障,玻璃钢吸音板 | RTO换向阀_VOC高温阀门_加热炉切断阀_双偏心软密封蝶阀_煤气蝶阀_提升阀-湖北霍科德阀门有限公司 | 砍排机-锯骨机-冻肉切丁机-熟肉切片机-预制菜生产线一站式服务厂商 - 广州市祥九瑞盈机械设备有限公司 | 水厂自动化-水厂控制系统-泵站自动化|控制系统-闸门自动化控制-济南华通中控科技有限公司 | 深圳善跑体育产业集团有限公司_塑胶跑道_人造草坪_运动木地板 | 齿轮减速机_齿轮减速电机-VEMT蜗轮蜗杆减速机马达生产厂家瓦玛特传动瑞环机电 | 洁净化验室净化工程_成都实验室装修设计施工_四川华锐净化公司 | 哈尔滨治「失眠/抑郁/焦虑症/精神心理」专科医院排行榜-京科脑康免费咨询 一对一诊疗 | 广州展览制作|展台制作工厂|展览设计制作|展览展示制作|搭建制作公司 | 作文导航网_作文之家_满分作文_优秀作文_作文大全_作文素材_最新作文分享发布平台 | 呼末二氧化碳|ETCO2模块采样管_气体干燥管_气体过滤器-湖南纳雄医疗器械有限公司 | 压装机-卧式轴承轮轴数控伺服压装机厂家[铭泽机械] | 3d可视化建模_三维展示_产品3d互动数字营销_三维动画制作_3D虚拟商城 【商迪3D】三维展示服务商 广东健伦体育发展有限公司-体育工程配套及销售运动器材的体育用品服务商 | 河南15年专业网站建设制作设计,做网站就找郑州启凡网络公司 | 注塑机-压铸机-塑料注塑机-卧式注塑机-高速注塑机-单缸注塑机厂家-广东联升精密智能装备科技有限公司 | 品牌设计_VI设计_电影海报设计_包装设计_LOGO设计-Bacross新越品牌顾问 | 哈尔滨治「失眠/抑郁/焦虑症/精神心理」专科医院排行榜-京科脑康免费咨询 一对一诊疗 | 昊宇水工|河北昊宇水工机械工程有限公司 |