• Saltar a la navegación principal
  • Skip to main content
  • Saltar a la barra lateral principal

Geekebrains

Para programadores, maker y geeks en general

  • Inicio
  • YouTube
  • Zona makers!
  • Zona Coders!
  • Zona Junior!
Estás aquí: Inicio / Zona Coders! / docker-compose

20 febrero, 2021 Por admin8049 Deja un comentario

docker-compose

Qué es docker-compose?

Docker Compose es una herramienta que simplifica el uso de Docker. Pudiendo configurar los docker con ficheros YAML es más sencillo crear contenedores, conectarlos entre si, habilitar puertos, volúmenes, etc.

Con Compose puedes crear diferentes contenedores y al mismo tiempo, en cada contenedor, diferentes servicios, unirlos a un volúmen común, iniciarlos y apagarlos, etc. Es un componente fundamental para poder construir aplicaciones y microservicios.

Con docker-compose no necesitamos hacer enormes comandos bash y scripts, Docker Compose te permite mediante archivos YAML para poder instruir al Docker Engine a realizar tareas, programáticamente. Y esta es la clave, la facilidad para dar una serie de instrucciones, y luego repetirlas en diferentes ambientes.

Comandos básicos de docker-compose

>docker-compose up -d

Levanta los contenedores en base al fichero. Con la opcion «-d» queda en modo demonio, sino nos muestra el log que se va generando y nos bloquea el shell.

>docker-compose down

ATENCIÓN: Este aparentemente inocuo comando se CARGA los contenedores.

>docker-compose start

Levanta los servicios, pero no recarga la configuración del fichero.

>docker-compose stop

Para los servicios.

>docker-compose restart

Levanta los servicios, pero no recarga la configuración del fichero.

Fichero docker-compose.yml

Aqui vemos como la siguiente instrucción para levantar un docker de MySql:

docker run -d \ --network todo-app --network-alias mysql \ -v todo-mysql-data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=secret \ -e MYSQL_DATABASE=todos \ mysql:5.7

Se puede meter dentro de un pequeño cluster de docker donde una es el docker que ejecuta el MySql y hay otro docker que es el que ejecuta la app, compartiendo una zona de disco a través de un volumen.

Este sería el docker-compose.yml:

version: "3.7"

services:
  app:
    image: node:12-alpine
    command: sh -c "yarn install && yarn run dev"
    ports:
      - 3000:3000
    working_dir: /app
    volumes:
      - ./:/app
    environment:
      MYSQL_HOST: mysql
      MYSQL_USER: root
      MYSQL_PASSWORD: secret
      MYSQL_DB: todos

  mysql:
    image: mysql:5.7
    volumes:
      - todo-mysql-data:/var/lib/mysql
    environment: 
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: todos

volumes:
  todo-mysql-data:

Ver como crear un fichero docker-compose.yml.

El archivo compose es un archivo YAMLdonde definimos los servicios, redes y volúmenes de los contenedores Docker. Se suele poner en el directorio donde tendremos todo lo necesario para montar los docker.

Estas deficiones contienen toda la configuración que serán aplicadas a cada contenedor iniciado por ese servico. Sería lo mismo que pasarle estos parámetros con el comando docker-run, de la misma manera las definiciones de las redes y volúmenes serían semejantes a los comandos docker network create y docker volume create.

Vamos a ver los principales apartados del fichero:

version

Es la versión del motor de docker-compose para como interpretar el fichero, hay una tabla de relación entre las posibles versiones de ficheros docker-compose y la versión de docker en la que puede funcionar aquí.

Ejemplo:

version: '3'

build

Aqui definimos las opciones de configuración que serán aplicadas al momento del crear el contenedor. Build puede ser especificado como un valor conteniendo una ruta con un contexto de creación o un objeto con la ruta especificada debajo de context y opcionalmente un dockerfile o argumento (args).

Ejemplo:

build: ./directorio

build:
    context: ./directorio
    dockerfile: <ruta a dockerfile alterno>

build: .  (dockerfile en la misma ruta docker-compose.yml)

context

