使用 Docker Engine SDKs 进行开发
Docker 提供了一个用于与 Docker 守护进程(称为 Docker Engine API)交互的 API,以及用于 Go 和 Python 的 SDK。这些 SDK 允许您高效地构建和扩展 Docker 应用程序和解决方案。如果 Go 或 Python 不适合您,您可以直接使用 Docker Engine API。
Docker Engine API 是一种 RESTful API,可以通过诸如 wget 或 curl 的 HTTP 客户端访问,也可以通过大多数现代编程语言中的 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:- 直接下载包.
- Extract it and change to the extracted directory.
- Run
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 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:/代替, 例如:/ http:/v1.47/containers/1c6594faf5/start。
更多示例,请查看 SDK 示例。
非官方库
有许多社区支持的其他语言的库可用。它们尚未经过Docker的测试,因此如果您遇到任何问题,请向库的维护者提交问题。
| Language | Library |
|---|---|
| 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 |