# Contextos de Docker


## Introducción

Esta guía muestra cómo puedes utilizar los contextos para gestionar daemons de Docker desde un único cliente.

Cada contexto contiene toda la información necesaria para gestionar recursos en el daemon. El comando `docker context` facilita la configuración de estos contextos y el cambio entre ellos.

Como ejemplo, un único cliente de Docker podría configurarse con dos contextos:

- Un contexto predeterminado (default) que se ejecuta localmente.
- Un contexto remoto compartido.

Una vez configurados estos contextos, puedes utilizar el comando `docker context use <nombre-contexto>` para cambiar entre ellos.

## Requisitos previos

Para seguir los ejemplos de esta guía, necesitarás:

- Un cliente de Docker que admita el comando de nivel superior `context`.

Ejecuta `docker context` para verificar que tu cliente de Docker admite los contextos.

## Anatomía de un contexto

Un contexto es la combinación de varias propiedades. Estas incluyen:

- Nombre y descripción.
- Configuración del punto de conexión (endpoint).
- Información de TLS.

Para enumerar los contextos disponibles, utiliza el comando `docker context ls`.

```console
$ docker context ls
NAME        DESCRIPTION                               DOCKER ENDPOINT               ERROR
default *                                             unix:///var/run/docker.sock
```

Esto muestra un único contexto llamado "default". Está configurado para comunicarse con un daemon a través del socket Unix local `/var/run/docker.sock`.

El asterisco en la columna `NAME` indica que este es el contexto activo. Esto significa que todos los comandos `docker` se ejecutan contra este contexto, a menos que se invaliden con variables de entorno como `DOCKER_HOST` y `DOCKER_CONTEXT`, o en la línea de comandos con los flags `--context` y `--host`.

Indaga un poco más con `docker context inspect`. El siguiente ejemplo muestra cómo inspeccionar el contexto llamado `default`.

```console
$ docker context inspect default
[
    {
        "Name": "default",
        "Metadata": {},
        "Endpoints": {
            "docker": {
                "Host": "unix:///var/run/docker.sock",
                "SkipTLSVerify": false
            }
        },
        "TLSMaterial": {},
        "Storage": {
            "MetadataPath": "\u003cIN MEMORY\u003e",
            "TLSPath": "\u003cIN MEMORY\u003e"
        }
    }
]
```

### Crear un nuevo contexto

Puedes crear nuevos contextos con el comando `docker context create`.

El siguiente ejemplo crea un nuevo contexto llamado `docker-test` y especifica el punto de conexión del host del contexto en el socket TCP `tcp://docker:2375`.

```console
$ docker context create docker-test --docker host=tcp://docker:2375
docker-test
Successfully created context "docker-test"
```

El nuevo contexto se almacena en un archivo `meta.json` bajo `~/.docker/contexts/`. Cada nuevo contexto que creas obtiene su propio `meta.json` almacenado en un subdirectorio dedicado de `~/.docker/contexts/`.

Puedes ver el nuevo contexto con `docker context ls` y `docker context inspect <nombre-contexto>`.

```console
$ docker context ls
NAME          DESCRIPTION                             DOCKER ENDPOINT               ERROR
default *                                             unix:///var/run/docker.sock
docker-test                                           tcp://docker:2375
```

El contexto actual se indica con un asterisco ("\*").

## Utilizar un contexto diferente

Puedes utilizar `docker context use` para cambiar entre contextos.

El siguiente comando cambiará la CLI de `docker` para utilizar el contexto `docker-test`.

```console
$ docker context use docker-test
docker-test
Current context is now "docker-test"
```

Verifica la operación enumerando todos los contextos y asegurándote de que el asterisco ("\*") esté junto al contexto `docker-test`.

```console
$ docker context ls
NAME            DESCRIPTION                           DOCKER ENDPOINT               ERROR
default                                               unix:///var/run/docker.sock
docker-test *                                         tcp://docker:2375
```

Los comandos `docker` ahora se dirigirán a los puntos de conexión definidos en el contexto `docker-test`.

También puedes configurar el contexto actual utilizando la variable de entorno `DOCKER_CONTEXT`. La variable de entorno invalida el contexto establecido con `docker context use`.

Utiliza el comando adecuado a continuación para establecer el contexto en `docker-test` mediante una variable de entorno.

**PowerShell**



```ps
> $env:DOCKER_CONTEXT='docker-test'
```

**Bash**



```console
$ export DOCKER_CONTEXT=docker-test
```



Ejecuta `docker context ls` para verificar que el contexto `docker-test` es ahora el contexto activo.

También puedes utilizar el flag global `--context` para invalidar el contexto. El siguiente comando utiliza un contexto llamado `production`.

```console
$ docker --context production container ls
```

## Exportar e importar contextos de Docker

Puedes utilizar los comandos `docker context export` y `docker context import` para exportar e importar contextos en diferentes hosts.

El comando `docker context export` exporta un contexto existente a un archivo. El archivo se puede importar en cualquier host que tenga instalado el cliente `docker`.

### Exportar e importar un contexto

El siguiente ejemplo exporta un contexto existente llamado `docker-test`. Se escribirá en un archivo llamado `docker-test.dockercontext`.

```console
$ docker context export docker-test
Written file "docker-test.dockercontext"
```

Comprueba el contenido del archivo de exportación.

```console
$ cat docker-test.dockercontext
```

Importa este archivo en otro host utilizando `docker context import` para crear un contexto con la misma configuración.

```console
$ docker context import docker-test docker-test.dockercontext
docker-test
Successfully imported context "docker-test"
```

Puedes verificar que el contexto se importó con `docker context ls`.

El formato del comando de importación es `docker context import <nombre-contexto> <archivo-contexto>`.

## Actualizar un contexto

Puedes utilizar `docker context update` para actualizar campos en un contexto existente.

El siguiente ejemplo actualiza el campo de descripción en el contexto existente `docker-test`.

```console
$ docker context update docker-test --description "Contexto de prueba"
docker-test
Successfully updated context "docker-test"
```