Aqui definimos una ruta conteniendo un Dockerfile o una URL con un repositorio de git. Cuando el valor especificado es una ruta relativa, es interpretada como una ubicación relativa al archivo docker-compose. Este directorio será también el contexto de creación enviado al daemon de docker. Compose creará y le colocará un tag a la imagen con un nombre generado.

Ejemplo:

build:
    context: ./directorio

dockerfile

Archivo Dockerfile alterno. Con esta definición compose utilizará un archivo alterno para crear la imágen. La ruta debe estar especificada.

Ejemplo:

build:
    context: .
    dockerfile: ruta/a/Dockerfile

args

Con esto definimos argumentos de creación. Podemos hacer uso de diversos valores. Si hacemos uso de valores booleanos como, true, false, yes, no, necesitamos encerrarlos en comillas para asegurarnos que no sean convertidos a TRUE o FALSE por el analizador YML.

Argumentos con un solo valor son resueltos como valores de ambiente en la máquina donde estamos corriendo compose.

Ejemplo:

build:
    args:
        version: 1
        user: jsitech

build: 
    args:
        - version=1
        - user=jsitech

image

Especificamos la imágen con el que crearemos el contenedor.

Ejemplo:

image: jsitech/shodan
image: ubuntu:14.04
image: alpine

command

Sustituye el comando por defecto del contenedor

Ejemplo:

command: php -S 0.0.0.0:8080 -t /jsitech
command: [php, -S, 0.0.0.0:8080, -t, /jsitech]

container_name

Especificamos un nombre personalizado para el contenedor. Ya que los nombres de los contenedores de Docker deben ser únicos, si especificamos un nombre no podremos escalar el servicio en mas de un contenedor.

Ejemplo:

container_name: web_jsitech

depends_on

Aquí definimos las dependencias entre los servicios.

Ejemplo:

services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres

dns / dns_search

Aquí definimos servidores dns o dominios de búsqueda DNS personalizados

Ejemplo:

dns: 8.8.8.8
dns:
    - 8.8.8.8
    - 8.8.4.4

dns_search: ejemplo.com
dns_search:
    - ejemplo1.com
    - ejemplo2.com

entrypoint

Reemplaza el punto de entrada por defecto.

Ejemplo:

entrypoint: ruby /ruta/app.rb

Puede ser también una lista

entrypoint:
    - ruby
    - /ruta/app.rb

environment

Aquí agregamos variables de ambientes. Podemos hacer uso de diversos valores y debemos recordar que valores como true, false, yes, no, necesitan ser encerrados en comillas para que el analizador no los convierta a TRUE o FALSE.

Ejemplo:

environment: 
    MYSQL_DATABASE=jsitech
    MYSQL_USER=jsitech
    MYSQL_PASSWORD=jsitech

environment: 
    MYSQL_DATABASE: jsitech
    MYSQL_USER: jsitech
    MYSQL_PASSWORD: jsitech

expose

Expone los puertos sin publicarlos al Host. Solo estarán disponibles para los servicios linkeados. Solo se pueden especificar los puertos internos.

Ejemplo:

expose:
    - “4500”
    - “6000”

links

Linkeamos contenedores con otros servicios. Especificamos el nombre del servicio y el alias, o solo el nombre del servicio. Los contenedores linkeados serán alcanzados con el hostname identificado por el alias o por el nombre del servicio en caso de no haber especificado uno.

Ejemplo:

web:
   links:
      - db
      - dbprueba:mysql

external_links

Linkeamos contenedores fuera de docker-compose.yml y del mismo compose.

Ejemplo:

external_links:
    - alpine2
    - dbpueba:mysql

logging

Configuración de logging para el servicio. Util cuando queremos centralizar los logs de los contenedores.

Ejemplo:

logging:
    driver: syslog
    options:
        syslog-address: “tcp://10.0.0.45:123”

network_mode

Este modo usa los mismo valores con el cliente de docker cuando le pasamos la opción –net.

network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"

networks

Son las redes a las que se unirán los contenedores, referenciando las entradas debajo de las redes de nivel superior.

Ejemplo:

