Docker API简介
Docker提供了Docker Engine API与Docker daemon交互,Docker提供了Go和Python版本的SDK。本质上Docker Engine API是一个RESTful的接口,可以通过HTTP请求操作。
Docker-build-900x551.png
这里以GO版本的docker client演示拉取镜像、创建容器、启动容器、停止容器、删除容器、容器状态监听 一系列操作API的示例。全部的api文档:点击这里
获取client
通过client提供的方法来实现对Docker的操作
cli, err := client.NewClientWithOpts(client.FromEnv)
镜像操作
- 查看本地镜像列表:
func listImages(cli *client.Client) {
images, err := cli.ImageList(context.Background(), types.ImageListOptions{})
if err != nil {
panic(err)
}
for _, image := range images {
fmt.Printf("%s %s \n\n", image.ID[:19], image.RepoTags)
}
}
- 拉取新的镜像:
func ImagePull(cli *client.Client) {
dockerImage := "docker/getting-started"
reader, err := cli.ImagePull(context.Background(), dockerImage, types.ImagePullOptions{})
if err != nil {
panic(err)
}
io.Copy(os.Stdout, reader)
}
- 删除镜像:
func ImageRemove(cli *client.Client) {
imageID := "cb90f98fd791"
items, err := cli.ImageRemove(context.Background(), imageID, types.ImageRemoveOptions{})
if err != nil {
panic(err)
}
for _, item := range items {
fmt.Printf("%s %s\n\n", item.Deleted, item.Untagged)
}
}
容器操作
- 查看当前运行的容器列表:
func listContainers(cli *client.Client) {
containers, err := cli.ContainerList(context.Background(), types.ContainerListOptions{})
if err != nil {
panic(err)
}
for _, container := range containers {
fmt.Printf("%s %s\n\n", container.ID[:10], container.Image)
}
}
- 根据镜像创建容器:
func ContainerCreate(cli *client.Client) string {
containerName := "docker-demo"
containerPort, _ := nat.NewPort("tcp", "80")
hostBinding := nat.PortBinding{
HostIP: "0.0.0.0",
HostPort: "80",
}
cont, err := cli.ContainerCreate(context.Background(),
&container.Config{
Image: "docker/getting-started",
},
&container.HostConfig{
PortBindings: nat.PortMap{
containerPort: []nat.PortBinding{
hostBinding,
},
},
},
nil, nil, containerName)
if err != nil {
panic(err)
}
fmt.Printf("containerId = %s \n\n", cont.ID)
return cont.ID
}
- 启动容器:
func ContainerStart(cli *client.Client, cId string) {
err := cli.ContainerStart(context.Background(), cId, types.ContainerStartOptions{})
if err != nil {
panic(err)
}
}
- 删除容器:
func ContainerRemove(cli *client.Client) {
containerName := "docker-demo"
err := cli.ContainerRemove(context.Background(), containerName, types.ContainerRemoveOptions{})
if err != nil {
panic(err)
}
}
- 容器状态监听:
func MonitorContainers(cli *client.Client, containerID string) {
statusCh, errCh := cli.ContainerWait(
context.Background(),
containerID,
container.WaitConditionNotRunning,
)
select {
case err := <-errCh:
if err != nil {
log.Fatal(err)
}
case status := <-statusCh:
fmt.Printf("status code = %d\n", status.StatusCode)
}
}