Explicamos en este artículo cómo instalar Docker en Debian 9 Stretch paso a paso, de modo que puedas lanzar aplicaciones y servicios aislados en contenedores sobre tu servidor o VPS Debian.
Tabla de contenidos
Antes de instalar Docker en Debian 9 Stretch
Para poder seguir los pasos de esta guía de instalación de Docker en Debian 9 Stretch será necesario partir del siguiente escenario:
- Una máquina Debian 9 Stretch actualizado.
- Un usuario con privilegios de sudo.
- Acceso a Internet.
Además necesitamos algunas herramientas del sistema que obtendremos de los repositorios de Debian 9, para lo que los actualizamos:
~$ sudo apt update
E instalamos los paquetes relacionados:
~$ sudo apt install -y apt-transport-https wget
Cómo configurar el repositorio de Docker para Debian 9 Stretch
Necesitamos configurar el repositorio oficial de Docker para Debian 9 Stretch, para lo que creamos un nuevo archivo de repositorio en el directorio de repositorios de apt:
~$ sudo nano /etc/apt/sources.list.d/docker.list
Con el siguiente contenido:
deb [arch=amd64] https://download.docker.com/linux/debian stretch stable
Guardamos los cambios y cerramos el archivo.
Instalamos la clave pública para comprobar las firmas de los paquetes procedentes del nuevo repositorio:
~$ wget https://download.docker.com/linux/debian/gpg -O- | sudo apt-key add
Ya podemos actualizar las listas de paquetes de los repositorios del sistema, que ahora incluirán también el nuevo repositorio de Docker:
~$ sudo apt update
Cómo instalar Docker en Debian 9 Stretch
Para instalar Docker en Debian 9 Stretch instalaremos los siguientes paquetes desde el repositorio que acabamos de configurar:
~$ sudo apt install -y containerd.io docker-ce docker-ce-cli
Tras la descarga e instalación de Docker se crean nuevos servicios en Debian 9, los servicios containerd.service y docker.service, o simplemente containerd y docker, que quedan en ejecución y habilitados para su inicio automático en cada arranque del sistema.
Podemos comprobar en cualquier momento el estado de ambos servicios con el comando systemctl status containerd docker
:
Cómo saber la versión de Docker instalada en Debian 9
Si necesitas saber con qué versión de Docker estás trabajando puedes averiguarlo con la opción -v del comando docker:
~$ docker -v Docker version 19.03.15, build 99e3ed8919
Cómo probar Docker en Debian 9 Stretch
Vamos a probar la nueva instalación de Docker en Debian 9 lanzando nuestro primer contenedor mediante la opción run del comando docker:
~$ sudo docker run hello-world Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world 1b930d010525: Pull complete Digest: sha256:4df8ca8a7e309c256d60d7971ea14c27672fc0d10c5f303856d7bc48f8cc17ff Status: Downloaded newer image for hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (amd64) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker ID: https://hub.docker.com/ For more examples and ideas, visit: https://docs.docker.com/get-started/
Este comando lanza un contenedor a partir de una imagen, hello-world en este caso, que no está presente en el sistema, por lo que se descarga dicha imagen y a continuación se instancia el contenedor a partir de la misma.
La siguiente vez que se lance el comando anterior ya no será necesario descargar la imagen, porque está disponible localmente:
~$ sudo docker run hello-world
Cómo utilizar Docker en Debian 9
Trabajar con Docker sin sudo
Puede que sea molesto tener que estar continuamente utilizando sudo para trabajar con Docker, pero esto se soluciona fácilmente añadiendo los usuarios de Debian 9 que vayan a trabajar con Docker al grupo docker:
~$ sudo adduser chacho docker
La configuración de grupos no será efectiva hasta el siguiente inicio de sesión del usuario. En ese momento ya será posible lanzar docker sin sudo:
~$ docker run hello-world Hello from Docker! ...
Estado de los contenedores
Como puede que en este momento hayas lanzado varias veces el mismo comando sobre la misma imagen, es importante saber que cada vez se ha creado un contenedor distinto. Esto es fácil de ver mediante el comando ps de Docker:
~$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 036be72b196d hello-world "/hello" 5 minutes ago Exited (0) 5 minutes ago ecstatic_euclid b393a807da07 hello-world "/hello" 6 minutes ago Exited (0) 6 minutes ago hopeful_rosalind fb18da422e4d hello-world "/hello" 13 minutes ago Exited (0) 13 minutes ago zen_chatterjee 2fdb7c59b842 hello-world "/hello" 17 minutes ago Exited (0) 17 minutes ago focused_sinoussi
El modificador -a muestra todos los contenedores disponibles, incluso los ya finalizados.
Se mostrará información de todos los contenedores creados en Debian 9 organizada en las siguientes columnas:
- «CONTAINER ID«: El identificador que Docker crea para manejar cada contenedor.
- «IMAGE«: La imagen desde la que se crea el contenedor.
- «COMMAND«: El comando que se ha ejecutado en el contenedor.
- «CREATED«: Fecha de creación del contenedor.
- «STATUS«: Estado actual del contenedor, en este ejemplo todos los contenedores finalizaron su ejecución.
- «PORTS«: Puertos de conexión que expone el contenedor, en caso de tratarse de servicios.
- «NAMES«: Nombres aleatorios que Docker asigna a cada contenedor, si el usuario no indica ninguno, para facilitar su uso.
Eliminar contenedores
Como no tienen mucho uso, podemos eliminar todos estos contenedores mediante el comando rm de Docker especificando el identificador:
~$ docker rm 036be72b196d
O también podríamos especificar el nombre:
~$ docker rm hopeful_rosalind
Usaremos este comando para eliminar todos los contenedores inservibles, teniendo en cuenta que lo que se borra es los contenedores, no la imagen desde la que se instancian.
Lanzar un contenedor Docker en ejecución en segundo plano en Debian 9
En esta ocasión vamos a crear un contenedor de un servicio desde su imagen correspondiente (que se descargará al no estar disponible localmente), especificando un nombre personalizado para reutilizar fácilmente el contenedor (opción –name), lanzándolo en segundo plano (opción –d) y enlazando el puerto interno del servicio del contenedor con un puerto de la máquina Debian 9 (opción -p):
~$ docker run --name webserver -d -p 80:80 nginx
Sabremos que todo ha ido bien al ver el identificador devuelto en consola. Pero si usamos el comando ps de Docker comprobaremos que efectivamente el contenedor no ha finalizado su ejecución:
~$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e1619596d5da nginx "/docker-entrypoint.…" 7 seconds ago Up 5 seconds 0.0.0.0:80->80/tcp webserver
Como hemos mapeado el puerto del servicio del contenedor, podemos conectar a través del puerto local de la máquina Debian 9, por ejemplo, con el comando wget:
~$ wget localhost -qO-
Obtenemos la página por defecto del servicio web del contenedor, que se verá bastante mejor si en lugar de desde consola conectamos desde un navegador.
Lanzar comandos dentro de un contenedor
Es posible lanzar comandos en un contenedor en ejecución con el comando exec de Docker:
~$ docker exec webserver ls -l total 72 drwxr-xr-x 2 root root 4096 Mar 29 00:00 bin drwxr-xr-x 2 root root 4096 Mar 19 23:44 boot drwxr-xr-x 5 root root 340 Apr 6 12:28 dev drwxr-xr-x 1 root root 4096 Mar 31 05:24 docker-entrypoint.d -rwxrwxr-x 1 root root 1202 Mar 31 05:24 docker-entrypoint.sh drwxr-xr-x 1 root root 4096 Apr 6 12:28 etc drwxr-xr-x 2 root root 4096 Mar 19 23:44 home drwxr-xr-x 1 root root 4096 Mar 31 05:24 lib drwxr-xr-x 2 root root 4096 Mar 29 00:00 lib64 drwxr-xr-x 2 root root 4096 Mar 29 00:00 media drwxr-xr-x 2 root root 4096 Mar 29 00:00 mnt drwxr-xr-x 2 root root 4096 Mar 29 00:00 opt dr-xr-xr-x 81 root root 0 Apr 6 12:28 proc drwx------ 2 root root 4096 Mar 29 00:00 root drwxr-xr-x 1 root root 4096 Apr 6 12:28 run drwxr-xr-x 2 root root 4096 Mar 29 00:00 sbin drwxr-xr-x 2 root root 4096 Mar 29 00:00 srv dr-xr-xr-x 13 root root 0 Apr 6 11:38 sys drwxrwxrwt 1 root root 4096 Mar 31 05:24 tmp drwxr-xr-x 1 root root 4096 Mar 29 00:00 usr drwxr-xr-x 1 root root 4096 Mar 29 00:00 var
En este ejemplo, los archivos y directorios mostrados pertenecen al sistema de archivos del contenedor, no al de la máquina Debian 9. Al terminar la ejecución del comando, se recupera el control de la consola. Sin embargo, podemos trabajar interactivamente con un contenedor usando el parámetro -it y lanzando un comando interactivo que esté includo en el contenedor. Por ejemplo, el contenedor con que trabajamos cuenta con una shell de comandos como bash o sh:
~$ docker exec -it webserver bash root@81c62342d206:/#
El cambio que refleja la terminal indica que a partir de este momento trabajamos sobre el contenedor.
Al recuperar la línea de comandos de Debian 9, saliendo de la shell con exit, el contenedor seguirá en ejecución.
Detener un contenedor
Para detener la ejecución del contenedor en segundo plano, usaremos el comando stop de Docker, indicando el identificador o nombre del contenedor:
~$ docker stop webserver
Reanudar un contenedor
Como ya sabemos que cuando finaliza un contenedor no desaparece, podemos volver a lanzarlo y reutilizarlo con el comando start, usando su identificador o, mejor aún, el nombre personalizado que indicamos al crearlo:
~$ docker start webserver
En esta ocasión no será necesario indicar el mapeo de puertos, ejecución en segundo plano, etc. porque todo ello forma parte del estado con el que se creó el contenedor.
Conclusión
Ahora que sabes cómo instalar Docker en Debian 9 Stretch paso a paso ya tienes una base para empezar a trabajar y experimentar con contenedores con la pequeña introducción de esta guía.
Si este tutorial te ha resultado útil y puedes trabajar con contenedores en tu sistema, puedes agradecérnoslo invitándonos a un café:
O también puedes dejar una propina desde PayPal:
¡Gracias!