Conceptos Básicos de Docker Compose

Table of contents

Qué es Docker Compose?

La documentación oficial en linea de Docker Complse dice lo siguiete:

Docker Compose es una herramienta para definir y ejecutar aplicaciones multicontenedor. Es la clave para lograr una experiencia de desarrollo e implementación optimizada y eficiente.

Compose simplifica el control de toda la pila de aplicaciones, lo que facilita la administración de servicios, redes y volúmenes en un único archivo de configuración YAML comprensible. Luego, con un solo comando, puede crear e iniciar todos los servicios desde su archivo de configuración._

Asi que Docker Compose es una herramienta bastante útil que puede usarse para instanciar un ambiente complete de desarrollo o aprendizaje.

Lo primero que se hace es crear un archive llamado compose.yml. Luego usamos la utilidad de docker compose para empezar y usar el ambiente. Por ultimo, podemos destruir y recrear el ambiente como sea necesario.

Crear el archivo compose.yaml

A continuación creamos una carpeta donde podamos trabajar. Cambiamos a la carpeta y creamos el archivo compose.yml.

-> mkdir ~/docker_compose/compose_test
-> cd ~/docker_compose/compose_test
-> vi compose.yml

En estos ejercicios usamos la imagen de docker dockio/u2204-devesp:1.0 especificamente creada para el sitio DevEsp.

Este es un contenido simple de un archivo de docker compose que contiene código para dos servicios. Cada servicio equivale a un contenedor.

services:

# U22 - FIRST
  ubuntu2204-1-devesp:
    image: dockio/u2204-devesp:1.0
    hostname: ubuntuOne
    container_name: ubuntu2204-1-ubuntuOne
    privileged: true 
    entrypoint: ["/usr/sbin/init"]    
    restart: on-failure
    volumes:
      - "./:/hostdata"    
    command: ["sleep", "infinity"] 

# U22 - SECOND
  ubuntu2204-2-devesp:
    image: dockio/u2204-devesp:1.0  
    hostname: ubuntuTwo
    entrypoint: ["/usr/sbin/init"]    
    container_name: ubuntu2204-2-ubuntuTwo
    privileged: true 
    restart: on-failure
    volumes:
      - "./:/hostdata"    
    command: ["sleep", "infinity"]

La estructura del archivo es simple:

  • services: es la linea que encabeza el archivo
  • ubuntu2204-1-devesp: es el nombre del servicio
  • image: la imagen de docker que usamos para instanciar el contenedor
  • hostname: el nombre de host con que deseamos personalizar el contenedor y diferenciarlo de otros
  • container_name: el nombre del contenedor con que deseamos personalizar el contenedor y diferenciarlo de otros
  • entrypoint: el punto de entrada indicando que deseamos correr el proceso de init
  • volumes: son carpetas del host de docker para compartir con el contenedor
  • command: truco usado para mantener el contenedor corriendo infinitamente

A seguir, creamos el ambiente.

Usamos la bandera -d para crear el ambiento en el fondo y no interrumpir accesso a la terminal.

-> docker compose up -d
[+] Running 3/3
 ✔ Network compose_test_default      Created              0.0s
 ✔ Container ubuntu2204-2-ubuntuTwo  Started              0.0s
 ✔ Container ubuntu2204-1-ubuntuOne  Started              0.0s

Estructura del Ambiente Activo

EL argumento config nos permite ver los detalles que docker compose uso para crear el ambiente.
Esto es muy util para corroborar los parametros de configuracion en caso de problemas.

-> docker compose config
name: compose_test
services:
  ubuntu2204-1-devesp:
    command:
    - sleep
    - infinity
    container_name: ubuntu2204-1-ubuntuOne
    entrypoint:
    - /usr/sbin/init
    hostname: ubuntuOne
    image: dockio/u2204-devesp:1.0
    networks:
      default: null
    privileged: true
    restart: on-failure
    volumes:
    - type: bind
      source: /Users/devuser/practice_docker/docker_compose/compose_test/compose.yml
      target: /hostdata
      bind:
        create_host_path: true
  ubuntu2204-2-devesp:
    command:
    - sleep
    - infinity
    container_name: ubuntu2204-2-ubuntuTwo
    entrypoint:
    - /usr/sbin/init
    hostname: ubuntuTwo
    image: dockio/u2204-devesp:1.0
    networks:
      default: null
    privileged: true
    restart: on-failure
    volumes:
    - type: bind
      source: /Users/devuser/practice_docker/docker_compose/compose_test/compose.yml
      target: /hostdata
      bind:
        create_host_path: true