networks:
    - Red Prueba
    - Red Producción

aliases

Los alias son hostnames alternativos que le podemos a los servicios en la red, es decir, que otros contenedores en la misma red pueden llamar al servicio por el nombre de este, o por un alias definidos.

Ejemplo:

networks:
    red-prueba:
        aliases:
            - alias 1
            - alias 2

    red-producción:
        aliases:
            -alias3

En este ejemplo un contenedor puede llamar el servicio u otro contenedor con el nombre del servico o por alias 1 y alias 2 en la red-prueba o por el alias 3 en la red-producción.

Ports

Aquí a diferencia de expose, publicamos los puertos al host y podemos especificar el mapeo (HOST:CONTENEDOR).

Es incompatible con: network_mode: host

Ejemplo:

ports:
- "3000"
    - "3000-3005"
    - "8000:8000"
    - "9090-9091:8080-8081"
    - "49100:22"
    - "127.0.0.1:8001:8001"
    - "127.0.0.1:5000-5010:5000-5010"
    - "6060:6060/udp"

volumes

Montamos rutas o volúmenes, especificamos una ruta en el host (HOST:CONTENEDOR), Igual podemos especificar modo de acceso (HOST:CONTENEDOR:rw)

Ejemplo:

volumes:
    - /opt/data:/var/lib/mysql
    - ./jsitech:/var/www/html

volumes_from

Montamos los volúmenes de otro servicio o contenedor

Ejemplo:

volumes_from:
    - db
    - web_jsitech

Archivado en: Conceptos, Zona Coders! Etiquetado como: docker, docker-compose, yaml

Entrada anterior: « Dockerfile
Siguiente entrada: Crear un entorno de desarrollo WordPress con Docker, en una patada »

Interacciones del lector

Deja una respuesta Cancelar la respuesta

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

Barra lateral primaria

Categorías

  • Conceptos
  • Experimentos
  • GeekeBlocks
  • Noticias Geek
  • Proyectos
  • Sin categoría
  • Zona Coders!
  • Zona Junior!
  • Zona makers!

Etiquetas

Arduino Arduino nano Atom backup Buenas prácticas docker docker-compose dockerfile ECMAScript6 (2015) EditorConfig ES6 ESLint Expresiones regulares git IDE Java javascript JSON JSX lenguajes de programación Librerías de JavaScript mac Material UI MongoDb MVC NetBeans node NodeJS NoSQL Notepad++ nRF24L01 nvm odoo package.json plugins Prettier QWeb ReactJS shell Spring Framework ubuntu Visual Studio Visual Studio Code wordpress yaml

Entradas recientes

  • Firebase
  • _Lodash
  • Crear un entorno de desarrollo WordPress con Docker, en una patada
  • docker-compose
  • Dockerfile
  • Docker
  • TypeScript
  • Cómo tener distintas versiones de node en tu equipo?
  • Heroku
  • Node JS

Copyright © 2021 · GeekeZonia · Aviso Legal · Política de Cookies · Política de Privacidad · Iniciar sesión

Utilizamos cookies propias y de terceros para ofrecer nuestros servicios, recoger información estadística e incluir publicidad. Si continua navegando acepta su instalación y uso. Leer Mas. Acepta
Privacy & Cookies Policy

Privacy Overview

This website uses cookies to improve your experience while you navigate through the website. Out of these, the cookies that are categorized as necessary are stored on your browser as they are essential for the working of basic functionalities of the website. We also use third-party cookies that help us analyze and understand how you use this website. These cookies will be stored in your browser only with your consent. You also have the option to opt-out of these cookies. But opting out of some of these cookies may affect your browsing experience.
Necessary
Siempre activado

Necessary cookies are absolutely essential for the website to function properly. This category only includes cookies that ensures basic functionalities and security features of the website. These cookies do not store any personal information.

Non-necessary

Any cookies that may not be particularly necessary for the website to function and is used specifically to collect user personal data via analytics, ads, other embedded contents are termed as non-necessary cookies. It is mandatory to procure user consent prior to running these cookies on your website.

SAVE & ACCEPT