使用 Docker 引擎 SDK 进行开发

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

Docker 引擎 API 是一个 RESTful API,可通过 HTTP 客户端(如 `wget` 或 `curl`)或大多数现代编程语言的 HTTP 库进行访问。

安装 SDK

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

Go SDK

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

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

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

  • 推荐:运行 `pip install docker`。

  • 如果您无法使用 `pip`

    1. 直接下载软件包Docker 引擎 Python SDK 参考查看 API 参考

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

      版本化 API 和 SDK

      您应该使用的 Docker 引擎 API 版本取决于您的 Docker 守护程序和 Docker 客户端的版本。有关详细信息,请参阅 API 文档中的版本化 API 和 SDK部分。

      SDK 和 API 快速入门

      使用以下准则选择在代码中使用的 SDK 或 API 版本

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

      例如,可以使用 Docker API 直接实现 docker run 命令,也可以使用 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:/<API 版本>/,例如:http:/v1.47/containers/1c6594faf5/start


      更多示例,请参阅SDK 示例

      非官方库

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