content/reference/api/engine/sdk/_index.md
Docker provides an API for interacting with the Docker daemon (called the Docker Engine API), as well as SDKs for Go and Python. The SDKs allow you to efficiently build and scale Docker apps and solutions. If Go or Python don't work for you, you can use the Docker Engine API directly.
The Docker Engine API is a RESTful API accessed by an HTTP client such as wget or
curl, or the HTTP library which is part of most modern programming languages.
Use the following commands to install the Go or Python SDK. Both SDKs can be installed and coexist together.
$ go get github.com/moby/moby/client
The client requires a recent version of Go. Run go version and ensure that you're running a currently supported version of Go.
For more information, see Go client reference.
Recommended: Run pip install docker.
If you can't use pip:
python setup.py install.For more information, see Docker Engine Python SDK reference.
[!NOTE] Docker Desktop for Linux users
Docker Desktop for Linux uses a per-user socket instead of the system-wide
/var/run/docker.sock. To use Docker SDKs with Docker Desktop for Linux, set theDOCKER_HOSTenvironment variable:bashexport DOCKER_HOST=unix://$HOME/.docker/desktop/docker.sockFor more details, see the Linux FAQs.
You can view the reference for the latest version of the API or choose a specific version.
The version of the Docker Engine API you should use depends on the version of your Docker daemon and Docker client. See the versioned API and SDK section in the API documentation for details.
Use the following guidelines to choose the SDK or API version to use in your code:
As an example, the docker run command can be implemented using the
Docker API directly, or using the Python or Go SDK.
{{< tabs >}} {{< tab name="Go" >}}
package main
import (
"context"
"io"
"os"
"github.com/moby/moby/api/pkg/stdcopy"
"github.com/moby/moby/api/types/container"
"github.com/moby/moby/client"
)
func main() {
ctx := context.Background()
apiClient, err := client.New(client.FromEnv)
if err != nil {
panic(err)
}
defer apiClient.Close()
reader, err := apiClient.ImagePull(ctx, "docker.io/library/alpine", client.ImagePullOptions{})
if err != nil {
panic(err)
}
io.Copy(os.Stdout, reader)
resp, err := apiClient.ContainerCreate(ctx, client.ContainerCreateOptions{
Image: "alpine",
Config: &container.Config{
Cmd: []string{"echo", "hello world"},
},
})
if err != nil {
panic(err)
}
if _, err := apiClient.ContainerStart(ctx, resp.ID, client.ContainerStartOptions{}); err != nil {
panic(err)
}
wait := apiClient.ContainerWait(ctx, resp.ID, client.ContainerWaitOptions{})
select {
case err := <-wait.Error:
if err != nil {
panic(err)
}
case <-wait.Result:
}
out, err := apiClient.ContainerLogs(ctx, resp.ID, client.ContainerLogsOptions{ShowStdout: true})
if err != nil {
panic(err)
}
stdcopy.StdCopy(os.Stdout, os.Stderr, out)
}
{{< /tab >}} {{< tab name="Python" >}}
import docker
client = docker.from_env()
print(client.containers.run("alpine", ["echo", "hello", "world"]))
{{< /tab >}} {{< tab name="HTTP" >}}
$ curl --unix-socket /var/run/docker.sock -H "Content-Type: application/json" \
-d '{"Image": "alpine", "Cmd": ["echo", "hello world"]}' \
-X POST http://localhost/v{{% param "latest_engine_api_version" %}}/containers/create
{"Id":"1c6594faf5","Warnings":null}
$ curl --unix-socket /var/run/docker.sock -X POST http://localhost/v{{% param "latest_engine_api_version" %}}/containers/1c6594faf5/start
$ curl --unix-socket /var/run/docker.sock -X POST http://localhost/v{{% param "latest_engine_api_version" %}}/containers/1c6594faf5/wait
{"StatusCode":0}
$ curl --unix-socket /var/run/docker.sock "http://localhost/v{{% param "latest_engine_api_version" %}}/containers/1c6594faf5/logs?stdout=1"
hello world
When using cURL to connect over a Unix socket, the hostname is not important. The previous
examples use localhost, but any hostname would work.
[!IMPORTANT]
The previous examples assume you're using cURL 7.50.0 or above. Older versions of cURL used a non-standard URL notation when using a socket connection.
If you're' using an older version of cURL, use
http:/<API version>/instead, for example:http:/v{{% param "latest_engine_api_version" %}}/containers/1c6594faf5/start.
{{< /tab >}} {{< /tabs >}}
For more examples, take a look at the SDK examples.
There are a number of community supported libraries available for other languages. They haven't been tested by Docker, so if you run into any issues, file them with the library maintainers.
| 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 |