使用 Docker Engine SDKs 进行开发

Docker 提供了一个用于与 Docker 守护进程(称为 Docker Engine API)交互的 API,以及用于 Go 和 Python 的 SDK。这些 SDK 允许您高效地构建和扩展 Docker 应用程序和解决方案。如果 Go 或 Python 不适合您,您可以直接使用 Docker Engine API。

Docker Engine API 是一种 RESTful API,可以通过诸如 wgetcurl 的 HTTP 客户端访问,也可以通过大多数现代编程语言中的 HTTP 库访问。

安装SDK

使用以下命令安装Go或Python SDK。两个SDK都可以安装并共存。

Go SDK

$ go get github.com/docker/docker/client

客户端需要最新版本的Go。运行go version并确保您正在运行当前支持的Go版本。

欲了解更多信息,请参阅 Docker Engine Go SDK 参考

Python SDK

  • 推荐:运行 pip install docker

  • 如果你不能使用 pip

    1. 直接下载包.
    2. Extract it and change to the extracted directory.
    3. Run python setup.py install.

欲了解更多信息,请参阅 Docker Engine Python SDK 参考

查看API参考

你可以 查看最新版本API的参考 或者 选择一个特定版本

版本化的API和SDK

您应该使用的Docker Engine API版本取决于您的Docker守护进程和Docker客户端的版本。详情请参阅API文档中的版本化API和SDK部分。

SDK 和 API 快速入门

使用以下指南来选择在代码中使用的SDK或API版本:

  • 如果您正在开始一个新项目,请使用 最新版本, 但请使用API版本协商或指定您正在使用的版本。这有助于防止意外情况。
  • 如果您需要新功能,请更新您的代码以使用至少支持该功能的最低版本,并尽可能使用您能使用的最新版本。
  • 否则,继续使用您的代码已经在使用的版本。

例如,docker run 命令可以直接使用 Docker API 实现,或者使用 Python 或 Go SDK。


package main

import (
	"context"
	"io"
	"os"

	"github.com/docker/docker/api/types/container"
        "github.com/docker/docker/api/types/image"
	"github.com/docker/docker/client"
	"github.com/docker/docker/pkg/stdcopy"
)

func main() {
    ctx := context.Background()
    cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
    if err != nil {
        panic(err)
    }
    defer cli.Close()

    reader, err := cli.ImagePull(ctx, "docker.io/library/alpine", image.PullOptions{})
    if err != nil {
        panic(err)
    }
    io.Copy(os.Stdout, reader)

    resp, err := cli.ContainerCreate(ctx, &container.Config{
        Image: "alpine",
        Cmd:   []string{"echo", "hello world"},
    }, nil, nil, nil, "")
    if err != nil {
        panic(err)
    }

    if err := cli.ContainerStart(ctx, resp.ID, container.StartOptions{}); err != nil {
        panic(err)
    }

    statusCh, errCh := cli.ContainerWait(ctx, resp.ID, container.WaitConditionNotRunning)
    select {
    case err := <-errCh:
        if err != nil {
            panic(err)
        }
    case <-statusCh:
    }

    out, err := cli.ContainerLogs(ctx, resp.ID, container.LogsOptions{ShowStdout: true})
    if err != nil {
        panic(err)
    }

    stdcopy.StdCopy(os.Stdout, os.Stderr, out)
}
import docker
client = docker.from_env()
print(client.containers.run("alpine", ["echo", "hello", "world"]))
$ curl --unix-socket /var/run/docker.sock -H "Content-Type: application/json" \
  -d '{"Image": "alpine", "Cmd": ["echo", "hello world"]}' \
  -X POST http://localhost/v1.47/containers/create
{"Id":"1c6594faf5","Warnings":null}

$ curl --unix-socket /var/run/docker.sock -X POST http://localhost/v1.47/containers/1c6594faf5/start

$ curl --unix-socket /var/run/docker.sock -X POST http://localhost/v1.47/containers/1c6594faf5/wait
{"StatusCode":0}

$ curl --unix-socket /var/run/docker.sock "http://localhost/v1.47/containers/1c6594faf5/logs?stdout=1"
hello world

当使用cURL通过Unix套接字连接时,主机名并不重要。前面的例子使用了localhost,但任何主机名都可以工作。

重要

前面的例子假设你使用的是cURL 7.50.0或更高版本。旧版本的cURL在使用套接字连接时使用了 非标准的URL表示法

如果你使用的是旧版本的cURL,请使用http://代替, 例如:http:/v1.47/containers/1c6594faf5/start


更多示例,请查看 SDK 示例

非官方库

有许多社区支持的其他语言的库可用。它们尚未经过Docker的测试,因此如果您遇到任何问题,请向库的维护者提交问题。