Virtualización con Docker. Comandos y ejemplos para procesadores ARM.

Categoría: Linux Creado: Jueves, 06 Julio 2017 Publicado: Martes, 11 Julio 2017 Escrito por Francisco Javier Sánchez Gragera

En el artículo anterior vimos cómo hacer funcionar docker en una Orange Pi Win Plus, de la misma forma que podría funcionar para otras Orange Pi, Raspberry Pi o Banana Pi. Elegimos el modelo principalmente por tener 2 GBytes de RAM y un precio económico, usando la distribución armbian como base.

 

Wordpress con Docker

 

Bien, desde que conseguí hacerlo funcionar he pasado varias horas probando comandos, creando y modificando imágenes, e incluso publicándolas en dockerhub. Empecemos con los comandos para poder luego ejecutar algunos ejemplos con imágenes docker.


Comandos docker:

docker search [consulta]
Buscar una imagen en repositorio.
docker pull [nombre de la imagen]
Descargar imagen de docker hub.
docker images
Muestra imágenes descargadas en nuestro equipo.
docker inspect [imagen o contenedor]
Muestra detalles de la imagen o contenedor especificado.
docker run -it [nombre de la imagen] /bin/bash
Crea un contenedor de la imagen especificada, la ejecuta y nos introduce en su línea de comandos.
docker run -d [nombre de la imagen] [comando]
Crea un contenedor, ejecutándolo sin introducirnos en el. Permite además de introducir un comando.
Opción docker run: -p [puerto Host]:[puerto Docker]
Mapea un puerto del contenedor docker hacia otro puerto de la máquina host. Pueden ser distintos puertos.
Opción docker run: -v [dir Host]:[dir Docker]
Enlaza una carpeta del contenedor hacia una ubicación del host, facilitando el acceso a estos.
docker port [id o nombre contenedor]
Muestra los puertos expuestos del contenedor.
docker rmi [nombre de la imagen]
Elimina una imagen del almacenamiento local.
docker start [id o nombre contenedor]
Inicia un contenedor existente.
docker stop [id o nombre contenedor]
Para un contenedor en ejecución
docker restart [id o nombre contenedor]
Reinicia contenedor en ejecución
docker rm [id o nombre contenedor]
Elimina un contenedor parado.
docker ps
Muestra un listado con todos los contenedores en ejecución
docker ps -a
Muestra un listado con todos los contenedores, incluso los inactivos.
docker exec -it [contenedor] bash
Abrir línea de comandos para contenedor en ejecución.
docker export [nombre/id contenedor]
Exporta un contenedor a un fichero .tar
docker commit [contenedor] [imagen]
Guarda contenedor como una nueva imagen
docker push [autor/nombre de la imagen]
Sube la imagen a docker hub

Ejemplos de uso:

Vamos a realizar una serie de ejemplos con docker, teniendo siempre en cuenta la particularidad de los procesadores ARM que tratamos en estos artículos.

Ejemplo 1: "hello-world"

Existen imágenes para comprobar el funcionamiento de docker que ejecutan un container de bienvenida al estilo "hello-world", famoso programa escrito en lenguaje "B" por Brian Kernighan en su libro A Tutorial Introduction to the Programming Language B de 1973.

  • Buscamos una imagen docker "hello-world" para arm: docker search "hello-world arm"

 

docker-search

 

  • Hacemos un pull de la imagen "armhf/hello-world": docker pull armhf/hello-world
  • Ejecutamos la imagen en un container: docker run armhf/hello-world

 

docker-run

 

  • Podemos probar el comando de listar imágenes "docker images" que nos devuelve la imagen descargada anteriormente.
  • Si comprobamos los contenedores en ejecución con "docker ps" veremos que no hay nada, puesto que hello-world finaliza cuando muestra el mensaje.
  • Sin embargo al ejecutar la instrucción "docker ps -a" también se muestran los contenedores parados, y aquí si podemos encontrar nuestro "armhf/hello-world", al que se le ha asignado automáticamente el nombre de "small_volhard"
  • Usando este nombre, podemos borrar el contenedor parado: docker rm small_volhard
  • Una vez eliminado el contenedor, podemos borrar la imagen si no vamos a usarla mas: docker rmi armhf/hello-world

 

docker-comandos

 

Ejemplo 2: Ejecutar contenedor con imagen de Ubuntu

Ahora vamos a montar un contenedor con Ubuntu. Podremos manejar éste contenedor como si de un pc normal se tratase.

  • Encontraremos una imagen apropiada para ejecutar Ubuntu en procesadores ARM. Usaremos esta vez Docker Hub

 

docker-hub

 

  • Procedemos a instalar la imagen ejecutando el comando "docker run --name Ubuntu1 -it armhf/ubuntu /bin/bash"
    • Ejecutamos docker-run sin hacer antes el pull. El sistema busca la imagen en local y si no la encuentra la descarga.
    • --name Ubuntu1 asigna el nombre "Ubuntu1" al contenedor creado
    • - it nos permite interactuar con la sesión del contenedor.
    • /bin/bash Nos proporciona un bash shell para la sesión del contenedor. Si salimos del shell se parará el contenedor.
  • Ejecutamos uname -a para comprobar que versión de ubuntu se está ejecutando dentro del contenedor.

 

