pedroreinarojas.com
flag-english-language
flag-spanish-language

Docker y docker compose

image-cover

Cuando oyes a la gente hablar de Docker y/o Docker Compose, parece algo apasionante pero suena un poco a chino porque todo es demasiado técnico.
La curva de aprendizaje no es precisamente suave, aunque gracias a Youtubers como «Pelado Nerd» puedes ahorrarte muchos quebraderos de cabeza.

Me encanta Docker, y cuanto más conozco este tipo de virtualización tan cercano al sistema operativo (que nada tiene que ver con virtualizar máquinas con VirtualBox y similares), más cosas virtualizo.

Puedes virtualizar entornos de desarrollo, cms’s, tiendas online.
Con Docker puedes incluso virtualizar aplicaciones (por lo menos en linux), puedes encontrar en la web wide world por ejemplo, como virtualizar con docker compose el famoso sublime text.

¿Y que es Docker?

Docker es un virtualizador de software.
Para pillarlo rápido.
Es como si instalases un virtualbox, pero sin instalarle el sistema operativo, sólo el software en cuestión. Y no importa si usas un Ubuntu o un Windows, todos funcionará exactamente igual de forma aislada a tu entorno.
Docker instala imágenes y contenedores, usando siempre tu sistema operativo.
En Docker una imagen es el software, mysql, wordpress, drupal.
En Docker un contenedor es la instancia de una imagen.
Te explico mejor esto último.
Puedes instalar 3 wordpress distintos, cada uno de esos wordpress va a ser el sitio o dominio que subirás a tu hosting, y que probablemente primero prefieras crearlo y testearlo localmente.

Imágenes y contenedores de Docker

Cuando haces un «docker build» o «docker up», lo primero que va a hacer Docker es crear las imágenes, y luego los contendores.

Si tu fichero docker-compose contiene los «ingredientes» para Apache, Nginx, WordPress y Phpmyadmin, esto creará de forma automática cada una de esas imágenes.

Después creará un contenedor por cada una de esas imágenes.

El contenedor es una instancia de la imagen. Como si la imagen fuera una plantilla y el contenedor una extensión de la misma.

Y si clonamos este entorno, o creamos otro que también use Apache, usará esa misma imagen.

Es decir. Si tenemos 5 sitios virtualizados con Docker que usan Apache, no va a instalar 5 apaches, si no que no instalará sólo 1 y estará compartido para todos los contenedores.

Más sobre Docker

La magia de docker es tal, que puedes ejecutar entornos de php 5, mientras que tu máquina permanece en la versión 7.2, o simplemente no tiene php.

La manera en como se trabaja todo en docker, es formando una red entre los contenedores, donde ellos se ven y se entienden a través de los puertos.

Por ejemplo, instalas un mysql especificando como puerto 8090.
Instalas 3 cms’s distintos, que van a necesitar mysql. Pues a estos les dices que su mysql está en el puerto 8090. Y yatá…

Instalas un software con un php 4, uuuuuuuuuuuuuuuuu, para el puerto 9091.
En el navegador usarás localhost:9091 y parecerá que el software está en tu propia máquina.
También puedes entrar en el contenedor, y trabajar en el interior y ejecutar cosas en él, que sería el análogo de estar en la consola de un virtualbox.

¿Y que es docker compose?

Pues si Docker es magia, docker compose no tiene palabras.
Docker compose es un ficherito, donde se describe la lista de imagenes y contenedores que quieres crear, y como se interconectan entre ellos.

Es como una receta de cocina, donde tu vas a declarar que ingredientes usas y como los mezclas.

Esto se hace con el comando docker-compose.yml
Y cuando te sitúas en la carpeta de dicho fichero, haces «docker-compose up».
Entonces actúa la termo-mix 😀

Ejemplo de un docker-compose de wordpress:

services: 
  php: 
    image: wordpress 
    restart: 'always' 
    ports: 
      - 0.0.0.0:80:80 
    depends_on: 
      - mysql 
    links:  
      - mysql 
    volumes:  
      - ./data/www:/var/www/html 
 
  mysql: 
    image: mysql 
    restart: 'always' 
    volumes:  
      - ./data/mysql:/var/lib/mysql 
    environment: 
      MYSQL_ROOT_PASSWORD: root 
      MYSQL_DATABASE: my_site 
      MYSQL_USER: root 
      MYSQL_PASSWORD: root

Donde «volumes» son los datos volátiles.
Fijaos en mysql, volumes. Estamos haciendo que los datos mysql esté en una carpeta compartida con el host. («host» es nuestra máquina real, «contenedor» es el interior de docker)

Osea, que cuando nosotros hagamos un zip de la carpeta donde está situado el fichero docker-compose.yml, y nos lo llevemos a otro lugar, el nuevo contenedor volverá a «enganchar» los datos de mysql.

Enlaces útiles de docker y docker compose

Por cierto, sitio oficial de Docker y su documentación
https://docs.docker.com/

Si lo quereis instalar, encontrareis por google como hacerlo desde vuestro sistema operativo.
Por ejemplo para instalarlo desde ubuntu 18
https://www.digitalocean.com/community/tutorials/como-instalar-docker-compose-en-ubuntu-18-04-es

Ventajas al dockerizar un entorno.

Si no has probado nunca docker-compose, cuando lo hagas será como comer pipas, no querrás parar de aprender y usarlo cada vez más.

Documento creado por Pedro Reina Rojas
17 de abril de 2020