Docker SDK api操作Docker
下载包
go get "github.com/docker/docker/api/types"
go get "github.com/docker/docker/client"
创建Container
其主要复杂在端口的映射上面。如果hostConfig里面的PortBindings对应的PortMap中相应端口对应的PortBinding,其值有几个(空值也算)就会对外映射几个端口。
func createContainer(cli *client.Client) string {
    exports := make(nat.PortSet, 10)
    port, err := nat.NewPort("tcp", "80")
    log(err)
    exports[port] = struct{}{}
    config := &container.Config{Image: "nginx", ExposedPorts: exports}
    portBind := nat.PortBinding{HostPort: "80"}
    portMap := make(nat.PortMap, 0)
    tmp := make([]nat.PortBinding, 0, 1)
    tmp = append(tmp, portBind)
    portMap[port] = tmp
    hostConfig := &container.HostConfig{PortBindings: portMap}
    // networkingConfig := &network.NetworkingConfig{}
    containerName := "hel"
    body, err := cli.ContainerCreate(context.Background(), config, hostConfig, nil, containerName)
    log(err)
    fmt.Printf("ID: %s\n", body.ID)
    return body.ID
}
启动/停止/删除
package main
import (
    "context"
    "fmt"
    "time"
    "github.com/docker/docker/api/types"
    "github.com/docker/docker/api/types/container"
    "github.com/docker/docker/client"
    "github.com/docker/go-connections/nat"
)
func main() {
    cli, err := client.NewClient("tcp://192.168.100.33:2376", "v1.12", nil, nil)
    defer cli.Close()
    log(err)
    listImage(cli)
    id := createContainer(cli)
    fmt.Printf("%s\n", id)
    time.Sleep(time.Second * 1)
    startContainer(id, cli)
    time.Sleep(time.Second * 40)
    stopContainer(id, cli)
    time.Sleep(time.Second * 3)
    id, err = removeContainer(id, cli)
    if err == nil {
        fmt.Println("删除容器", id, "成功")
    }
}
// 列出镜像
func listImage(cli *client.Client) {
    images, err := cli.ImageList(context.Background(), types.ImageListOptions{})
    log(err)
    for _, image := range images {
        fmt.Println(image)
    }
}
// 创建容器
func createContainer(cli *client.Client) string {
    exports := make(nat.PortSet, 10)
    port, err := nat.NewPort("tcp", "80")
    log(err)
    exports[port] = struct{}{}
    config := &container.Config{Image: "nginx", ExposedPorts: exports}
    portBind := nat.PortBinding{HostPort: "80"}
    portMap := make(nat.PortMap, 0)
    tmp := make([]nat.PortBinding, 0, 1)
    tmp = append(tmp, portBind)
    portMap[port] = tmp
    hostConfig := &container.HostConfig{PortBindings: portMap}
    containerName := "hel"
    body, err := cli.ContainerCreate(context.Background(), config, hostConfig, nil, containerName)
    log(err)
    fmt.Printf("ID: %s\n", body.ID)
    return body.ID
}
// 启动
func startContainer(containerID string, cli *client.Client) {
    err := cli.ContainerStart(context.Background(), containerID, types.ContainerStartOptions{})
    log(err)
    if err == nil {
        fmt.Println("容器", containerID, "启动成功")
    }
}
// 停止
func stopContainer(containerID string, cli *client.Client) {
    timeout := time.Second * 10
    err := cli.ContainerStop(context.Background(), containerID, &timeout)
    if err != nil {
        log(err)
    } else {
        fmt.Printf("容器%s已经被停止\n", containerID)
    }
}
// 删除
func removeContainer(containerID string, cli *client.Client) (string, error) {
    err := cli.ContainerRemove(context.Background(), containerID, types.ContainerRemoveOptions{})
    log(err)
    return containerID, err
}
func log(err error) {
    if err != nil {
        fmt.Printf("%v\n", err)
        panic(err)
    }
}
端口映射
在使用docker go sdk的时候,进行容器创建,如果指定了映射的端口,会报以下错误:
cannot use ports (type map["bitbucket.org/myorg/myproject/vendor/github.com/docker/go-connect
ions/nat".Port]struct {}) as type "github.com/docker/docker/vendor/github.com/docker/go-connections/nat".PortSet in field
 value
其解决方法:把gopath里面pkg下面docker的vendor里面相应的connections包删除即可。src下的最好也删除。如果编译报缺少包,则把其相应的包get下来即可。
注意: 客户端版本和docker版本兼容问题
Docker SDK api操作Docker的更多相关文章
- Docker Python API 与 Docker Command
		
span.kw { color: #007020; font-weight: bold; } code > span.dt { color: #902000; } code > span. ...
 - Docker 容器高级操作[Docker 系列-3]
		
关注公众号,大家可以在公众号后台回复“博客园”,免费获得作者 Java 知识体系/面试必看资料. 上篇文章向读者介绍了一个 Nginx 的例子,对于 Nginx 这样一个容器而言,当它启动成功后,我们 ...
 - Docker入门教程(八)Docker Remote API
		
Docker入门教程(八)Docker Remote API [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第八篇,重点介绍了Docker Remote ...
 - Docker笔记一:Docker介绍
		
目录 什么是Docker? Docker的核心概念 Docker镜像命令 Docker容器命令 Docker实战 查看我的镜像 启动Redis Docker中国镜像加速 血与泪的教训 什么是Docke ...
 - 用docker搭建测试环境--docker的基本操作
		
上一篇文章中最后执行了docker pull centos的指令,经过一段时间的等待,会从hub.docker.com上下载docker官方最新的centos的images,接下来熟悉一下docker ...
 - 【转+自己研究】新姿势之Docker Remote API未授权访问漏洞分析和利用
		
0x00 概述 最近提交了一些关于 docker remote api 未授权访问导致代码泄露.获取服务器root权限的漏洞,造成的影响都比较严重,比如 新姿势之获取果壳全站代码和多台机器root权限 ...
 - Gitlab CI 自动部署 asp.net core web api 到Docker容器
		
为什么要写这个? 在一个系统长大的过程中会经历不断重构升级来满足商业的需求,而一个严谨的商业系统需要高效.稳定.可扩展,有时候还不得不考虑成本的问题.我希望能找到比较完整的开源解决方案来解决持续集成. ...
 - docker 基础之操作容器
		
Docker子命令分类 Docker 环境信息 info .version 容器生命周期管理 Create.exec.kill.pause.restart.rm.run.start.stop.unpa ...
 - docker remote api 的安全隐患
		
开启docker的api,首先要知道docker的守护进程daemon,在下认为daemon作为Client和service连接的一个桥梁,负责代替将client的请求传递给service端. 默认情 ...
 
随机推荐
- 洛谷p2216 多次单调队列,扫描矩阵中的最大值减去最小值最的固定大小子矩阵
			
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int ...
 - JVM学习路线
			
JVM探究 请你谈谈你对JVM的理解? java8虚拟机和之前的变化更新? 什么是OOM,什么是栈溢出StackOverFlowError?怎么分析? JVM的常用调优参数有哪些? 内存快照如何抓取, ...
 - tfrecords转图片存储
			
import os import shutil import tensorflow as tf import time import sys import cv2 # 图片存放位置 PATH_RES ...
 - 慕课网站 & MOOC website
			
慕课网站 & MOOC website MOOC, massive open online course Mooc for everyone ! 国家精品课程 & 在线学习平台 慕课平 ...
 - HTML5 动效
			
HTML5 动效 motion graphics toolbelt for the web https://github.com/xgqfrms/mojs A collection of loadin ...
 - queueMicrotask & microtask
			
queueMicrotask & microtask microtask microtask queue Promise Mutation Observer API MutationObser ...
 - js generator和yield
			
function co<T>(fn: () => Generator<any, any, any>): Promise<T> { const g: Gener ...
 - 如何用JavaDoc命令生成帮助文档
			
如何用JavaDoc命令生成帮助文档 文档注释 在代码中使用文档注释的方法 /** *@author *@version * */ 生成帮助文档 打开java文件所在位置,在路径前加入cmd (注意有 ...
 - 开发工具-scala处理json格式利器-json4s
			
1.为什么是json4s 从json4s的官方描述 At this moment there are at least 6 json libraries for scala, not counting ...
 - 【Azure 云服务】如何从Azure Cloud Service中获取项目的部署文件
			
问题描述 在历史已经部署的云服务(Azure Cloud Service)中,如何获取到项目在很久以前的部署包文件呢? 解决办法 1)如果部署云服务是通过门户上传部署包到存储账号中,则可以直接从存储账 ...