docker API使用

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)
    }
}

代码在这里可以查看

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容