# Desarrollar con los SDKs de Docker Engine


Docker proporciona una API para interactuar con el demonio de Docker (llamada API de Docker Engine), así como SDKs para Go y Python. Los SDKs te permiten compilar y escalar de manera eficiente aplicaciones y soluciones de Docker. Si Go o Python no se adaptan a tus necesidades, puedes usar la API de Docker Engine directamente.

La API de Docker Engine es una API RESTful a la que se accede mediante un cliente HTTP como `wget` o `curl`, o la biblioteca HTTP que forma parte de la mayoría de los lenguajes de programación modernos.

## Instalar los SDKs

Usa los siguientes comandos para instalar el SDK de Go o Python. Ambos SDKs se pueden instalar y coexistir juntos.

### SDK de Go

```console
$ go get github.com/moby/moby/client
```

El cliente requiere una versión reciente de Go. Ejecuta `go version` y asegúrate de que estás ejecutando una versión de Go actualmente compatible.

Para obtener más información, consulta la [referencia del cliente de Go](https://pkg.go.dev/github.com/moby/moby/client).

### SDK de Python

- Recomendado: Ejecuta `pip install docker`.

- Si no puedes usar `pip`:
  1.  [Descarga el paquete directamente](https://pypi.python.org/pypi/docker/).
  2.  Extráelo y cámbiate al directorio extraído.
  3.  Ejecuta `python setup.py install`.

Para obtener más información, consulta la [referencia del SDK de Python para Docker Engine](https://docker-py.readthedocs.io/).

> [!NOTE]
> Usuarios de Docker Desktop para Linux
>
> Docker Desktop para Linux utiliza un socket por usuario en lugar del `/var/run/docker.sock` del sistema. Para usar los SDKs de Docker con Docker Desktop para Linux, establece la variable de entorno `DOCKER_HOST`:
>
> ```bash
> export DOCKER_HOST=unix://$HOME/.docker/desktop/docker.sock
> ```
>
> Para obtener más detalles, consulta las [preguntas frecuentes de Linux](/desktop/troubleshoot-and-support/faqs/linuxfaqs/#how-do-i-use-docker-sdks-with-docker-desktop-for-linux).

## Ver la referencia de la API

Puedes
[ver la referencia de la última versión de la API](/reference/api/engine/latest/)
o [elegir una versión específica](/reference/api/engine/#api-version-matrix).

## API y SDK con versiones

La versión de la API de Docker Engine que debes usar depende de la versión de
tu demonio de Docker y de tu cliente de Docker. Consulta la sección de [API y SDK con versiones](/reference/api/engine/#versioned-api-and-sdk)
en la documentación de la API para obtener más detalles.

## Inicio rápido de SDK y API

Usa las siguientes pautas para elegir la versión del SDK o de la API que usarás en tu código:

- Si estás comenzando un proyecto nuevo, usa la [última versión](/reference/api/engine/latest/),
  pero utiliza la negociación de versión de la API o especifica la versión que estás usando. Esto
  ayuda a evitar sorpresas.
- Si necesitas una nueva característica, actualiza tu código para usar al menos la versión mínima
  que admita dicha característica, y prefiere la última versión que puedas usar.
- De lo contrario, continúa usando la versión que ya esté utilizando tu código.

Como ejemplo, el comando `docker run` se puede implementar utilizando la
API de Docker directamente, o mediante el SDK de Python o Go.

**Go**



```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)
}
```

**Python**



```python
import docker
client = docker.from_env()
print(client.containers.run("alpine", ["echo", "hello", "world"]))
```

**HTTP**



```console
$ curl --unix-socket /var/run/docker.sock -H "Content-Type: application/json" \
  -d '{"Image": "alpine", "Cmd": ["echo", "hello world"]}' \
  -X POST http://localhost/v1.54/containers/create
{"Id":"1c6594faf5","Warnings":null}

$ curl --unix-socket /var/run/docker.sock -X POST http://localhost/v1.54/containers/1c6594faf5/start

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

$ curl --unix-socket /var/run/docker.sock "http://localhost/v1.54/containers/1c6594faf5/logs?stdout=1"
hello world
```

Cuando se utiliza cURL para conectarse a través de un socket Unix, el nombre de host no es importante. Los ejemplos anteriores usan `localhost`, pero cualquier nombre de host funcionaría.

> [!IMPORTANT]
>
> Los ejemplos anteriores asumen que estás usando cURL 7.50.0 o superior. Las versiones anteriores de cURL utilizaban una [notación de URL no estándar](https://github.com/moby/moby/issues/17960) al realizar conexiones a través de un socket.
>
> Si estás usando una versión anterior de cURL, utiliza `http:/<versión de la API>/` en su lugar, por ejemplo: `http:/v1.54/containers/1c6594faf5/start`.



Para ver más ejemplos, echa un vistazo a los [ejemplos de SDK](/reference/api/engine/sdk/examples/).

## Bibliotecas no oficiales

Existe una serie de bibliotecas compatibles con la comunidad disponibles para otros lenguajes. No han sido probadas por Docker, por lo que si experimentas algún problema, comunícalo a los mantenedores de la biblioteca correspondientes.

| Lenguaje | Biblioteca                                                                  |
| :------- | :-------------------------------------------------------------------------- |
| C        | [libdocker](https://github.com/danielsuo/libdocker)                         |
| C#       | [Docker.DotNet](https://github.com/testcontainers/Docker.DotNet)            |
| C++      | [lasote/docker_client](https://github.com/lasote/docker_client)             |
| Clojure  | [clj-docker-client](https://github.com/into-docker/clj-docker-client)       |
| Clojure  | [contajners](https://github.com/lispyclouds/contajners)                     |
| Dart     | [bwu_docker](https://github.com/bwu-dart/bwu_docker)                        |
| Erlang   | [erldocker](https://github.com/proger/erldocker)                            |
| Gradle   | [gradle-docker-plugin](https://github.com/gesellix/gradle-docker-plugin)    |
| Groovy   | [docker-client](https://github.com/gesellix/docker-client)                  |
| Haskell  | [docker-hs](https://github.com/denibertovic/docker-hs)                      |
| Java     | [docker-client](https://github.com/spotify/docker-client)                   |
| Java     | [docker-java](https://github.com/docker-java/docker-java)                   |
| Java     | [docker-java-api](https://github.com/amihaiemil/docker-java-api)            |
| Java     | [jocker](https://github.com/ndeloof/jocker)                                 |
| NodeJS   | [dockerode](https://github.com/apocas/dockerode)                            |
| NodeJS   | [harbor-master](https://github.com/arhea/harbor-master)                     |
| NodeJS   | [the-moby-effect](https://github.com/leonitousconforti/the-moby-effect)     |
| Perl     | [Eixo::Docker](https://github.com/alambike/eixo-docker)                     |
| PHP      | [Docker-PHP](https://github.com/docker-php/docker-php)                      |
| Ruby     | [docker-api](https://github.com/swipely/docker-api)                         |
| Rust     | [bollard](https://github.com/fussybeaver/bollard)                           |
| Rust     | [docker-rust](https://github.com/abh1nav/docker-rust)                       |
| Rust     | [shiplift](https://github.com/softprops/shiplift)                           |
| Scala    | [tugboat](https://github.com/softprops/tugboat)                             |
| Scala    | [reactive-docker](https://github.com/almoehi/reactive-docker)               |
| Swift    | [docker-client-swift](https://github.com/valeriomazzeo/docker-client-swift) |

