Cómo crear un entorno Docker óptimo

Para desarrollar software es necesario disponer de un entorno local con todos los servicios disponibles para la correcta ejecución de la aplicación que se está desarrollando.

Por ejemplo, si se está desarrollando una aplicación web con Symfony, será necesario disponer de un servidor web como Apache o Nginx, un intérprete de PHP y probablemente una base de datos en la que guardar la información, como por ejemplo, Postgre o MySQL.

Docker environment

¿Cómo puede ayudarte Docker?

Docker permite subdividir estas tres partes lanzando tres entornos aislados en los que se ejecuta cada servicio. Estos entornos aislados son los contenedores Docker. Continuando con el ejemplo, para ejecutar correctamente nuestra aplicación debemos disponer de tres contenedores en ejecución: uno para el servidor web, uno con el intérprete PHP y uno con la base de datos.

Pero no basta con ejecutar estos dos contenedores. También necesitamos hacer que se comuniquen entre sà­. Como decà­amos, cada contenedor es un entorno aislado que desconoce el mundo exterior. Por este motivo, el contenedor PHP no tiene conocimiento de que exista un contenedor MySQL al que conectarse.

Docker compose

Docker compose es una herramienta que permite crear aplicaciones multicontenedor. Se uso está muy extendido para configurar entornos de desarrollo local, ya que resulta fácil de configurar y cuenta con una là­nea de comandos muy sencillos y rápidos de aprender.

Se configura con un archivo YAML, denominado por acuerdo docker-compose.yaml, aunque no necesariamente. Cuidado, porque también es posible utilizar un archivo diferente si se especifica al iniciar Docker Compose.

Una vez que el archivo de configuración está listo, ya se pueden lanzar los contenedores con el comando:

docker-compose up

… y cerrar todos los contenedores con el comando:

docker-compose down

Archivo Docker-compose.yaml

Veamos cómo se presenta un archivo de configuración para Docker Compose.

version: ‘3.4’
services:
myappdb:
image: mysql:5.7.29
container_name: myappdb
volumes:
– ./docker:/init
command: –init-file /init/db-init.sql
environment:
MYSQL_ROOT_PASSWORD: «secret»
nginx:
image: nginx:latest
container_name: myapp-nginx
ports:
– 80:80
volumes:
– ./docker/nginx.conf:/etc/nginx/conf.d/default.conf
depends_on:
– «myapp»
myapp:
build:
context: ./
container_name: myapp
volumes:
– ./:/var/www/myapp

Ahora veamos las partes más interesantes de este archivo para entender cómo funciona cada una.

version: ‘3.4’

à‰sta es la versión de la sintaxis de configuración utilizada.

myappdb:

Cada servicio se distingue con un nombre. Este nombre es muy importante y debe ser único. De hecho, se utiliza como namespace para llegar al contenedor. En este caso, por ejemplo, la aplicación PHP tendrá que intentar conectarse a la base de datos que tiene como nombre de host «myappdb» y el puerto 3306.

image: mysql:5.7.29
Imagen desde la que iniciar el contenedor.

container_name: myappdb
Nombre del contenedor.

volumes:
– ./docker:/init

Con esta instrucción ejecutamos el mapeo de una carpeta local con una dentro del contenedor, de modo que los archivos contenidos en ella resulten accesibles por parte de un proceso en ejecución dentro del contenedor.

command: –init-file /init/db-init.sql

Añade el argumento al comando principal del archivo Docker o lo reemplaza.

environment:
MYSQL_ROOT_PASSWORD: «secret»

Es posible asignar variables de entorno.

ports:
– 80:80

Es posible mapear un puerto de modo que resulte accesible para el host. En este caso, podremos acceder al contenedor Nginx a través del puerto 80.

build:
context: ./

Para el contenedor PHP no partimos de una imagen ya preparada, sino que la creamos dinámicamente buscando un archivo Docker en la carpeta especificada.

Recursos oficiales

¡Documentación de Docker compose y referencias de Docker compose para consultar en cualquier momento y lugar!

Conclusión

Hemos querido ofrecerte unas nociones básicas sobre Docker Compose y cómo funciona. Consulta la documentación oficial y comienza a experimentar in situ. ¡La mejor manera de aprender es ensuciarse las manos!

Read related articles