Docker
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 imagesSi 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 imagesAlmacenamiento
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_datosdocker volume lsdocker container run -it -v mis_datos:/misdocumentos:ro alpine:latest /bin/shMonta 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
-ves 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/shPodrí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/shdocker 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.