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:

ComandoExplicación
docker buildConstruye 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/tagConstruye y etiqueta una imagen para facilitar su seguimiento
docker build https://yourserver/file.tar.gzCrea una imagen a partir de un archivo tar remoto
docker build -t imagen:1.0-<<EOFFROM busyboxRUN echo «hola mundo «EOFConstruye 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:

ComandoExplicación
docker image pruneBorra una imagen no utilizada
docker image prune -aBorra todas las imágenes que no estén siendo utilizadas por contenedores
docker system pruneElimina 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 imageElimina una imagen
docker rm containerElimina un contenedor en ejecución
docker kill $ (docker ps -q)Detiene todos los contenedores en ejecución
docker swarm leaveDeja un enjambre
docker stack rm stacknameElimina 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:

ComandoExplicación
docker start containerInicia un nuevo contenedor
docker stop containerDetiene un contenedor
docker pause containerPausa un contenedor
docker unpause containerDespausa un contenedor
docker restart containerReinicia un contenedor
docker wait containerBloquea un contenedor
docker export containerExporta el contenido del contenedor a un archivo tar
docker attach containerSe une a un contenedor en ejecución
docker wait containerEspera a que se termine el contenedor y muestra el código de salida
docker commit -m “commit message” -a “author” container username/image_name: tagGuarda un contenedor en ejecución como una imagen
docker logs -ft containerSigue los registros de contenedores
docker exec -ti container script.shEjecuta un comando en un contenedor
docker commit container imageCrea una nueva imagen a partir de un contenedor
docker create imageCrea 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:

ComandoExplicación
docker psLista todos los contenedores en ejecución
docker -ps -aLista todos los contenedores
docker diff containerInspecciona los cambios en los directorios y archivos del sistema de archivos del contenedor
docker top containerMuestra todos los procesos en ejecución de un contenedor existente
docker inspect containerMuestra información de bajo nivel sobre un contenedor
docker logs containerReúne los registros de un contenedor
docker stats containerMuestra 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:

ComandoExplicación
docker image lsLista imágenes
docker image rm mysqlElimina una imagen
docker tag image tagEtiqueta una imagen
docker history imageMuestra el historial de imágenes
docker inspect imageMuestra 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:

FlagExplicación
–detach , -dEjecuta un contenedor en segundo plano e imprime el ID del contenedor
–env , -eEstablece variables de entorno
–hostname , -hEstablece un nombre de host a un contenedor
–label , -lCrea una etiqueta de metadatos para un contenedor
–nameAsigna un nombre a un contenedor
–networkConecta un contenedor a una red
–rmRetira el contenedor cuando se detenga
–read-onlyEstablece el sistema de archivos del contenedor como sólo lectura
–workdir , -wEstablece un directorio de trabajo en un contenedor

Comandos de registro

Si necesitas interactuar con Docker Hub, utiliza los siguientes comandos:

ComandoExplicación
docker loginAccede a un registro
docker logoutSale de un registro
docker pull mysqlExtrae una imagen de un registro
docker push repo/ rhel-httpd:latestEnvía una imagen a un registro
docker search termBusca en Docker Hub imágenes con el término especificado

Comandos de servicio

Gestiona todos los servicios con estos comandos básicos de Docker:

ComandoExplicación
docker service lsLista todos los servicios que se ejecutan en un enjambre
docker stack services stacknameLista todos los servicios en ejecución
docker service ps servicenameLista las tareas de un servicio
docker service update servicenameActualiza un servicio
docker service create imageCrea un nuevo servicio
docker service scale servicename=10Escala uno o más servicios replicados
docker service logs stackname servicenameLista todos los registros de servicio

Comandos de red

Si necesitas interactuar con la red Docker, utiliza uno de los siguientes comandos:

ComandoExplicación
docker network create networknameCrea una nueva red
docker network rm networknameElimina una red especificada
docker network lsLista todas las redes
docker network connect networkname containerConecta un contenedor a una red
docker network disconnect networkname containerDesconecta un contenedor de una red
docker network inspect networknameMuestra 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:

  1. 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.
  2. 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áramos docker create seguido de docker 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:

  1. docker stop: Este comando detiene el contenedor de manera graceful (graciosa) y proporciona una salida segura. Cuando ejecutas docker 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.
  2. 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 usar docker 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:

  1. 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.
  2. 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.
  3. Sintaxis del comando:

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:

  1. FROM: Esta directiva especifica la imagen base desde la cual construir. Por ejemplo:FROM ubuntu:20.04
  2. RUN: Ejecuta comandos en el contenedor durante la construcción de la imagen. Por ejemplo:RUN apt-get update && apt-get install -y python3
  3. COPY y ADD: Copian archivos o directorios desde el host al contenedor. Por ejemplo:COPY app.py /app/
  4. WORKDIR: Establece el directorio de trabajo dentro del contenedor. Por ejemplo:WORKDIR /app
  5. EXPOSE: Especifica los puertos en los que el contenedor escuchará. Por ejemplo:EXPOSE 8080
  6. CMD y ENTRYPOINT: Definen el comando que se ejecutará cuando se inicie el contenedor. La diferencia es que CMD puede ser sobrescrito al ejecutar el contenedor, mientras que ENTRYPOINT 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:

  1. 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
  2. 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
  3. 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.
  4. 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.

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:

  1. 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.
  2. 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.

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:

  1. Instalación de Docker Compose:
  2. 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:
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 servicio db-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.

Publicaciones Similares

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *