Tal y como quedamos la semana pasada, en el artículo de introducción llamado «Docker, una guia no convencional«, continuamos con la serie; en este caso el tema del artículo será la instalación sobre un sistema operativo, de tal forma que podremos extraer todas las posibilidades que nos brinda Docker.
Para la ocasión, dentro de la gran diversidad del mundo del Ñu y el Pingüino, he escogido Centos 7.
Instalación de Docker CE
Antes de nada debemos tener el host conectado a la red y actualizado a la última versión, a ser posible. Los repositorios de CentOS ya tienen disponibles diferentes paquetes de Docker, pero no los vamos a utilizar.
Vamos a instalar, antes de nada, una serie de paquete previos:
yum install -y yum-utils device-mapper-persistent-data lvm2
En este caso utilizaremos los propios de Docker. De la siguiente manera:
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
Esto hará que nos aparezca un fichero con los repositorios añadidos en /etc/yum.repos.d/docker-ce.repo
Instalamos la versión comunitaria de Docker:
yum install docker-ce
Una vez instalado, si utilizamos un proxy, debemos configurarlo. Para ello podéis seguir la pequeña guía al respecto que escribí en mi página web. Añadimos Docker al inicio y lo encendemos:
systemctl enable docker systemctl start docker
Para obtener más información sobre la instalación de Docker en otras distribuciones y plataformas podéis consultar el siguiente enlace.
Ahora ya podemos pasar al siguiente apartado, donde vamos ver diferentes ejemplos de uso.
Laboratorio de pruebas
Para ver su funcionamiento vamos realizar algunas pruebas. Primero de todo ejecutamos:
docker run -ti debian echo hola
De esta manera usamos los parámetros ‘-t’, que crea una pseudo tty, iniciando el contenedor con la posibilidad de acceder a su terminal, y, además ‘-i’, que indica que es de modo interactivo. Indicamos también que usaremos una imagen llamada “debian” que, si no la tenemos en el sistema, la descargará de los repositorios.
Con el resultado:
[root@centos7 ~]# docker run -ti debian echo hola Hola
Otro comando muy útil es docker ps -a
, con el que podemos visualizar todos los procesos de Docker:
[root@centos7 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES fa91ef51401d debian "echo hola" 31 seconds ago Exited (0) 29 seconds ago friendly_euclid
Se pueden listar las imágenes disponibles. Estas son las que tengo ahora mismo en la máquina de pruebas:
[root@centos7 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nickistre/centos-lamp latest 3d8b86c3bd87 10 days ago 538MB hello-world latest f2a91732366c 2 weeks ago 1.85kB debian latest 6d83de432e98 5 weeks ago 100M
Bien, a continuación vamos a crear un contenedor a partir de una imagen. A su vez nos conectaremos a su Shell:
docker run -ti 3d8b86c3bd87 /bin/bash
Una vez dentro del contenedor podemos salir con la combinación de teclas: CTRL + PQ
Y volvemos a consultar los contenedores que tenemos actualmente funcionando:
[root@centos7 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 543e8a6eb95a 3d8b86c3bd87 "/bin/bash" About a minute ago Up About a minute 22/tcp, 80/tcp, 443/tcp heuristic_liskov fa91ef51401d debian "echo hola" 4 minutes ago Exited (0) 4 minutes ago friendly_euclid
Si queremos acceder al contenedor desde la consola de comandos debemos utilizar el parámetro ‘attach‘ más su nombre aleatorio. En este caso sería:
docker attach heuristic_liskov
Usando el parámetro ‘logs’ más la id del contenedor podemos visualizar sus registros:
[root@centos7 ~]# docker logs fa91ef51401d hola
Para parar un contenedor que tengamos activo:
[root@centos7 ~]# docker stop 543e8a6eb95a
Para volver a encenderlo es así de fácil:
[root@centos7 ~]# docker start 543e8a6eb95a
Para eliminar un contenedor en concreto sería:
docker rm -nombre-
Si nos interesa eliminar todos los contenedores, que no las imágenes:
[root@centos7 ~]# docker rm $(docker ps -a -q) 543e8a6eb95a fa91ef51401d
Funcionando en segundo plano
Otra manera de trabajar con los contenedores es iniciarlos de manera separada, añadiendo el parámetro «–d«, esto es, en modo separado («Detached«). De esta manera se le asigna un número de proceso («pid«) propio al contenedor. Hay que tener en cuenta que, por defecto, los contenedores se ejecutan en primer plano («Foreground«).
Un ejemplo de ello:
docker run -dti 3d8b86c3bd87
Vemos el contenedor creado ejecutando docker ps -a
, así:
[root@centos7 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 124a62dc8632 3d8b86c3bd87 "supervisord -n" 4 seconds ago Up 3 seconds 22/tcp, 80/tcp, 443/tcp youthful_poincare
Para comprobar que efectivamente se le ha asignado un número ‘pid’, utilizando el comando ps -ef
, observamos:
[root@centos7 ~]# ps -ef | grep -i 124a62dc8632 root 2898 2147 0 12:24 ? 00:00:00 docker-containerd-shim 124a62dc863239e91536d7e03920e1a0be8c51690bb3c8af6ac16d665be96ceb /var/run/docker/libcontainerd/124a62dc863239e91536d7e03920e1a0be8c51690bb3c8af6ac16d665be96ceb docker-runc
Puede darse el caso de que queramos ejecutar un comando en uno de los contenedores; Docker nos los facilita. Para ello no tenemos que acceder al contenedor, sino ejecutar una orden desde el host principal, utilizando exec
:
[root@centos7 ~]# docker exec -ti youthful_poincare uptime 11:46:57 up 45 min, 0 users, load average: 0.07, 0.09, 0.07
De esta manera nos devuelve la salida estándar del comando uptime
, esto es, la carga del servidor.
Es verdad, lo ideal es que nosotros mismos le pongamos un nombre o alias al contenedor. ¿Cómo lo hacemos? Muy fácil, sólo debemos utilizar el parámetro --name
. Aquí os dejo un ejemplo:
docker run -dti --name test 3d8b86c3bd87
Una vez creado lo podemos listar utilizando docker ps -a
:
[root@centos7 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6e0772a1762d 3d8b86c3bd87 "supervisord -n" 4 seconds ago Up 3 seconds 22/tcp, 80/tcp, 443/tcp test
Espero que os haya parecido interesante. Si tenéis alguna duda u observación la podéis dejar en los comentarios.
En el siguiente capítulo hablaremos de la exposición y redirección de puertos, algo esencial y que merece un capítulo aparte.
La fuente principal del artículo ha sido la documentación oficial de referencia del proyecto. También recomiendo la lectura del libro «Docker. Guía Práctica» del autor Alberto González.
NOTA: Las imágenes han sido extraídas de la web oficial de Docker.