使用 Docker 引擎 SDK 进行开发

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

Docker 引擎 API 是一个 RESTful API,可通过 HTTP 客户端(例如wgetcurl)或作为大多数现代编程语言一部分的 HTTP 库访问。

安装 SDK

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

goSDK

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

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

有关更多信息,请参阅 Docker Engine Go SDK 参考

Python SDK

  • 推荐:运行pip install docker

  • 如果你不能使用pip

    1. 直接下载包
    2. 解压它并更改到解压的目录。
    3. 运行python setup.py install

有关更多信息,请参阅 Docker 引擎 Python SDK 参考

查看 API 参考

您可以 查看最新版本 API 的参考选择特定版本

版本化 API 和 SDK

您应使用的 Docker 引擎 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"
	"github.com/docker/docker/api/types/container"
	"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", types.ImagePullOptions{})
    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, types.ContainerStartOptions{}); 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, types.ContainerLogsOptions{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.45/containers/create
{"Id":"1c6594faf5","Warnings":null}

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

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

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

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

重要的

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

如果您使用的是旧版本的 cURL,请http:/<API version>/改用,例如:http:/v1.45/containers/1c6594faf5/start


有关更多示例,请查看 SDK 示例

非官方图书馆

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

语言图书馆
Clibdocker
C#Docker.DotNet
C++拉索特/docker_client
克洛尤尔clj-docker-客户端
克洛尤尔容器
Dartbwu_docker
Erlang埃尔多克
摇篮gradle-docker-插件
Groovydocker-客户端
哈斯克尔docker-hs
Javadocker-客户端
Javadocker-java
Javadocker-java-api
Java小丑
NodeJSDocker
NodeJS港务长
珀尔Eixo::Docker
PHPDocker-PHP
Rubydocker-api
Rust系柱
Rustdocker-rust
Rust升船机
Scala拖船
Scala反应式 docker
迅速docker-客户端-swift