networks:
  default:
    name: compose_test_default

Listar Contenedoros

Ahora podenos listar contenedores.

-> docker compose ls
NAME                                                     STATUS              CONFIG FILES
compose_test                                             running(2)          /Users/devuser/practice_docker/docker_compose/compose_test/compose.yml

Esto muestra la informacion de los contenedores que estan corriendo.

->  docker compose ps
NAME                     IMAGE                     COMMAND                           SERVICE               CREATED         STATUS         PORTS
ubuntu2204-1-ubuntuOne   dockio/u2204-devesp:1.0   "/usr/sbin/init sleep infinity"   ubuntu2204-1-devesp   2 minutes ago   Up 2 minutes
ubuntu2204-2-ubuntuTwo   dockio/u2204-devesp:1.0   "/usr/sbin/init sleep infinity"   ubuntu2204-2-devesp   2 minutes ago   Up 2 minutes

Las columnas se definen así:

NAME
el nombre dado en container_name en el archive compose.yml
IMAGE
la imagen de docker usada para instanciar el contenedor
COMMAND
el comando usado como punto de entrada al contenedor
SERVICE
el nombre del servicio que identifica al contendor especificado en el archive compose.yml
CREATED
tiempo que ha pasado desde que el contenedor fue instanciado
STATUS
la condición actual del contenedor
PORTS
números de puertos si han sido definidos en el archive compose.yml

Podemos obtener el nombre del servicio.

-> docker-compose config --services
ubuntu2204-1-devesp
ubuntu2204-2-devesp

Entrar a un contenedor

Para entrar a un contenedor y tener accesso a la terminal, podemos usar el comando a seguir en el host de Docker.
Para esto usamos el nombre del contenedor bajo la columna NAME de la salida de docker compose ps.

-> docker exec -it ubuntu2204-1-ubuntuOne bash

Esa acción nos dara accesso a la terminal del contenedor.

Una vez dentro del contenedor podemos verificar usando el comando hostname.

root@ubuntuOne $ hostname
ubuntuOne

Desde ese momento podemos interactuar con el contenedor de acuerdo al propósito que tenemos en mente.

Parar y Restablecer un Contenedor

Podemos parar un contenedor específico usando el nombre del servicio.

 -> docker compose stop ubuntu2204-2-devesp
[+] Stopping 1/1
 ✔ Container ubuntu2204-2-ubuntuTwo  Stopped

Tambien podemos re-empezar un contendor que hemos parado.

-> docker compose start ubuntu2204-2-devesp
[+] Running 1/1
 ✔ Container ubuntu2204-2-ubuntuTwo  Started

Destruir y Restablecer un contenedor

Tomando la list de servicios dados for el comando docker-compose config --services Aplicamos la sintaxis a seguir”

-> docker compose down <service> 

-> docker compose up <service> &

Usamos el signo comercial & para indicar que el contenedor corra en el fondo y regresar a la linea de comandos.

Por ejemplo, aqui destruimos y recobramos el contenedor ubuntu2204-2-devesp:

-> docker compose down ubuntu2204-2-devesp
[+] Running 2/1
 ✔ Container ubuntu2204-2-ubuntuTwo  Removed                         10.2s
 ! Network compose_test_default      Resource is still in use

-> docker compose up ubuntu2204-2-devesp &
[+] Running 1/0
 ✔ Container ubuntu2204-2-ubuntuTwo  Created                          0.0s
Attaching to ubuntu2204-2-ubuntuTwo

Destruir el Ambiente de Docker Compose

Podemos destruir completamente el ambiente de docker compose usando el argumento down.

-> docker compose down -v
[+] Running 2/2
[+] Running 3/3untu2204-1-ubuntuOne  Stopped                          10.2s
 ✔ Container ubuntu2204-1-ubuntuOne  Removed                          10.2s
 ✔ Container ubuntu2204-2-ubuntuTwo  Removed                          10.2s
 ✔ Network compose_test_default      Removed

Al destruir el ambiente se pierden todas las persolizaciones y datos creadas dentro del contenedor.

Para evitar perder data que hemos generado se recomienda agregar un volumen1 a la configuración. Por esta razón agregamos esto al archivo usado aqui.

    volumes:
      - "./:/hostdata

Ahora corroboremos que no hay mas contenedors corriendo.

-> docker compose ps
NAME      IMAGE     COMMAND   SERVICE   CREATED   STATUS    PORTS

Referencias

Ver la documentación oficial en linea de Docker Complse

Return to main page.

  1. Ver la documentación acerca volumenes en Docker Compose