docker-ubuntu

 

  • Ya tenemos un contenedor virtual con ubuntu instalado. Vamos a instalar apache2 para comprobar que se usa como cualquier pc con ubuntu:
    • Actualizamos los repositorios: apt-update
    • Instalamos Apache 2: apt install apache2
    • Confirmamos la instalacións pulsando 'y' (yes).

 

Instalar Apach

 

  • Como podemos ver nada raro, una vez dentro del contenedor docker de ubuntu se usa como cualquier sesión bash. Tenemos una instalación limpia de Ubuntu+Apache2, podemos aprovechar para construir una nueva imagen docker con estos cambios.
    • Salimos del contenedor tecleando exit
    • Comprobamos el nombre del contenedor con docker ps -a
    • Construimos una nueva imagen partiendo de este contenedor, debemos dar a la nueva imagen un autor y un nombre significativo: docker commit Ubuntu1 geekclusterpi/arm64_ubuntu_apache2
    • Comprobamos la creación de la imagen con docker images

 

Crear nueva imagen

 

  • Procedamos ahora a crear un contenedor tomando como base nuestra nueva imagen:
    • Ejecutamos un contenedor nuevo: docker run --name apache2 -dit -p 80:80 geekclusterpi/arm64_ubuntu_apache2
    • El contenedor se ejecuta en modo servicio (-d). Hemos dado salida al contenedor por el puerto 80, pero si ponemos la ip en el navegador no funciona..... ¿qué sucede? El servicio apache2 está parado....
    • Aprovechamos la situación para aprender a entrar en un contenedor en ejecución: docker attach apache2
    • Una vez dentro del contenedor docker, iniciamos el servicio apache2: service apache2 start
    • Salimos del contenedor SIN cerrarlo con la combinación de teclas control+q+ p, pulsando control+q, y sin soltar control despulsamos q para pulsar p.

 

Iniciar Docker Apache

 

    • Si volvemos a introducir en el navegador la dirección ip del host, ahora si aparece el mensaje de bienvenida de apache:

 

Pagina Apache

 

Ejemplo 3: Ejecutar varios contenedores con servicios web simultáneamente.

Para este ejemplo vamos a aprovechar las imágenes que he ido confeccionando y que son accesibles al público gracias a docker hub. Imaginemos que somos programadores web y estamos trabajando en tres proyectos: un blog en wordpress, una web con joomla y una página en php "a pelo" sobre un servidor LAMP. Queremos además llevar la facturación de nuestra empresa con odoo, un software de gestión empresarial libre que se monta en un servidor web. Gracias a docker podemos realizar todas tareas en una misma máquina, y si además usamos una Orange Pi Win nuestro servidor nos costará únicamente 50 euros (aprox.)

  • Montamos nuestro propio servidor openERP (Odoo) en su puerto por defecto (8069): docker run --name mi-odoo -p 8069:8069 -it geekclusterpi/arm64_odoo:v0.2 /bin/bash. Salimos con control+q+ p.
  • Levantamos otro contenedor con Wordpress en el puerto 81: docker run -it --name trabajo-wordpress -p 81:80 geekclusterpi/arm64_lamp_wordpress:v0.3 /bin/bash. Salimos con control+q+ p.
  • Un tercer contenedor contendrá Joomla en el puerto 82: docker run --name trabajo-joomla -p 82:80 -it geekclusterpi/arm64_lamp_joomla:v0.3 /bin/bash. Salimos con control+q+ p.
  • El último docker será una instalación LAMP limpia, para comenzar una página hecha completamente por nosotros: docker run --name proyecto-php -p 83:80 -it geekclusterpi/arm64_lamp:v0.3 /bin/bash. Salimos con control+q+ p.
  • Podemos parar contenedores con docker stop [nombre contenedor docker], e iniciarlos con docker start [nombre contenedor docker]. Al iniciarlos se mapean los mismos puertos que indicamos en el docker run inicial. Si el docker run de algún contenedor falla, podemos volver a iniciarlo con docker start

Podemos entrar al servicio web de cada uno de los docker a través de la ip del host, por los puertos 8069, 81, 82 y 83 respectivamente. Con cuatro comandos hemos obtenido cuatro servidores web distintos e independientes, listos para empezar a trabajar. De cada imagen podemos ejecutar varios contenedores, es decir, podríamos crear tres instancias de wordpress distintas para tres clientes diferentes, partiendo de una única imagen docker. La utilidad y efectividad de docker es indiscutible.

 

Docker simultáneos

 

Con docker ps podemos ver los contenedores en ejecución:

 

Docker simultáneos

 

Ejecutando el comando htop en la línea de comandos del servidor docker, podemos ver los recursos que están ocupando los cuatro contenedores. Podemos ver que de los 2 GBytes, solo se ocupan 677 MBytes de memoria RAM.

 

Recursos

 

Espero que os haya gustado docker, y el enfoque que he realizado hacia las orange pi y demás sbc. Docker es extenso y debéis seguir investigando por vuestra cuenta si queréis dominarlo. Hay herramientas de docker que no hemos visto aquí, como los Dockerfile, que son muy útilies pero requieren más estudio. Os animo también a que confeccionéis vuestras propias imágenes, y estaría encantado de probarlas si me dejáis un comentario con su nombre.

¡Nos vemos en otro artículo!


Anterior: Virtualización con Docker & Orange Pi Win Plus

Visto: 665

Escribir un comentario


Código de seguridad
Refescar