使用 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 客戶端(例如 wget
或 curl
)或大多數現代程式語言都包含的 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
- 直接下載軟體包.
- 解壓並進入解壓後的目錄。
- 執行
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 https:///v1.51/containers/create
{"Id":"1c6594faf5","Warnings":null}
$ curl --unix-socket /var/run/docker.sock -X POST https:///v1.51/containers/1c6594faf5/start
$ curl --unix-socket /var/run/docker.sock -X POST https:///v1.51/containers/1c6594faf5/wait
{"StatusCode":0}
$ curl --unix-socket /var/run/docker.sock "https:///v1.51/containers/1c6594faf5/logs?stdout=1"
hello world
當使用 cURL 透過 Unix 套接字連線時,主機名並不重要。前面的示例使用 localhost
,但任何主機名都可以。
重要前面的示例假設您使用的是 cURL 7.50.0 或更高版本。較舊版本的 cURL 在使用套接字連線時使用了非標準 URL 表示法。
如果您使用的是舊版 cURL,請改用
http:/<API 版本>/
,例如:http:/v1.51/containers/1c6594faf5/start
。
有關更多示例,請檢視 SDK 示例。
非官方庫
有許多社群支援的其他語言庫可用。它們未經 Docker 測試,因此如果您遇到任何問題,請向庫維護人員提交。
語言 | 庫 |
---|---|
C | libdocker |
C# | Docker.DotNet |
C++ | lasote/docker_client |
Clojure | clj-docker-client |
Clojure | contajners |
Dart | bwu_docker |
Erlang | erldocker |
Gradle | gradle-docker-plugin |
Groovy | docker-client |
Haskell | docker-hs |
Java | docker-client |
Java | docker-java |
Java | docker-java-api |
Java | jocker |
NodeJS | dockerode |
NodeJS | harbor-master |
NodeJS | the-moby-effect |
Perl | Eixo::Docker |
PHP | Docker-PHP |
Ruby | docker-api |
Rust | bollard |
Rust | docker-rust |
Rust | shiplift |
Scala | tugboat |
Scala | reactive-docker |
Swift | docker-client-swift |