Docker y Docker-compose
La idea de Docker, es la de crear aplicaciones/servicios que sean independientes y portables. Esto es, no importa que sistema operativo utilices o con que hardware cuentas, si puedes instalar docker, entonces podras correr tus contenedores en él. Entre las ventajas de usar docker, se encuentra la de olvidarte de instalar dependencias (ejemplo nodejs, java, python, ruby, etc) dentro de tu host o servidor y sin utilizar máquinas virtuales.
Docker posibilita ir de tu maquina local a producción, con tu aplicació lista. Ya no es necesario instalar en cada servidor dependencias o depender del sistema operativo. Solo basta con tener Docker instalado.
Contenedor Docker
Un contenedor Docker es un paquete que contiene todos los requisitos previos necesarios para ejecutar una aplicación.
Los contenedores están diseñados para ser altamente portátiles, lo que significa que pueden trasladarse fácilmente de un entorno a otro, como del portátil de un desarrollador a un entorno de pruebas o de un entorno de pruebas a un entorno de producción.
Imagen Docker
Una imagen Docker es una plantilla preconfigurada que especifica lo que debe incluirse en un contenedor Docker. Normalmente, las imágenes se descargan de sitios web como Docker Hub. Sin embargo, también es posible crear una imagen personalizada con la ayuda de Dockerfile.
Registro Docker
El registro Docker es un repositorio central que almacena y gestiona imágenes Docker. Es un sistema basado en servidor que permite a los usuarios almacenar y compartir imágenes Docker con otros, facilitando la distribución y despliegue de aplicaciones. El registro Docker más notable es Docker Hub.
Comandos Docker
Ahora que ya sabes cómo funciona Docker, veamos algunos de los ejemplos de comandos Docker más populares.
Comandos de construcción
Docker utiliza el comando build para construir imágenes a partir de un archivo Docker. Algunos de los comandos más comunes son:
Comando | Explicación |
docker build | Construye una imagen a partir de un Dockerfile en el directorio actual |
docker build https://github.com/docker /rootfs.git#contenedor:docker | Construye una imagen desde un repositorio GIT remoto |
docker build -t imagename/tag | Construye y etiqueta una imagen para facilitar su seguimiento |
docker build https://yourserver/file.tar.gz | Crea una imagen a partir de un archivo tar remoto |
docker build -t imagen:1.0-<<EOFFROM busyboxRUN echo «hola mundo «EOF | Construye una imagen mediante un archivo Dockerfile que se pasa a través de STDIN |
Comandos de limpieza
Para mantener limpio tu sistema y ahorrar espacio en disco, es una gran idea limpiar las imágenes, contenedores y volúmenes que no se utilicen. Consulta los siguientes comandos para más detalles:
Comando | Explicación |
docker image prune | Borra una imagen no utilizada |
docker image prune -a | Borra todas las imágenes que no estén siendo utilizadas por contenedores |
docker system prune | Elimina todos los contenedores detenidos, todas las redes no utilizadas por los contenedores, todas las imágenes colgadas y toda la caché de construcción. |
docker image rm image | Elimina una imagen |
docker rm container | Elimina un contenedor en ejecución |
docker kill $ (docker ps -q) | Detiene todos los contenedores en ejecución |
docker swarm leave | Deja un enjambre |
docker stack rm stackname | Elimina un enjambre |
docker volume rm $(docker volume ls -f dangling=true -q) | Elimina todos los volúmenes colgados |
docker rm $(docker ps -a -q) | Elimina todos los contenedores parados |
docker kill $ (docker ps -q) | Detiene todos los contenedores en ejecución |
Comandos de interacción con el contenedor
Interactúa con tu contenedor Docker con los siguientes comandos comunes:
Comando | Explicación |
docker start container | Inicia un nuevo contenedor |
docker stop container | Detiene un contenedor |
docker pause container | Pausa un contenedor |
docker unpause container | Despausa un contenedor |
docker restart container | Reinicia un contenedor |
docker wait container | Bloquea un contenedor |
docker export container | Exporta el contenido del contenedor a un archivo tar |
docker attach container | Se une a un contenedor en ejecución |
docker wait container | Espera a que se termine el contenedor y muestra el código de salida |
docker commit -m “commit message” -a “author” container username/image_name: tag | Guarda un contenedor en ejecución como una imagen |
docker logs -ft container | Sigue los registros de contenedores |
docker exec -ti container script.sh | Ejecuta un comando en un contenedor |
docker commit container image | Crea una nueva imagen a partir de un contenedor |
docker create image | Crea un nuevo contenedor a partir de una imagen |
Comandos de inspección de contenedores
A veces, necesitas inspeccionar tus contenedores para garantizar la calidad o solucionar problemas. Estos comandos te ayudan a tener una visión general de lo que están haciendo los distintos contenedores:
Comando | Explicación |
docker ps | Lista todos los contenedores en ejecución |
docker -ps -a | Lista todos los contenedores |
docker diff container | Inspecciona los cambios en los directorios y archivos del sistema de archivos del contenedor |
docker top container | Muestra todos los procesos en ejecución de un contenedor existente |
docker inspect container | Muestra información de bajo nivel sobre un contenedor |
docker logs container | Reúne los registros de un contenedor |
docker stats container | Muestra las estadísticas de uso de los recursos del contenedor |
Comandos de gestión de imágenes
Algunos de los comandos de gestión de imágenes más comunes son:
Comando | Explicación |
docker image ls | Lista imágenes |
docker image rm mysql | Elimina una imagen |
docker tag image tag | Etiqueta una imagen |
docker history image | Muestra el historial de imágenes |
docker inspect image | Muestra información de bajo nivel sobre una imagen |
Comandos de ejecución
Docker utiliza el comando ejecutar para crear contenedores a partir de las imágenes proporcionadas. La sintaxis por defecto de este comando es la siguiente:docker run (options) image (command) (arg…)
docker run (options) image (command) (arg…)
docker run (options) image (command) (arg...)
Después de la sintaxis por defecto, utiliza una de las siguientes flags:
Flag | Explicación |
–detach , -d | Ejecuta un contenedor en segundo plano e imprime el ID del contenedor |
–env , -e | Establece variables de entorno |
–hostname , -h | Establece un nombre de host a un contenedor |
–label , -l | Crea una etiqueta de metadatos para un contenedor |
–name | Asigna un nombre a un contenedor |
–network | Conecta un contenedor a una red |
–rm | Retira el contenedor cuando se detenga |
–read-only | Establece el sistema de archivos del contenedor como sólo lectura |
–workdir , -w | Establece un directorio de trabajo en un contenedor |
Comandos de registro
Si necesitas interactuar con Docker Hub, utiliza los siguientes comandos:
Comando | Explicación |
docker login | Accede a un registro |
docker logout | Sale de un registro |
docker pull mysql | Extrae una imagen de un registro |
docker push repo/ rhel-httpd:latest | Envía una imagen a un registro |
docker search term | Busca en Docker Hub imágenes con el término especificado |
Comandos de servicio
Gestiona todos los servicios con estos comandos básicos de Docker:
Comando | Explicación |
docker service ls | Lista todos los servicios que se ejecutan en un enjambre |
docker stack services stackname | Lista todos los servicios en ejecución |
docker service ps servicename | Lista las tareas de un servicio |
docker service update servicename | Actualiza un servicio |
docker service create image | Crea un nuevo servicio |
docker service scale servicename=10 | Escala uno o más servicios replicados |
docker service logs stackname servicename | Lista todos los registros de servicio |
Comandos de red
Si necesitas interactuar con la red Docker, utiliza uno de los siguientes comandos:
Comando | Explicación |
docker network create networkname | Crea una nueva red |
docker network rm networkname | Elimina una red especificada |
docker network ls | Lista todas las redes |
docker network connect networkname container | Conecta un contenedor a una red |
docker network disconnect networkname container | Desconecta un contenedor de una red |
docker network inspect networkname | Muestra información detallada sobre una red |
La diferencia entre los comandos docker create
y docker run
en Docker puede ser confusa al principio, pero aquí está la explicación:
docker create
: Este comando crea un nuevo contenedor a partir de una imagen, pero no lo ejecuta. En otras palabras, crea un contenedor a partir de una imagen, pero no lo inicia. Puedes pensar en ello como preparar un contenedor para su uso, pero sin ponerlo en funcionamiento. Por ejemplo:docker create --name mi-contenedor mi-imagen
Esto crea un contenedor llamado “mi-contenedor” basado en la imagen “mi-imagen”, pero no lo inicia.docker run
: Este comando combina los pasos de creación y ejecución. Crea el contenedor a partir de la imagen especificada y luego lo inicia. Es decir, es como si ejecutáramosdocker create
seguido dedocker start
. Por ejemplo:docker run --name mi-contenedor mi-imagen
Esto crea y ejecuta un contenedor llamado “mi-contenedor” basado en la imagen “mi-imagen”.
La diferencia entre los comandos docker stop
y docker kill
en Docker radica en cómo detienen un contenedor:
docker stop
: Este comando detiene el contenedor de manera graceful (graciosa) y proporciona una salida segura. Cuando ejecutasdocker stop
, Docker envía la señal SIGTERM al proceso dentro del contenedor. Esta señal permite que el proceso se termine de manera ordenada. Si el proceso no se detiene dentro del tiempo especificado, Docker emite un comando de kill implícitamente y de inmediato. En resumen,docker stop
da al proceso la oportunidad de cerrarse correctamente12.docker kill
: Este comando envía la señal SIGKILL al proceso principal dentro del contenedor. A diferencia de SIGTERM, SIGKILL no permite que el proceso realice ninguna acción antes de ser detenido. Es una forma más drástica de detener el contenedor y se utiliza cuando un contenedor está bloqueado o no responde. Sin embargo, ten en cuenta que usardocker kill
puede dejar procesos “zombie” si el proceso hijo no puede notificar a su proceso padre que recibió la señal de kill12.
En resumen:
docker stop
detiene el contenedor de manera ordenada.docker kill
detiene el contenedor de manera inmediata y drástica.
El comando docker build
se utiliza para construir imágenes de Docker a partir de un archivo llamado Dockerfile y un contexto. Aquí está la explicación detallada:
- Dockerfile: Un Dockerfile es un archivo de texto que contiene una serie de instrucciones para construir una imagen de Docker. Estas instrucciones incluyen cosas como copiar archivos, instalar paquetes, configurar variables de entorno y más. El Dockerfile debe estar ubicado en el mismo directorio o en un directorio accesible desde el contexto1.
- Contexto: El contexto es el conjunto de archivos y directorios que Docker utiliza para construir la imagen. Puede ser un directorio local en tu máquina o una URL remota. El contexto incluye todos los archivos necesarios para construir la imagen, como el Dockerfile, scripts, archivos de configuración, etc.1.
- Sintaxis del comando:
- Para construir una imagen desde el Dockerfile en el directorio actual:
docker build .
- Para construir una imagen desde un Dockerfile en una URL específica:
docker build github.com/creack/docker-firefox
- Para etiquetar la imagen construida:
docker build --tag nombre:etiqueta
- También puedes proporcionar argumentos de compilación utilizando la opción
--build-arg
. Por ejemplo:docker build --tag mi-imagen --build-arg clave1=valor1 --build-arg clave2=valor2 .
- Para construir una imagen desde el Dockerfile en el directorio actual:
Directivas en un Dockerfile
Un Dockerfile es un archivo de texto que contiene instrucciones para construir una imagen de Docker. Estas instrucciones especifican cómo se debe ensamblar la imagen, qué sistema operativo base usar, las dependencias de la aplicación y más1. Algunas de las directivas más comunes en un Dockerfile son:
FROM
: Esta directiva especifica la imagen base desde la cual construir. Por ejemplo:FROM ubuntu:20.04
RUN
: Ejecuta comandos en el contenedor durante la construcción de la imagen. Por ejemplo:RUN apt-get update && apt-get install -y python3
COPY
yADD
: Copian archivos o directorios desde el host al contenedor. Por ejemplo:COPY app.py /app/
WORKDIR
: Establece el directorio de trabajo dentro del contenedor. Por ejemplo:WORKDIR /app
EXPOSE
: Especifica los puertos en los que el contenedor escuchará. Por ejemplo:EXPOSE 8080
CMD
yENTRYPOINT
: Definen el comando que se ejecutará cuando se inicie el contenedor. La diferencia es queCMD
puede ser sobrescrito al ejecutar el contenedor, mientras queENTRYPOINT
no2.
Uso de Volúmenes en Docker
Los volúmenes en Docker permiten persistir datos entre contenedores o guardar datos de un contenedor de manera permanente. Aquí están los pasos básicos para trabajar con volúmenes:
- Crear un volumen:
- Utiliza el comando
docker volume create
para crear un volumen con un nombre específico. Por ejemplo:docker volume create mi-volumen
- Utiliza el comando
- Montar un volumen en un contenedor:
- Al ejecutar un contenedor, utiliza la opción
-v
o--mount
para especificar el volumen que deseas montar y la ruta dentro del contenedor donde se almacenarán los datos. Por ejemplo:docker run -v mi-volumen:/ruta-en-el-contenedor mi-imagen
- Al ejecutar un contenedor, utiliza la opción
- Compartir volúmenes entre contenedores:
- Puedes montar el mismo volumen en varios contenedores utilizando el mismo nombre de volumen. Esto permite compartir datos entre ellos.
- Verificar y gestionar volúmenes:
- Lista los volúmenes con
docker volume ls
. - Inspecciona un volumen específico con
docker volume inspect
. - Elimina un volumen con
docker volume rm
.
- Lista los volúmenes con
Recuerda que los volúmenes te permiten persistir y compartir datos entre contenedores y el host subyacente. Son una excelente solución para mantener datos incluso después de eliminar un contenedor
Docker Compose
Docker Compose es una herramienta que te permite definir y ejecutar aplicaciones Docker con múltiples contenedores. Esto facilita la implementación y gestión de entornos complejos. A continuación, te mostraré cómo instalar Docker Compose y cómo empezar a usarlo:
- Instalación de Docker Compose en Ubuntu:
- Primero, asegúrate de tener Docker instalado en tu servidor o equipo local. Si aún no lo has hecho, sigue los Pasos 1 y 2 de Cómo instalar y usar Docker en Ubuntu 20.04.
- Luego, instala Docker Compose siguiendo estos pasos:
- Abre una terminal en tu servidor Ubuntu.
- Ejecuta el siguiente comando para descargar la versión estable más reciente de Docker Compose:
sudo curl -L "https://github.com/docker/compose/releases/download/1.26.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
- Establece los permisos correctos para que el comando
docker-compose
sea ejecutable:sudo chmod +x /usr/local/bin/docker-compose
- Verifica que la instalación se realizó correctamente:
docker-compose --version
- Deberías ver un resultado similar a esto:
docker-compose version 1.26.0, build 8a1c60f6
- ¡Listo! Docker Compose está instalado en tu sistema.
- Configuración de un archivo
docker-compose.yml
:- Ahora puedes crear un archivo
docker-compose.yml
para definir tus servicios y contenedores. Por ejemplo, puedes configurar un entorno de servidor web usando la imagen oficial de Nginx desde Docker Hub. - En el archivo
docker-compose.yml
, especifica los servicios, imágenes, redes y volúmenes que necesitas para tu aplicación. - Ejecuta tus servicios juntos usando el comando
docker-compose up
.
- Ahora puedes crear un archivo
El archivo docker-compose.yml
es esencial para definir y orquestar servicios y contenedores en Docker Compose. Te explicaré cómo construir uno paso a paso:
- Instalación de Docker Compose:
- Antes de crear un archivo
docker-compose.yml
, asegúrate de tener Docker Compose instalado en tu sistema. Si aún no lo has hecho, sigue los pasos que mencioné en mi respuesta anterior para instalarlo1. - Una vez instalado, estás listo para crear tu archivo
docker-compose.yml
.
- Antes de crear un archivo
- Estructura del archivo
docker-compose.yml
:- El archivo
docker-compose.yml
se define en formato YAML y contiene la descripción de tus servicios y cómo se deben ejecutar. - Aquí tienes un ejemplo básico de un archivo
docker-compose.yml
con dos servicios: uno para una base de datos MongoDB y otro para una aplicación Node.js:
- El archivo
version: '3'
services:
db-mongo:
image: mongo
environment:
MONGO_INITDB_ROOT_USERNAME: myuser
MONGO_INITDB_ROOT_PASSWORD: mypassword
purenode:
image: node:14
ports:
- '3000:3000'
volumes:
- ./app:/usr/src/app
depends_on:
- db-mongo
- En este ejemplo:
db-mongo
utiliza la imagen oficial de MongoDB y establece credenciales de acceso.purenode
utiliza la imagen oficial de Node.js, expone el puerto 3000 y monta un volumen local para la aplicación.- El servicio
purenode
depende del serviciodb-mongo
.
- Personaliza tu archivo
docker-compose.yml
:- Define tus propios servicios, imágenes, puertos, volúmenes y redes según tus necesidades.
- Puedes agregar más servicios, configurar redes personalizadas y especificar volúmenes compartidos.