{"id":269,"date":"2021-06-07T00:29:00","date_gmt":"2021-06-07T00:29:00","guid":{"rendered":"https:\/\/www.escueladefrikis.com\/?p=269"},"modified":"2021-06-07T00:29:00","modified_gmt":"2021-06-07T00:29:00","slug":"levantando-la-infraestructura-local-con-docker","status":"publish","type":"post","link":"https:\/\/escueladefrikis.com\/index.php\/2021\/06\/07\/levantando-la-infraestructura-local-con-docker\/","title":{"rendered":"Levantando la infraestructura local con Docker"},"content":{"rendered":"\n<p>Hace ya varios a\u00f1os que descubr\u00ed Docker y ahora (bueno, desde hace un buen tiempo ya) es una tendencia global: microservicios en contenedores, clusters de contenedores en la nube, etc.<\/p>\n<p>En realidad, esto al 99% de los programadores que conozco ni lo quieren saber ni les interesa: quieren hacer su micro, su back, que funcione y a tirar millas. El problema es que este 99% de programadores ignoran c\u00f3mo les puede facilitar la vida Docker para multitud de tareas muy b\u00e1sicas y hoy voy a contar una de ellas: <strong>montar la infraestructura en local para probar y desarrollar<\/strong>.<\/p>\n<p><!--more--><\/p>\n<p>Esto es algo que podr\u00eda enmarcarse dentro de \u00abpr\u00e1cticas DevOps\u00bb, pero sobre el t\u00e9rmino creo que hay cierta controversia porque cada cual asocia DevOps con responsabilidades diferentes: para unos es m\u00e1s Bamboo y Jenkins, y para otros es Docker y Kubernetes.<\/p>\n<p>No me enrollo m\u00e1s: al grano.<\/p>\n<p>Ahora mismo estoy trabajando en un side project con Laravel 8 en el que estoy implementando el back (lo que vendr\u00eda a ser una API, un micro). Para probarlo, como m\u00ednimo necesito una base de datos, pero adem\u00e1s me gusta pasar un an\u00e1lisis de c\u00f3digo por lo que tambi\u00e9n quiero Sonar (s\u00ed amigos, aunque desarrolles para ti&#8230; utiliza Sonar!).<\/p>\n<p>As\u00ed que para desarrollar en local quiero\/necesito:<\/p>\n<ul>\n<li>Una base de datos y un gestor para esa base de datos<\/li>\n<li>Sonar, para el que tambi\u00e9n necesito una base de datos (podr\u00eda ser la misma, podr\u00eda ser otra)<\/li>\n<\/ul>\n<p>Antiguamente, esto implicaba instalarte MySQL, MySQL Admin, configurarlo como servicio (o no), luego SonarQube&#8230;<\/p>\n<p>Ahora con Docker no instalas cada uno de los componentes de la infra: instalas \u00fanicamente Docker y \u00ablevantas\u00bb los servicios.<\/p>\n<p>Para levantar varios contenedores a la vez, yo utilizo docker compose por simplicidad (ahora ya lo han integrado dentro del Docker CLI) y para la infraestructura de servicios que indicaba anteriormente este ser\u00eda:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker-compose.yml\n\n# Use root\/example as user\/password credentials\nversion: '3.1'\n\nservices:\n\n  mysql_laravel:\n    image: mysql:8.0.22\n    command: --default-authentication-plugin=mysql_native_password\n    restart: always\n    environment:\n      MYSQL_ROOT_PASSWORD: local\n      MYSQL_DATABASE: laravel\n    ports:\n      - 3306:3306\n    volumes:\n      - .\/data\/mysql:\/var\/lib\/mysql\n    networks:\n      - laravel\n  adminer:\n    image: adminer:4.7.7-standalone\n    restart: always\n    ports:\n      - 8080:8080\n    networks:\n      - laravel\n  postgres_sonar:\n    image: postgres:13.1\n    environment:\n      - POSTGRES_USER=sonar\n      - POSTGRES_PASSWORD=sonar\n    volumes:\n      - .\/data\/postgresql\/db:\/var\/lib\/postgresql\n      - .\/data\/postgresql\/data:\/var\/lib\/postgresql\/data\n    networks:\n      - laravel\n  sonarqube:\n    image: sonarqube:8.5.1-community\n    expose:\n      - 9000\n    ports:\n      - \"127.0.0.1:9000:9000\"\n    environment:\n      - sonar.jdbc.url=jdbc:postgresql:\/\/postgres_sonar:5432\/sonar\n      - sonar.jdbc.username=sonar\n      - sonar.jdbc.password=sonar\n    volumes:\n      - .\/data\/sonarqube\/conf:\/opt\/sonarqube\/conf\n      - .\/data\/sonarqube\/data:\/opt\/sonarqube\/data\n      - .\/data\/sonarqube\/extensions:\/opt\/sonarqube\/extensions\n      - .\/data\/sonarqube\/bundled-plugins:\/opt\/sonarqube\/lib\/bundled-plugins\n    networks:\n      - laravel\n    depends_on: \n      - postgres_sonar\n\n\nnetworks:\n  laravel:<\/code><\/pre>\n\n\n\n<p>Esta infraestructura se compone de 4 servicios, es decir, 4 contenedores:<\/p>\n<ul>\n<li>mysql_laravel: la base de datos para la aplicaci\u00f3n. Imagen: <a href=\"https:\/\/hub.docker.com\/_\/mysql\">mysql:8.0.22<\/a><\/li>\n<li>adminer: un gestor para la base de datos mysql_laravel muy muy b\u00e1sico pero suficiente en estos momentos.&nbsp;Imagen: <a href=\"https:\/\/hub.docker.com\/_\/adminer\">adminer:4.7.7-standalone<\/a><\/li>\n<li>postgres_sonar: una base de datos postgreSQL para almacenar los datos de sonar. Imagen: <a href=\"https:\/\/hub.docker.com\/_\/postgres\">postgres:13.1<\/a><\/li>\n<li>sonarqube: poco m\u00e1s que decir: SonarQube. Imagen: <a href=\"https:\/\/hub.docker.com\/_\/sonarqube\">sonarqube:8.5.1-community<\/a><\/li>\n<\/ul>\n<p>En el fichero se pueden ver las variables de entorno (que b\u00e1sicamente son los usuarios y passwords por defecto y una ruta) y lo m\u00e1s importante: qu\u00e9 directorios de la m\u00e1quina local se montan dentro de cada uno de los contenedores. Esto sirve para persistir los datos de las bases de datos (SonarQube tiene un ElasticSearch embebido, ya hablar\u00e9 de \u00e9l en otro art\u00edculo).<\/p>\n<p>Este fichero docker-compose.yml est\u00e1 almacenado en el repositorio de la aplicaci\u00f3n, por lo que si un compa\u00f1ero se baja el repo y quiere levantar exactamente la misma infraestructura para desarrollar en local s\u00f3lo tiene que ejecutar en l\u00ednea de comandos:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ docker-compose up -d<\/code><\/pre>\n\n\n\n<p>Y ya est\u00e1 :p \u00a1\u00a1\u00a1\u00a1Si es que no puede ser m\u00e1s f\u00e1cil!!!<\/p>\n<p>Esta es la infra que yo utilizo pero puedes coger el docker-compose y modificarlo a tu antojo. Dependiendo de cu\u00e1l sea tu infra tendr\u00e1s que modificarla pero apuesto a que pr\u00e1cticamente cualquier aplicaci\u00f3n que puedas necesitar la puedes encontrar en <a href=\"https:\/\/hub.docker.com\/\">DockerHub<\/a> (el \u00abdirectorio\u00bb de im\u00e1genes de contenedores).<\/p>\n<p><strong>Disclaimer 1:<\/strong><\/p>\n<ul style=\"list-style-type: circle;\">\n<li>S\u00ed, claro, pero tienes que instalar Docker.<\/li>\n<li>S\u00ed, claro: tienes que instalar s\u00f3lo UNA aplicaci\u00f3n, y no 4 como ser\u00eda en mi caso.<\/li>\n<\/ul>\n<p><strong>Disclaimer 2:<\/strong><\/p>\n<p>\u00bfPodr\u00eda haber utilizado la misma base de datos para la aplicaci\u00f3n y para sonar utilizando esquemas distintos?<\/p>\n<p>S\u00ed, pero dado que me interesa poder borrar la base de datos de la aplicaci\u00f3n muy r\u00e1pido, la manera m\u00e1s f\u00e1cil es borrar directamente el directorio donde se guarda y recrearla.<\/p>\n<p>Teniendo las dos bases de datos separadas:<\/p>\n<ul>\n<li>Evito errores (ser\u00eda bien f\u00e1cil borrar el esquema de sonar por equivocaci\u00f3n).<\/li>\n<li>Me puedo cargar la base de datos de la aplicaci\u00f3n cuando quiera y recrearla.<\/li>\n<li>Me cuesta lo mismo levantar una base de datos que dos, una vez est\u00e1n puestas en el docker-compose.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6,7,5],"tags":[14,16,22,25],"class_list":["post-269","post","type-post","status-publish","format-standard","hentry","category-devops","category-laravel-8","category-programacion","tag-devops","tag-docker","tag-laravel","tag-php"],"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/escueladefrikis.com\/index.php\/wp-json\/wp\/v2\/posts\/269","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/escueladefrikis.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/escueladefrikis.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/escueladefrikis.com\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/escueladefrikis.com\/index.php\/wp-json\/wp\/v2\/comments?post=269"}],"version-history":[{"count":0,"href":"https:\/\/escueladefrikis.com\/index.php\/wp-json\/wp\/v2\/posts\/269\/revisions"}],"wp:attachment":[{"href":"https:\/\/escueladefrikis.com\/index.php\/wp-json\/wp\/v2\/media?parent=269"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/escueladefrikis.com\/index.php\/wp-json\/wp\/v2\/categories?post=269"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/escueladefrikis.com\/index.php\/wp-json\/wp\/v2\/tags?post=269"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}