Fecha: 2018-04-16 Tiempo de lectura: 3 minutos Categoría: Operaciones Tags: docker / cliente / contenedor
Curioso de ver como mucho contenedores eran capaces de ver el contenido Docker de mi servidor, he decidido aprender como se hace, por si me hiciera falta en un futuro. En este artículo intento explicar las lecciones aprendidas, de forma que sean una futura referencia en caso de ser necesario.
El primer paso para conseguir mi objetivo era tener el binario docker en un contenedor. Una opción es copiarlo de mi servidor, junto con todas las dependencias; una opción más cuerda es aprovecharme de los paquetes existentes para ello.
Así pues, vamos a partir de un Alpine Linux, que por su tamaño, su seguridad y su magnífico gestor de paquetes, se hace el candidato ideal:
gerard@atlantis:~/projects/docker-client$ cat Dockerfile
FROM alpine:3.7
RUN apk add --no-cache docker && \
rm /usr/bin/docker-proxy && \
rm /usr/bin/docker-containerd-shim && \
rm /usr/bin/docker-runc && \
rm /usr/bin/docker-containerd-ctr && \
rm /usr/bin/docker-containerd && \
rm /usr/bin/dockerd
gerard@atlantis:~/projects/docker-client$
TRUCO: El paquete docker en Alpine Linux ocupa mucho espacio. Esto es debido a que incluye todos los binarios necesarios para ejecutar también el servidor. Como no nos interesa el servidor en un contenedor, los he eliminado.
Lo construímos para llegar a una imagen adecuada, que vamos a etiquetar docker-client:
gerard@atlantis:~/projects/docker-client$ docker build -t docker-client .
Sending build context to Docker daemon 2.048kB
...
Successfully built 583d47952c7a
Successfully tagged docker-client:latest
gerard@atlantis:~/projects/docker-client$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker-client latest 583d47952c7a 7 seconds ago 30.2MB
alpine 3.7 3fd9065eaf02 4 weeks ago 4.15MB
gerard@atlantis:~/projects/docker-client$
La ejecución de un contenedor desde la nueva imagen nos permite usar el comando docker, aunque los resultados no son los esperados.
gerard@atlantis:~/projects/docker-client$ docker run -ti --rm docker-client
/ # docker images
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
/ #
Esto es debido a que el cliente de Docker se comunica con el servidor mediante un unix socket que, al no tener el servicio corriendo, no está creado.
Como sabemos, absolutamente todo en Linux es un fichero, y podemos montar ficheros desde el servidor como host volumes. Por ejemplo:
gerard@atlantis:~/projects/docker-client$ docker run -ti --rm -v /var/run/docker.sock:/var/run/docker.sock docker-client
/ # docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker-client latest 583d47952c7a 5 minutes ago 30.2MB
alpine 3.7 3fd9065eaf02 4 weeks ago 4.15MB
/ #
El resultado es que vemos el contenido del servidor Docker del host, justo como queríamos. Cabe decir que no solo podemos listar las imágenes del host, sino que podemos controlar el ciclo de vida de un contenedor (docker run, docker start, docker restart, docker stop) e incluso ejecutar en ellos cosas (docker exec).
Esto va a tener muchas aplicaciones prácticas en el futuro, seguro…