Docker para torpes con Raspberry Pi u Orange Pi

Si tenéis una Raspberry Pi actualizada o una Orange Pi usando el kernel mainline, podéis empezar a experimentar con Docker del que ya hablé hace mucho tiempo por aquí y luego sobre una imagen ya preparada: HypriotOS un Raspbian con Docker listo para usar.

Docker es un sistema de contenedores virtuales. Un contenedor es más simple que una máquina virtual, ya que en su interior solo incluye los librerías y programas que son diferentes a lo que tiene tu máquina, o sea, tu Raspbian en Raspberry Pi o tu armbian en tu Orange Pi. La base de estos contenedores son las denominadas imágenes, una especie de mini iso que se compara con lo que hay en tu máquina y completa lo que falta o es diferente para crear el contenedor.

En primer lugar aseguraos de tener un kernel mayor que 3.10, para ello en la Terminal  ejecutáis este comando:

uname -a

Debe saliros una información más o menos como esta:

op1-docker-03

Donde podéis ver que pone Linux orangepione 4.9.0-sun8i 

También es muy conveniente tener la dirección IP fija o estática, para ello podéis seguir las indicaciones de este post en Raspbian.

Así que si el número es mayor podéis seguir adelante e instalar desde Terminal:

sudo apt install docker.io

Comprobar que se ha instalado y funciona:

sudo docker info

op1-docker-01

Docker funciona como un servicio o sea que podemos pararlo si queremos hacer algún cambio de configuración y luego ponerlo en marcha de nuevo:

sudo service docker stop
sudo service docker start

Otros comandos interesantes son los que nos permiten loguearnos en una cuenta de Docker, creada previamente en su web https://hub.docker.com/ y aunque no es necesario puede sernos útil en el futuro:

sudo docker login

O saber que contenedores están en funcionamiento:

sudo docker ps

O saber todos los contenedores que tenemos incluso los que están parados:

sudo docker ps -a

op1-docker-02

En el caso de que haya contenedores funcionando podemos ver su estado con:

sudo docker stats

Para salir de esta pantalla pulsamos Ctrl + C

OJO, las imágenes compatibles con Raspberry Pi, Orange Pi o similares son especiales para procesadores ARM y la imágenes suelen marcarse como rpi o como armhf . Si no incluyen esto seguro que no funcionan.

Arrancar container con una imagen externa como base

El comando para iniciar un contenedor desde cero es:

sudo docker run -d -p puerto_real:puerto_container imagen

Un par de ejemplos:

sudo docker run -d -p 80:80 hypriot/rpi-busybox-httpd
sudo docker run -d -p 8081:8081 resin/rpi-google-coder

El primer contenedor lo podremos ver esto caso de poner solo la dirección IP:

http://IP-fija-de-mi-maquina-con-docker/

op1-docker-06

El segundo contenedor necesita acceso seguro (https), aceptar la excepción de seguridad y especificar el puerto:

https://IP-fija-de-mi-maquina-con-docker:8081

op1-docker-07

op1-docker-08

op1-docker-09

op1-docker-10

op1-docker-11

Descargar imágenes

Si en vez de iniciar el contenedor desde cero queremos descargar las imágenes primero:

sudo docker pull imagen

Haríamos por ejemplo:

sudo docker pull hypriot/rpi-busybox-httpd
sudo docker pull resin/rpi-google-coder
sudo docker pull hypriot/rpi-alpine

Arrancar container en modo interactivo en la Terminal

Si en vez de arrancar el contenedor como un servicio, queremos conectarnos a él como si fuera otra Terminal:

sudo docker run -t -i imagen /bin/bash

Por ejemplo, para iniciar la imagen de coder:

sudo docker run -t -i resin/rpi-google-coder /bin/bash

Arrancar y parar containers ya creados

Si ahora volvemos a mirar los contenedores funcionando y el total ce creados:

sudo docker ps
sudo docker ps -a

Podremos ver una lista más o menos larga:

op1-docker-12

Aquí vemos que los contenedores tienen un identificador único que es código de letras y números largos del principio o un nombre aleatorio formado por dos partes: nombre-adjetivo. Usando cualquiera de estas opciones para identificarlos, podremos parar los contenedores o arrancarlos si están parados:

sudo docker start container_por_nombre o ID
sudo docker stop container_por_nombre o ID

Conectarse de forma interactiva a un container en funcionamiento

Si queremos ver o cambiar cosas en las tripas de un container que ya está en marcha, podemos conectarnos a él si por ejemplo usa la shell bashcon su nombre o ID de la siguiente forma:

sudo docker exec -i -t container_por_nombre o ID /bin/bash

op1-docker-13

Borrar container incluso el volumen asociado

Si os habéis emocionado y puesto en marcha muchos contenedores. Si os preguntáis: ¿dónde se guardan las imágenes y contenedores creados en Docker? os diré que vuestra carpeta es:

/var/lib/docker

Y que si os habéis emocionado y hay demasiados, lo mismo ha llegado el momento de borrarlos.

OJO que cada contenedor debe estar parado, stop , antes de borrarlo y que tienen un volumen asociado para los archivos temporales que podemos eliminar también con la opción -v

Usando los nombres o identificadores, ID, separados por espacios podéis borrarlos con este comando:

sudo docker rm -v container1 container2

¿Que hay en esa carpeta /var/lib/docker además de container?

Imágenes

Pues en esa carpeta están las Imágenes que hemos descargado y usado, podemos verlas con el comando:

sudo docker images

op1-docker-14

Borrar imágenes de docker

Si también nos hemos emocionado y hay muchas las podemos borrar, siempre que no la esté usando ningún container:

sudo docker rmi imagen_por_nombre o ID

Volúmenes

Cada container se basa en una imagen de referencia y al ponerlo en marcha crea un volumen para los archivos temporales que necesita, podemos verlos con:

sudo docker volume ls

op1-docker-15

Borrar volúmenes de docker

Si cuando borramos el contenedor no usamos la opción -v, habrá volúmenes abandonados que podemos borrar:

sudo docker volume rm volumen_por_nombre

Y esto es todo lo que por ahora he probado, espero que os animéis y os convirtáis en maestros de Docker.

  • Mario

    Mola un montón!!!
    Esto permite probar cosas sin joder tu sistema, no?
    Así me evitaría hacer copias de la sd cada vez que voy a cacharrear.

    Un saludo.

    • Es una gran forma de probar cosas o de cuando se tiene algo que funciona convertirlo en un container y así tenerlo listo para usar en cualquier momento y con cualquier configuración.

  • calhemp

    hola Manuti, gracias por el post, muy bien explicado ;)

    si quisieras, se podría usar Docker sin comando sudo / root, dándole permisos al usuario para hacerlo correr con

    sudo usermod -aG docker $USER

    saludos.

    • De nada, me alegro que te haya gustado el Post. Era un tema que me interesaba y me costó bastante aprender todo lo que cuento y escribirlo y me resultaba un poco frustrante que no hubiera comentarios.
      Lo que comentas de los permisos creo que lo probé pero ni me funcionaba por algún motivo, ten en cuenta que lo hice todo en la Orange Pi con una versión beta de armbian.
      Gracias de nuevo por tu comentario.

      • calhemp

        Hola Manuti,
        ni soy experto ni profesional, al contrario, por diversión e interés a nuevas tecnologías.

        mi experiencia que puedo compartir es 1 cubieboard a20 (nada exagerado, solo 2 usuarios usamos los servicios) va de maravilla!, falta (mas tutoriales, mas estabilidad) para entorno de produccion, pero solo lleva 2 años en constante desarrollo con un futuro brutal le veo.

        sin alterar tu sistema principal es mágico! desplegar lo que quieras, o compartir con otros el mismo container exactamente.

        Docker 1.13 parece que implementa fixes y todo lo de docker swarn y clusteres por eso tantos nuevos comandos, (para mi, con 1 device sigue siendo lo mismo)

        estoy usando un container para transmission, resilio, libresonic.
        y otro pack de containers (con docker.compose) para nginx/php/mysql/ftp para mi web interna del trabajo, es cojonudo !!( si me falla lo copio en otra maquina o edito el fichero docker y ya esta de nuevo en marcha)

        si puedes probar docker-compose instalando desde python pip, veras que es muy facil de juntar containers en un solo fichero.yml

        en tu orange pi, es question de tiempo que sea estable en kernel mainline, suerte de linux-sunxi y armbian, son geniales un 10!! sin esto nada funcionaria en este mundillo, también tengo que hacer pruebas con el filesystem overlay y no el driver que viene por defecto. a ver que tal se gana en rendimiento.

        la putada de estos aparatos, es que cuesta encontrar containers armhf fiables, o implementar mas containers armhf en el mismo docker hub, no me compilan, solo los x86/x64.

        de momento uso estos containers
        https://hub.docker.com/r/portainer/portainer –>tag arm
        el mio https://hub.docker.com/r/canagroc/armhf-firebird/,
        y estos
        https://hub.docker.com/u/armhf/
        y estos https://hub.docker.com/u/lsioarmhf/ me va bien porque puedo compartir la carpeta host con la virtual manteniendo los permisos que va bien para trabajar en local.

        saludos.

        • Brutal la info, muchas gracias.
          Me apunto todos los repositorios de containers!!!

    • Ojo a una cosa, muchos comandos han cambiado de Docker v1.12 que usé a v1.13, tendría que revisar a ver que puede haber dejado de funcionar o dar problemas. https://blog.docker.com/2017/01/whats-new-in-docker-1-13/