使用 Docker 引擎 SDK 進行開發

Docker 提供了一個 API(稱為 Docker 引擎 API)來與 Docker Daemon 互動,以及 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 Daemon 和 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 socket 連線時,主機名稱並不重要。前面的範例使用 localhost,但任何主機名稱都可以使用。

      重要

      前面的範例假設您使用的是 cURL 7.50.0 或更高版本。較舊版本的 cURL 在使用 socket 連線時,使用了非標準的 URL 表示法

      如果您使用的是較舊版本的 cURL,請改用 http:/<API 版本>/,例如:http:/v1.47/containers/1c6594faf5/start


      更多範例,請參考 SDK 範例

      非官方函式庫

      其他語言也有一些社群支援的函式庫。它們尚未經過 Docker 測試,因此如果您遇到任何問題,請向函式庫維護者回報。