下载包

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的更多相关文章

  1. Docker Python API 与 Docker Command

    span.kw { color: #007020; font-weight: bold; } code > span.dt { color: #902000; } code > span. ...

  2. Docker 容器高级操作[Docker 系列-3]

    关注公众号,大家可以在公众号后台回复“博客园”,免费获得作者 Java 知识体系/面试必看资料. 上篇文章向读者介绍了一个 Nginx 的例子,对于 Nginx 这样一个容器而言,当它启动成功后,我们 ...

  3. Docker入门教程(八)Docker Remote API

    Docker入门教程(八)Docker Remote API [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第八篇,重点介绍了Docker Remote ...

  4. Docker笔记一:Docker介绍

    目录 什么是Docker? Docker的核心概念 Docker镜像命令 Docker容器命令 Docker实战 查看我的镜像 启动Redis Docker中国镜像加速 血与泪的教训 什么是Docke ...

  5. 用docker搭建测试环境--docker的基本操作

    上一篇文章中最后执行了docker pull centos的指令,经过一段时间的等待,会从hub.docker.com上下载docker官方最新的centos的images,接下来熟悉一下docker ...

  6. 【转+自己研究】新姿势之Docker Remote API未授权访问漏洞分析和利用

    0x00 概述 最近提交了一些关于 docker remote api 未授权访问导致代码泄露.获取服务器root权限的漏洞,造成的影响都比较严重,比如 新姿势之获取果壳全站代码和多台机器root权限 ...

  7. Gitlab CI 自动部署 asp.net core web api 到Docker容器

    为什么要写这个? 在一个系统长大的过程中会经历不断重构升级来满足商业的需求,而一个严谨的商业系统需要高效.稳定.可扩展,有时候还不得不考虑成本的问题.我希望能找到比较完整的开源解决方案来解决持续集成. ...

  8. docker 基础之操作容器

    Docker子命令分类 Docker 环境信息 info .version 容器生命周期管理 Create.exec.kill.pause.restart.rm.run.start.stop.unpa ...

  9. docker remote api 的安全隐患

    开启docker的api,首先要知道docker的守护进程daemon,在下认为daemon作为Client和service连接的一个桥梁,负责代替将client的请求传递给service端. 默认情 ...

随机推荐

  1. GitHub Ribbons : 谈网站的安全性-资源链接如何 预防/实现 爬虫的批量下载!

    GitHub Ribbons : 谈网站的安全性-资源链接如何 预防/实现 爬虫的批量下载! 预防方法: 1. 使用随机数字符串,拼接URL! https://camo.githubuserconte ...

  2. CSS will-change All In One

    CSS will-change All In One CSS animation effect live demo https://nextjs.org/conf/ https://nextjs.or ...

  3. CSS3 & CSS var & :root

    CSS3 & CSS var & :root How to change CSS :root color variables in JavaScript https://stackov ...

  4. 专利 & 发明专利 & 专利查询

    专利 & 发明专利 & 专利查询 PDF 文档中表格解析的方法.系统.存储介质及电子设备 中国专利公布公告 http://epub.sipo.gov.cn/index.action 中 ...

  5. svg insert shape string bug

    svg insert shape string bug not support custom areaProps attributes ??? const svg = document.querySe ...

  6. PAUL ADAMS ARCHITECT:薪资追不上房价美一半家庭难买房

    尽管上一年度美国经济遭受重创,但美国房价依旧持续蹿扬,据最新调查显示,美国大部分地区的房价已经到了一般家庭无法负担的水准. 美国房价上涨持续强劲,主要受益美国人居家办公需求(受大环境影响,目前美国有7 ...

  7. CNN专访灵石CTO:Baccarat流动性挖矿能否持续?

    近日,CNN记者Robert独家专访Baccarat的项目团队CTO STEPHEN LITAN,跟他特别聊了聊DeFi的近况. 以下是专访全文: Robert:推出Baccarat的契机是什么? S ...

  8. PAA房产智慧社区:解决社区管理服务的痛点难点

    社区,是社交与生活的舞台,更是家的延伸.社区之所有能够有所创新发展,得益于借助数字化和智能化.智能化给社区带来的便利体现在社区门禁可以人脸识别:AI的摄像头可以自动捕获异常的现象,便于社区管理员第一时 ...

  9. Redis基本数据结构之ZSet

    1.1Zset(有序集合) Zset保留了集合不能有重复成员的特性,但不同的是,有序集合中的元素可以排序.但是它和列表使用索引下标作为排序依据不同的是,它给每个元素设置一个分数(score)作为排序的 ...

  10. oracle impdp ORA-02304 invalid object identifier literal

    reference: https://webgeest.blogspot.com/2015/07/ora-39083-ora-02304-on-impdp-datapump.html     解决方法 ...