3.- Docker Compose

Nombre de contenedor

Establecer un nombre de contenedor para poder gestionar los contenedores independientemente de la carpeta padre.

services:
  app1:
    image: thecocktail/ruby-base:2.3.3
    container_name: app1

Utilizar healthchecks

Utilizar healthchecks para verificar el estado de los contenedores

services:
  db:
    image: 'mysql:5.6'
    environment:
      MYSQL_ROOT_PASSWORD: password
    healthcheck:
      test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"]
      timeout: 20s
      retries: 10

Utilizar usuarios non-root

Usar usuarios que no sean root. Esto se puede gestionar desde el dockerfile o desde el docker-compose. De este modo el contenedor se levantará con el UID del usuario que lo ejecute.

services:
  app1:
    image: thecocktail/ruby-base:2.3.3
    container_name: app1
    user: "${UID}:${GID}"
$ UID=${UID} GID=${GID} docker-compose up

Dependencias

Marcar las dependencias entre los contenedores para que en caso de arrancar solo uno, se arranquen sus dependencias.

services:
  app1:
    image: thecocktail/ruby-base:2.3.3
    depends_on:
      - db
  db:
    image: mysql:5.6
    environment:
      MYSQL_ROOT_PASSWORD: password

Networking

Si los contenedores de un docker-compose tienen que conectarse a los contenedores de otro docker-compose, gestionarlo mediante networks y no contra conexiones a puertos de localhost.

Crear la red de travesía:

docker network create app-net
  • Docker-compose-app-1:
services:
  app1:
    image: thecocktail/ruby-base:2.3.3
    container_name: app1
    networks:
     - app-net   
networks:
  app-net:
    external:
      name: app-net
  • Docker-compose-app-2:
services:
  app2:
    image: thecocktail/ruby-base:2.3.3
    container_name: app2
    networks:
     - app-net
networks:
  app-net:
    external:
      name: app-net

Interactive processes

Si se van a ejecutar comandos desde consola en el Docker, es recomendable habilitar el tty y el stdin_open.

services:
  app1:
    image: thecocktail/ruby-base:2.3.3
    Container_name: app1
    stdin_open: true
    tty: true

Gestión de volúmenes

A no ser que se le quieran pasar ficheros o directorios existentes a Docker, utilizar la gestión de volúmenes de Docker.

services:
  db:
    image: mysql:5.6
      environment:
        MYSQL_ROOT_PASSWORD: password  
    volumes:
      - db:/var/lib/mysql
volumes:
  db: