Docker es una plataforma que permite crear, ejecutar y gestionar aplicaciones dentro de contenedores. Un contenedor es una unidad ligera y portátil que incluye todo lo necesario para que una aplicación funcione: código, dependencias, librerías y configuraciones, pero sin necesidad de instalar un sistema operativo completo como en una máquina virtual.

A continuación, enumeramos una serie de comandos básicos para empezar a trabajar.

Gestionar imágenes

docker pull alpine:3.9 Descarga la imagen de nombre alpine que tiene el tag 3.9. Con el tag latest descargamos la última versión.
docker images
docker image ls
Lista las imágenes descargadas en el equipo.
docker rmi <imagen_id> Elimina una imagen descargada. Indicando los primeros dígitos del Id de la imagen suele ser suficiente.
docker commit <container_id> myapp:1.0 Crear imagen a partir de un contenedor.
docker image tag <imagen_id>:tag nombre_nuevo:tag Crea una nueva versión de una imagen con un tag alternativo.
docker login
docker push moikmeg/alpine-git:1.0
Subir imagen a DockerHub.

Ejecutar imágenes

docker run alpine:latest  
docker run alpine:latest ls -l Ejecuta el comando y sale
docker run --name mi-alpine -it alpine:latest /bin/sh Ejecuta el comando y entra en el contenedor. Añadiendo –rm el contenedor se elimina al salir.
docker run -d --name mi-alpine alpine:latest tail -f /dev/null Arranca el contenedor y lo deja activo en segundo plano.
docker exec -it mi-alpine /bin/sh Entra en el contenedor previamente levantado
docker ps -a Lista los contenedores activos
docker inspect <container_id> Muestra información del contenedor
docker top <container_id> Muestra los procesos ejecutados en contenedor
docker logs -f <contenedor> Ver logs
docker stop <contenedor> Para un contenedor.
docker rm <contenedor>
docker rm -f $(docker ps -a -q)
Elimina un contenedor o todos los existentes.
docker image history <imagen_id> Histórico de comandos ejecutados sobre imagen.

Guardar y compartir

docker export Exporta el sistema de archivos de un contenedor como un archivo tar. No exporta los volúmenes asociados.
docker import Importa el contenido de un archivo tar para crear una imagen del sistema de archivos.
docker save Salva una o más imágenes a un archivo tar.
docker load Carga una imagen desde un archivo tar.

Ejemplo:

docker run -d -p 80:80 nginx
docker ps -a
docker export df2 > nginx.tar
docker import - mynginx < nginx.tar
docker images

Si lo que queremos es trabajar con imágenes ya comiteadas, usamos load y save:

docker save -o mynginx1.tar nginx
docker rmi mynginx
docker images
docker load < mynginx1.tar
docker images

Almacenamiento

Para guardar los datos manejados por una aplicación, docker tiene tres mecanismos principales:

  • volumes. Docker almacena los datos dentro de un área que él controla del sistema de ficheros. Es el mecanismo preferido para persistir los datos a día de hoy. Los volúmenes se almacenan en /var/lib/docker/volumes/ y solo Docker tiene permisos sobre esta ubicación. Un volumen puede ser montado por diferentes contenedores a la vez.

    docker volume create mis_datos

    docker volume ls

    docker container run -it -v mis_datos:/misdocumentos:ro alpine:latest /bin/sh

    Monta el volumen de datos creado con nombre mis_datos en el contenedor ejecutado. El punto de montaje se establece dentro del contenedor en la ruta /misdocumentos. La opción :ro indica que es de solo lectura.

    En lugar de la opción -v es posible usar --mount:

    docker container run -it --mount source=mis_datos,target=/misdocumentos alpine:latest /bin/sh

  • bind mounts. Se utiliza para mapear cualquier sitio del sistema de ficheros y que cualquier contenedor pueda acceder al mismo.

    docker run -it --mount type=bind,source=/home/jdoe/documentos,target=/opt/documentos alpine:latest /bin/sh

    Podríamos modificar el contenido de la ruta /home/jdoe/documentos y se vería reflejado en la ruta /opt/documentos del contenedor.

  • tmpfs. Se trata de un almacenamiento temporal en memoria. Se suele utilizar para el almacenamiento de configuraciones y espacios efímeros que desparecerán cada vez que el contenedor se pare.

    docker run -d -it --name temporal --mount type=tmpfs,destination=/datos_temporales alpine:latest /bin/sh

    docker run -d -it --name temporal --tmpfs /datos_temporales alpine:latest /bin/sh

Mapeo de puertos

Mediante el mapeo de puertos se puede acceder a una aplicación hospedada en un contenedor desde la máquina local. Para ello, lo que hacemos es mapear un puerto de nuestra máquina con el puerto que está a la escucha en el contenedor.

docker run --name web1 -d -p 8080:80 nginx

El puerto local 8080 queda asociado al puerto 80 del contenedor. Consultando la dirección http://localhost:8080 dentro de la máquina local estamos accediendo al servidor web que corre en el contenedor.