En una Raspberry PI, instalaremos Docker
apt update
apt list --upgradable
apt upgrade -y
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh
El proceso de instalación iniciará donde veremos:
# Executing docker install script, commit: 6d9743e9656cc56f699a64800b098d5ea5a60020
+ sh -c apt-get update -qq >/dev/null
+ sh -c DEBIAN_FRONTEND=noninteractive apt-get install -y -qq apt-transport-https ca-certificates curl >/dev/null
+ sh -c install -m 0755 -d /etc/apt/keyrings
+ sh -c curl -fsSL "https://download.docker.com/linux/raspbian/gpg" -o /etc/apt/keyrings/docker.asc
+ sh -c chmod a+r /etc/apt/keyrings/docker.asc
+ sh -c echo "deb [arch=armhf signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/raspbian buster stable" > /etc/apt/sources.list.d/docker.list
+ sh -c apt-get update -qq >/dev/null
+ sh -c DEBIAN_FRONTEND=noninteractive apt-get install -y -qq docker-ce docker-ce-cli containerd.io docker-compose-plugin docker-ce-rootless-extras docker-buildx-plugin >/dev/null
+ sh -c docker version
Client: Docker Engine - Community
Version: 26.1.3
API version: 1.45
Go version: go1.21.10
Git commit: b72abbb
Built: Thu May 16 08:33:14 2024
OS/Arch: linux/arm
Context: default
Server: Docker Engine - Community
Engine:
Version: 26.1.3
API version: 1.45 (minimum version 1.24)
Go version: go1.21.10
Git commit: 8e96db1
Built: Thu May 16 08:33:14 2024
OS/Arch: linux/arm
Experimental: false
containerd:
Version: 1.6.31
GitCommit: e377cd56a71523140ca6ae87e30244719194a521
runc:
Version: 1.1.12
GitCommit: v1.1.12-0-g51d5e94
docker-init:
Version: 0.19.0
GitCommit: de40ad0
Para finalizar, habilitaremos el servicio:
usermod -aG docker pi
systemctl enable docker
systemctl start docker
Ya lo tenemos instalado y podremos ver la versión e información relativa al mismo (vistas anteriormente)
docker version
docker info
Ahora instalaremos Docker Compose para la personalización de los despliegues
apt install -y libffi-dev libssl-dev python3-dev python3 python3-pip
mkdir -p ~/.docker/cli-plugins/
curl -SL https://github.com/docker/compose/releases/download/v2.27.0/docker-compose-linux-armv6 -o ~/.docker/cli-plugins/docker-compose
chmod +x ~/.docker/cli-plugins/docker-compose
y validaremos la versión instalada
docker compose version
Comandos básicos que nos pueden servir de interés:
docker ps -a
docker stats
Realizar un registro a https://hub.docker.com para ver nuestros contenedores y realizar un login:
docker login
Ahora, vamos a levantar un contenedor. Vamos a buscar una imagen del propio sistema:
root@node01:/etc/apt/sources.list.d# docker search raspbian --filter stars=10
NAME DESCRIPTION STARS OFFICIAL
raspbian/stretch Maintained, Usable, Minimal, Cross-compilabl… 64
raspbian/jessie Maintained, Usable, Minimal, Cross-compilabl… 21
raspbian/desktop 10
navikey/raspbian-buster Minimal image based on Raspbian Stretch Lite… 14
Para tener un sistema Raspbian lo mas parecido al que ahora mismo tengo, usaremos la versión para Buster
Lo ejecutamos del siguiente modo:
docker run -it navikey/raspbian-buster bash
Lo descargará… y ya tenemos acceso al equipo via bash
root@f618e3e82313:/#
Es importante tener en cuenta que cualquier cambio (modificación) no se grabará en la imagen arrancada.
Por ejemplo, si queremos actualizar la imagen e instalar algún producto para que sea persistente crearemos un fichero que contenga:
FROM navikey/raspbian-buster
MAINTAINER .
ENV HOME /root
RUN apt-get update
RUN apt-get install net-tools
root@node01:~# docker build -t raspiban .
[+] Building 200.3s (7/7) FINISHED
=> [internal] load build definition from Dockerfile
=> => transferring dockerfile: 143B
=> [internal] load metadata for docker.io/navikey/raspbian-buster:latest
=> [internal] load .dockerignore
=> => transferring context: 2B
=> [1/3] FROM docker.io/navikey/raspbian-buster:latest
=> [2/3] RUN apt-get update
=> [3/3] RUN apt-get install net-tools
=> exporting to image
=> => exporting layers
=> => writing image sha256:0f9c33831b22470252ce13cd6991e544ba2a5362900d39e321f4bbc908ebf11c
=> => naming to docker.io/library/raspbian
Lo arrancamos y validamos que efectivamente nos ha actualizado el sistema y ha instalado el paquete “net-tools” en una nueva imagen
root@node01:~# docker run -it raspbianbash
root@e8f29dd9def4:/# apt-cache policy net-tools
net-tools:
Installed: 1.60+git20180626.aebd88e-1
Candidate: 1.60+git20180626.aebd88e-1
Version table:
*** 1.60+git20180626.aebd88e-1 500
500 http://archive.raspbian.org/raspbian buster/main armhf Packages
100 /var/lib/dpkg/status
Ahora que tenemos la imagen actualizada, podemos eliminar la antigua. Basta con localizar su IMAGE ID y forzar su eliminación:
root@node01:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
raspbian latest 0f9c33831b22 3 hours ago 259MB
navikey/raspbian-buster latest 945ee0c40ad4 24 months ago 203MB
root@node01:~# docker rmi -f 945ee0c40ad4
Untagged: navikey/raspbian-buster:latest
Untagged: navikey/raspbian-buster@sha256:e966cdb354444f1eb9fbb333df56bd63cc18b965254818173a1ec3cba63a2e81
Deleted: sha256:945ee0c40ad4cd0ba72a78a3e57222614be57fddff88ccc262df1edc3b3799e6
Ahora salimos presionando la sequencia Ctrl+p y Ctrl+q. Esto hace que salgamos del contenedor, pero no lo para. Si escribimos “exit”, saldriamos del contenedor.
Para volver a conectar, localizaremos el CONTAINER ID:
root@node01:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
79686fdb706b raspbian "bash" 2 minutes ago Up 2 minutes vibrant_haibt
y volveremos a estar dentro:
root@node01:~# docker attach 79686fdb706b
root@79686fdb706b:/#
Eliminamos todos los contenedores y arrancamos un contenedor nuevo para que localmente escuche por el 444 y dentro del contenedor el 443:
root@node01:~# docker container prune -f
root@node01:~# docker run -d -i -t --name apache -h apache -p 444:443 -v /var/www/html_docker:/var/www/html raspiban /bin/bash
Importante el tener creado el directorio local y que veremos dentro del contenedor de forma persistente
mkdir -p /var/www/html_docker
chown www-data:www-data /var/www/html_docker
En este punto, instalaremos apache ya estando dentro del contenedor y configuraremos una página estática.
root@apache:/# apt-get install apache2 -y
root@apache:/# a2enmod ssl
root@apache:/# apt-get install php -y
root@apache:/# echo '<?php echo gethostname() . " connected"; ?>' > /var/www/html/node.php
root@apache:/# service apache2 restart
Lo probamos accediendo a http://10.0.1.71:444/ y ya accederemos al nodo: