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端. 默认情 ...
随机推荐
- value-key
value-key object 如果 Select 的绑定值为对象类型,请务必指定 value-key 作为它的唯一性标识. value-key 作为 value 唯一标识的键名,绑定值为对象类型时 ...
- npm ip
npm ip webpack $ ip address var ip = require('ip'); ip.address() // my ip address ip.isEqual('::1', ...
- 字节跳动-前端面试题 Multi Promise Order
字节跳动-前端面试题 Multi Promise Order Promise Order Async/Await async function async1 () { console.log('asy ...
- URLSearchParams & shape URL params
URLSearchParams https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams var paramsString = ...
- HTTPS All In One
HTTPS All In One HTTPS & web security HTTPS Hypertext Transfer Protocol Secure HTTPS is an exten ...
- document.getElementById & document.querySelector
document.getElementById & document.querySelector https://developer.mozilla.org/en-US/docs/Web/AP ...
- 近期最值得关注的潜力币种——VAST
近期币圈的热度又再次被掀起,很多新的币种也争相上线,还有一些币种虽然还未上线,但是在币圈的火热程度也非同一般.小编留意了一下,最近在币圈讨论的最火的便是VAST代币.许多生态建设者乃至机构都表示很看好 ...
- 大胆预计SPC算力空投收益,月收益22.8%
此前,NGK官方公告表示,NGK算力持有者获得SPC的数量是根据200万枚SPC除以全网算力总量决定的. 举个例子,假设全网算力总量为500万,那么每个算力持有者如果持有一个算力,则可获得200万÷5 ...
- Basic认证时添加请求头
http Basic认证 http协议定义的一种认证方式,将客户端id和客户端密码按照"客户端ID:客户端密码"的格式拼接,并用base64编 码,放在header中请求服务端, ...
- 都学Python了,C++难道真的用不着了吗?
本文首发 | 公众号:lunvey 人人都在学Python,我还学C++吗? 现在只要提及编程语言,得到的答复都是:学Python,有未来! 大家可能有一个误区,数据分析带火了Python,让人们 ...