下载包

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. 洛谷p2216 多次单调队列,扫描矩阵中的最大值减去最小值最的固定大小子矩阵

    #include <iostream> #include <cstdio> #include <cstring> using namespace std; int ...

  2. JVM学习路线

    JVM探究 请你谈谈你对JVM的理解? java8虚拟机和之前的变化更新? 什么是OOM,什么是栈溢出StackOverFlowError?怎么分析? JVM的常用调优参数有哪些? 内存快照如何抓取, ...

  3. tfrecords转图片存储

    import os import shutil import tensorflow as tf import time import sys import cv2 # 图片存放位置 PATH_RES ...

  4. 慕课网站 & MOOC website

    慕课网站 & MOOC website MOOC, massive open online course Mooc for everyone ! 国家精品课程 & 在线学习平台 慕课平 ...

  5. HTML5 动效

    HTML5 动效 motion graphics toolbelt for the web https://github.com/xgqfrms/mojs A collection of loadin ...

  6. queueMicrotask & microtask

    queueMicrotask & microtask microtask microtask queue Promise Mutation Observer API MutationObser ...

  7. js generator和yield

    function co<T>(fn: () => Generator<any, any, any>): Promise<T> { const g: Gener ...

  8. 如何用JavaDoc命令生成帮助文档

    如何用JavaDoc命令生成帮助文档 文档注释 在代码中使用文档注释的方法 /** *@author *@version * */ 生成帮助文档 打开java文件所在位置,在路径前加入cmd (注意有 ...

  9. 开发工具-scala处理json格式利器-json4s

    1.为什么是json4s 从json4s的官方描述 At this moment there are at least 6 json libraries for scala, not counting ...

  10. 【Azure 云服务】如何从Azure Cloud Service中获取项目的部署文件

    问题描述 在历史已经部署的云服务(Azure Cloud Service)中,如何获取到项目在很久以前的部署包文件呢? 解决办法 1)如果部署云服务是通过门户上传部署包到存储账号中,则可以直接从存储账 ...