使用 Docker Engine SDK 開發

Docker 提供了一個用於與 Docker 守護程式(稱為 Docker Engine API)互動的 API,以及用於 Go 和 Python 的 SDK。SDK 允許您有效地構建和擴充套件 Docker 應用程式和解決方案。如果 Go 或 Python 不適合您,您可以直接使用 Docker Engine API。

Docker Engine API 是一個 RESTful API,可以透過 HTTP 客戶端(例如 wgetcurl)或大多數現代程式語言中包含的 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. 解壓縮它並更改到解壓縮的目錄。
    3. 執行 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"
	"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, 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 https:///v1.46/containers/create
{"Id":"1c6594faf5","Warnings":null}

$ curl --unix-socket /var/run/docker.sock -X POST https:///v1.46/containers/1c6594faf5/start

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

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

在使用 cURL 透過 Unix 套接字連線時,主機名並不重要。之前的示例使用了 localhost,但任何主機名都可以使用。

重要

之前的示例假設您使用的是 cURL 7.50.0 或更高版本。舊版本的 cURL 使用了 非標準 URL 表示法 在使用套接字連線時。

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


有關更多示例,請檢視 SDK 示例.

非官方庫

還有許多社群支援的庫可用於其他語言。它們尚未經過 Docker 測試,因此如果您遇到任何問題,請向庫維護者提出。

語言
Clibdocker
C#Docker.DotNet
C++lasote/docker_client
Clojureclj-docker-client
Clojurecontajners
Dartbwu_docker
Erlangerldocker
Gradlegradle-docker-plugin
Groovydocker-client
Haskelldocker-hs
Javadocker-client
Javadocker-java
Javadocker-java-api
Javajocker
NodeJSdockerode
NodeJSharbor-master
PerlEixo::Docker
PHPDocker-PHP
Rubydocker-api
Rustbollard
Rustdocker-rust
Rustshiplift
Scalatugboat
Scalareactive-docker
Swiftdocker-client-swift