¿Qué es Docker?

No, no estamos hablando de una marca de ropa, sino de una herramienta que se está volviendo indispensable para cualquier desarrollador.

Hasta la llegada de Docker, en las empresas de software teníamos que lidiar con distintas tecnologías, las distintas versiones de éstas, cambiar continuamente de versiones entre proyecto y proyecto, etc. Si además se unía un nuevo programador al equipo, este debía de instalar todo el entorno de desarrollo necesario para trabajar en estos proyectos. Todo este trabajo son horas, y el tiempo es un bien del que no solemos disponer normalmente.

¿Y si dispusiéramos de un entorno de desarrollo completo en cuestión de segundos? ¿Y si el cambio a otro proyecto distinto fuese igual de rápido ejecutando un simple comando? ¿Podríamos tener el mismo entorno que en producción? Estas son algunas de las ventajas que nos ofrece Docker a los programadores de hoy en día.

¿Por qué es tan importante para nosotros?

En Bloonde cada día trabajamos en distintos proyectos que usan distintas tecnologías: Laravel, Angular, Vuejs, Ionic, nodejs. Y en ocasiones, estos proyectos usan distintas versiones entre sí, por lo que una herramienta como Docker se vuelve imprescindible.

Pero... ¿Qué es eso de los contenedores? Docker nos permite crear en tiempo récord un contenedor totalmente aislado de nuestro sistema operativo. Un auténtico entorno de pruebas "sandbox" que nos permite probar cualquier software sin interferir en nuestro equipo. ¿Una máquina virtual? No, puesto que compartiremos parte de los recursos del sistema operativo de nuestra máquina anfitrión, y es por ello, que logramos levantar estos entornos mucho más rápido de lo que haríamos con una máquina virtual. Con Docker nos ahorraremos tener que arrancar un nuevo kernel, sistema operativo, simulación de hardware, etc.

Para conseguir esto, docker usa una tecnología de Linux llamada cgroups y namespaces, por lo que cualquier proceso que se ejecute en un contenedor, se ejecutará realmente en nuestra máquina, pero no afectará a ésta en ningún momento.

Para saber más, como siempre, acude a la documentación oficial

Montando contenedores Docker

Rápido y desde línea de comandos

Dejemos a un lado esta parte tan técnica y vayamos al grano, ¿Como de fácil es levantar un contenedor de Docker? Basta con ejecutar un comando como el siguiente para tener todo un Ubuntu en su última versión corriendo en un contenedor.

docker run -it ubuntu

Con la palabra ubuntu nos estamos refiriendo a la imagen Docker que usaremos para levantar el contenedor, y estas imágenes son las plantillas que incluirán las aplicaciones, librerías, etc. Necesarias para hacer funcionar nuestra aplicación.

Definiendo nuestras propias imágenes

Este es solo un ejemplo, en Docker Hub dispondremos de todo un repositorio cargado de imágenes de Docker oficiales y creadas por la comunidad que seguro cubrirán las necesidades de la mayoría de nuestros proyectos, y si no lo cubre, siempre podremos crear nuestras propias imágenes usando los dockerfile, donde a partir de una imagen base como en el siguiente caso, en que partimos de una imagen con Apache y PHP y le instalaremos la extensión xdebug:

FROM php:8.0-apache

RUN pecl install xdebug

    && docker-php-ext-enable xdebug

RUN  echo 'zend_extension=xdebug.so \n

xdebug.mode=debug\n

xdebug.client_host=172.23.0.1\n

xdebug.client_port=9003 \n

xdebug.start_with_request=yes > /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini

Listo, con el siguiente comando, podremos crear nuestra imagen y levantar los contenedores que deseemos con ella:

docker build -t "nombre_imagen" .

¿Y si necesitamos más de un contenedor?

Para ello usamos docker-compose una herramienta con la que podremos definir los diferentes contenedores necesarios para un mismo proyecto usando un archivo docker-compose.yml lo que nos permitirá levantar nuestro entorno con un simple comando:

docker-compose up

A continuación nuestro archivo docker-compose.yml:

version: '3'

services:

  app:

    container_name: app-proyecto

    image: php:8.0-apache

    working_dir: /var/www/html

    volumes:

      - ./:/var/www/html/

    ports:

      - 80:80

    networks:

      - servidor-web

    depends_on:

      - mysql

  mysql:

    image: mysql

    container_name: mysql-proyecto

    env_file: ./.env

    volumes:

      - dbdata:/var/lib/mysql

    environment:

      MYSQL_DATABASE: proyecto_ddbb

      MYSQL_USER: develop

      MYSQL_PASSWORD: Qñ+er*rF_r

    ports:

      - 3306:3306

    networks:

      - servidor-web

    restart: on-failure:3

networks:

  servidor-web:

volumes:

  dbdata:

Así de fácil dispondremos de un entorno de desarrollo con php y servidor de mysql conectado mediante las networks, y no solo eso, sino que podremos trabajar con nuestro IDE en el proyecto gracias a la definición de los volumes.

Lo quiero para ayer

Existen diferentes herramientas como Laradock que nos proveen de toda la configuración necesaria para trabajar en Laravel con Docker, pero en Bloonde preferimos "cocinarnos" nuestros propios entornos con todas las necesidades para cada proyecto. Esto ya es una cuestión de metodología y de las características de cada empresa, por lo que a partir de aquí tú decides.

Si tienes un proyecto en mente contacta con nosotros y lo haremos realidad usando la mejor tecnología.