Contenedores Docker en Debian 12
¿Que es docker?
Docker es una herramienta que permite crear, desplegar y ejecutar aplicaciones en contenedores. Los contenedores permiten empaquetar una aplicación con todas sus dependencias en una virtualización ligera que se puede ejecutar en cualquier máquina con Linux.
Requisitos
- Sistema Debian 12 actualizado.
- Privilegios de root o sudo.
- Acceso a internet.
- Conocimientos básicos de virtualización o contenedores.
Instalación de docker
Para instalar docker en Debian 12 solo debemos ejecutar el siguiente comando:
root@docker:~# apt install docker.io -y
Ejecución de un contenedor simple
El primer contene que vamos a ejecutar es el de hello-world, para ello ejecutamos el siguiente comando:
root@docker:~# docker run hello-world
Al ejecutarse el contenedor se descargará la imagen de hello-world y se ejecutará, mostrando el siguiente mensaje:
Salida:
root@docker:~# docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
719385e32844: Pull complete
Digest: sha256:4f53e2564790c8e7856ec08e384732aa38dc43c52f02952483e3f003afbf23db
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/
Listar contenedores
Para listar los contenedores que tenemos en ejecución ejecutamos el siguiente comando:
root@docker:~# docker ps
En este caso no tenemos ningún contenedor en ejecución, porque el contenedor hello-world se ejecuta y se detiene automáticamente.
Salida:
root@docker:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
Si queremos listar todos los contenedores que tenemos en ejecución y los que no, ejecutamos el siguiente comando:
root@docker:~# docker ps -a
Salida:
root@docker:~# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
914b3660f2e2 hello-world "/hello" 19 minutes ago Exited (0) 18 minutes ago vibrant_ramanujan
Eliminar contenedores
Para eliminar un contenedor que no está en ejecución, ejecutamos el siguiente comando con el id del contenedor:
root@docker:~# docker rm 914b3660f2e2
Ejecución de un contenedor interactivo
El siguiente contenedor que vamos a ejecutar será con la imagen de debian, para ello ejecutamos el siguiente comando:
root@docker:~# docker run -it debian bash
Al ejecutar este comando se descargará la imagen de debian y se ejecutará el contenedor, pero en este caso se ejecutará en modo interactivo y podremos ejecutar comandos dentro del contenedor.
Salida:
root@docker:~# docker run -it debian bash
root@ad35ecaad6aa:/#
Al salir del contenedor, este se detendrá automáticamente. Para volver a ejecutar el contenedor y conectarnos a el, debemos ejecutar los siguientes comandos:
root@docker:~# docker start ad35ecaad6aa
root@docker:~# docker attach ad35ecaad6aa
Tambien podemos ejecutar comandos en el contendos sin necesidad de conectarnos a el, para ello ejecutamos el siguiente comando:
root@docker:~# docker exec ad35ecaad6aa ls -l
Salida:
root@docker:~# docker exec ad35ecaad6aa ls -l
total 48
lrwxrwxrwx 1 root root 7 Sep 19 00:00 bin -> usr/bin
drwxr-xr-x 2 root root 4096 Jul 14 16:00 boot
drwxr-xr-x 5 root root 360 Sep 21 10:03 dev
drwxr-xr-x 1 root root 4096 Sep 21 09:58 etc
drwxr-xr-x 2 root root 4096 Jul 14 16:00 home
lrwxrwxrwx 1 root root 7 Sep 19 00:00 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Sep 19 00:00 lib32 -> usr/lib32
lrwxrwxrwx 1 root root 9 Sep 19 00:00 lib64 -> usr/lib64
lrwxrwxrwx 1 root root 10 Sep 19 00:00 libx32 -> usr/libx32
drwxr-xr-x 2 root root 4096 Sep 19 00:00 media
drwxr-xr-x 2 root root 4096 Sep 19 00:00 mnt
drwxr-xr-x 2 root root 4096 Sep 19 00:00 opt
dr-xr-xr-x 144 root root 0 Sep 21 10:03 proc
drwx------ 2 root root 4096 Sep 19 00:00 root
drwxr-xr-x 3 root root 4096 Sep 19 00:00 run
lrwxrwxrwx 1 root root 8 Sep 19 00:00 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Sep 19 00:00 srv
dr-xr-xr-x 13 root root 0 Sep 21 10:03 sys
drwxrwxrwt 2 root root 4096 Sep 19 00:00 tmp
drwxr-xr-x 14 root root 4096 Sep 19 00:00 usr
drwxr-xr-x 11 root root 4096 Sep 19 00:00 var
Ejecución de un contenedor con un servidor web
En el siguiente contenedor utilizaremos la imagen de apache, para ello ejecutamos el siguiente comando:
root@docker:~# docker run -d -p 8080:80 httpd
- -d: Ejecuta el contenedor en segundo plano. (El ejecutar el contenedor en segundo plano, no nos ocupa la terminal con la salida de logs del contenedor)
- -p: Mapea el puerto 8080 del host al puerto 80 del contenedor.
Si nos dirigimos a un navegador web y escribimos la dirección ip de la máquina donde estamos ejecutando el contenedor, seguido del puerto 8080, podremos ver la página de apache.
Si queremos modificar la página de apache, tenemos que conectarnos al contenedor y modificar el archivo index.html, para ello ejecutamos los siguientes comandos:
root@docker:~# docker exec -it 0f6014063c93 bash
root@0f6014063c93:/usr/local/apache2# echo "<h1>Prueba servidor web</h1>" > htdocs/index.html
Refrescamos la página del navegador y podremos ver la página de apache modificada.
Otra forma de modificar la página es utilizando el comando que ejecutamos dentro del contenedor desde fuera con docker exec, para ello ejecutamos el siguiente comando:
root@docker:~# docker exec 0f6014063c93 bash -c 'echo "<h1>Prueba2 servidor web</h1>" > /usr/local/apache2/htdocs/index.html'
Si refrescamos la página del navegador, podremos ver la página de apache modificada.
Ejecución de un contenedor con variables
En el siguiente contenedor utilizaremos la imagen de mariadb y con las variables modificaremos la contraseña de root y creamos una base de datos, para ello ejecutamos el siguiente comando:
root@docker:~# docker run -d -p 3306:3306 -e MARIADB_ROOT_PASSWORD=pass123 -e MARIADB_DATABASE=dbprueba mariadb
Nota: Cada imagen de docker contiene variables diferentes o pueden incluso no tenerlas, para saber que variables tiene una imagen podemos consultar su documentación en la página de docker hub.
- -e: Permite definir variables de entorno dentro del contenedor.
Una vez el contenedor esté en ejecución, podremos conectarnos a la base de datos ya sea con un cliente sql de escritorio o desde consola, en mi caso lo haré desde consola, para ello ejecutamos el siguiente comando:
mysql -u root -p -h 192.168.50.45
- -u: Usuario de la base de datos.
- -p: Contraseña del usuario de la base de datos. (Indica que el usuario tiene contraseña, en este caso la contraseña es la que hemos definido en la variable MARIADB_ROOT_PASSWORD).
- -h: Host de la base de datos.
Salida:
root@Docker:~# mysql -u root -p -h 192.168.50.45
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 7
Server version: 11.1.2-MariaDB-1:11.1.2+maria~ubu2204 mariadb.org binary distribution
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]>
Con el comando show databases; podremos ver las bases de datos que tenemos creadas.
MariaDB [(none)]> show databases;
Como podemos ver, tenemos la base de datos que indicamos en la variable MARIADB_DATABASE en mi caso dbprueba.
Salida:
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| dbprueba |
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0,000 sec)
MariaDB [(none)]>