{"id":9155,"date":"2022-04-23T15:35:02","date_gmt":"2022-04-23T15:35:02","guid":{"rendered":"https:\/\/capitalsoftware.com.ni\/?p=9155"},"modified":"2022-04-23T15:35:04","modified_gmt":"2022-04-23T15:35:04","slug":"que-es-docker-aprenda-a-usar-contenedores-explicado-con-ejemplos","status":"publish","type":"post","link":"https:\/\/capitalsoftware.com.ni\/?p=9155","title":{"rendered":"\u00bfQu\u00e9 es Docker? Aprenda a usar contenedores: explicado con ejemplos"},"content":{"rendered":"\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/www.freecodecamp.org\/news\/content\/images\/size\/w2000\/2022\/04\/how-to-use-docker-containers.png\" alt=\"\u00bfQu\u00e9 es Docker?  Aprenda a usar contenedores: explicado con ejemplos\"\/><figcaption>Los contenedores son una herramienta esencial para el desarrollo de software en la actualidad.\u00a0<br>Ejecutar aplicaciones en cualquier entorno se vuelve f\u00e1cil cuando aprovecha los contenedores.<\/figcaption><\/figure><\/div>\n\n\n\n<p>La tecnolog\u00eda m\u00e1s popular para ejecutar contenedores es&nbsp;<a href=\"https:\/\/www.docker.com\/\">Docker<\/a>&nbsp;, que se ejecuta en cualquier sistema operativo.<\/p>\n\n\n\n<p>En esta publicaci\u00f3n de blog, aprender\u00e1 a usar Docker para los 3 casos de uso m\u00e1s esenciales.&nbsp;Aprender\u00e1s a:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>ejecutar una base de datos localmente usando Docker,<\/li><li>ejecutar pruebas automatizadas utilizando una base de datos dockerizada,<\/li><li>ejecute su aplicaci\u00f3n localmente y en producci\u00f3n usando Docker.<\/li><\/ul>\n\n\n\n<p>Utilizar\u00e1 una aplicaci\u00f3n Java&nbsp;<a href=\"https:\/\/spring.io\/projects\/spring-boot\">Spring Boot<\/a>&nbsp;, pero todos los aprendizajes se aplican a cualquier otro lenguaje de programaci\u00f3n de su elecci\u00f3n.<\/p>\n\n\n\n<p>Para ejecutar todos los ejemplos, necesita:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/docs.docker.com\/engine\/install\/\">Instalar ventana acoplable<\/a><\/li><li><a href=\"https:\/\/www.java.com\/de\/download\/\">Instalar Java<\/a><\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"run-isolated-applications-using-docker\">Ejecute aplicaciones aisladas usando Docker<\/h2>\n\n\n\n<p>Docker elimina las tareas de configuraci\u00f3n repetitivas y mundanas y se utiliza a lo largo del ciclo de vida del desarrollo para un desarrollo de aplicaciones r\u00e1pido, f\u00e1cil y port\u00e1til: escritorio y nube.&nbsp;(Fuente:&nbsp;<\/p>\n\n\n\n<p><a href=\"https:\/\/www.docker.com\/use-cases\/\">https:\/\/www.docker.com\/use-cases\/<\/a>&nbsp;)<\/p>\n\n\n\n<p>El n\u00facleo de la superpotencia de Docker es aprovechar los llamados&nbsp;<a href=\"https:\/\/en.wikipedia.org\/wiki\/Cgroups\">cgroups<\/a>&nbsp;para crear entornos livianos, aislados, port\u00e1tiles y de alto rendimiento, que puede iniciar en segundos.<\/p>\n\n\n\n<p>Veamos c\u00f3mo puede usar Docker para ser m\u00e1s productivo.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"database-containers\">Contenedores de bases de datos<\/h2>\n\n\n\n<p>Con Docker, puede iniciar muchos tipos de bases de datos en segundos.&nbsp;Es f\u00e1cil y no contamina su sistema local con otros requisitos que necesita para ejecutar la base de datos.&nbsp;Todo viene empaquetado con el contenedor Docker.<\/p>\n\n\n\n<p>Al buscar en&nbsp;<a href=\"https:\/\/hub.docker.com\/\">hub.docker.com<\/a>&nbsp;, puede encontrar contenedores listos para usar para muchas bases de datos.<\/p>\n\n\n\n<p>Usando el&nbsp;<code>docker run<\/code>comando, puede iniciar un&nbsp;<a href=\"https:\/\/hub.docker.com\/_\/mysql\/\">contenedor MySQL Docker<\/a>&nbsp;.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker run --rm -v \"$PWD\/data\":\/var\/lib\/mysql --name mysql -e MYSQL_ROOT_PASSWORD=admin-password -e MYSQL_DATABASE=my-database -p 3306:3306 mysql:8.0.28-debian<\/code><\/pre>\n\n\n\n<p>Este comando utiliza funciones avanzadas para ejecutar un contenedor Docker:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><code>-v \"$PWD\/data\"<\/code>asigna su directorio local&nbsp;<code>.\/data<\/code>al contenedor Docker, lo que le permite iniciar el contenedor Docker sin perder sus datos,<\/li><li><code>-p 3306:3306<\/code>asigna el puerto del contenedor&nbsp;<code>3306<\/code>a nuestra m\u00e1quina para que otras aplicaciones puedan usarlo,<\/li><li><code>-e MYSQL_DATABASE=my-database<\/code>establece una variable de entorno para crear una nueva base de datos llamada&nbsp;<code>my-database<\/code>autom\u00e1ticamente,<\/li><li><code>-e MYSQL_ROOT_PASSWORD=admin-password<\/code>establece una variable de entorno para establecer la contrase\u00f1a de administrador,<\/li><li><code>--rm<\/code>retira el contenedor cuando se detiene.<\/li><\/ul>\n\n\n\n<p>Estas variables de entorno y m\u00e1s est\u00e1n documentadas en la&nbsp;<a href=\"https:\/\/hub.docker.com\/_\/mysql\/?tab=description\">p\u00e1gina de im\u00e1genes de Docker<\/a>&nbsp;.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"how-to-use-database-containers-for-development\">C\u00f3mo utilizar contenedores de bases de datos para el desarrollo<\/h3>\n\n\n\n<p>Utilizar\u00e1 una pila de tecnolog\u00eda popular para crear una aplicaci\u00f3n web basada en&nbsp;<a href=\"https:\/\/www.w3schools.com\/java\/java_intro.asp\">Java<\/a>&nbsp;y&nbsp;<a href=\"https:\/\/spring.io\/projects\/spring-boot\">Spring Boot<\/a>&nbsp;.&nbsp;Para centrarse en las partes de Docker, puede clonar una aplicaci\u00f3n de demostraci\u00f3n simple de la&nbsp;<a href=\"https:\/\/spring.io\/guides\/gs\/accessing-data-rest\/\">Gu\u00eda oficial de acceso a datos JPA con descanso<\/a>&nbsp;.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Download the sample application\ngit clone https:\/\/github.com\/spring-guides\/gs-accessing-data-rest.git\n\n# Open the final application folder\ncd complete<\/code><\/pre>\n\n\n\n<p>La aplicaci\u00f3n viene con una base de datos en memoria, que no es valiosa para la producci\u00f3n porque no permite que m\u00faltiples servicios accedan y modifiquen una sola base de datos.&nbsp;Una base de datos&nbsp;<a href=\"https:\/\/www.mysql.com\/\">MySQL<\/a>&nbsp;es m\u00e1s adecuada para escalar su aplicaci\u00f3n a muchas m\u00e1s lecturas y escrituras.<\/p>\n\n\n\n<p>Por lo tanto, agregue el controlador MySQL a su&nbsp;<code>pom.xml<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>       &lt;!-- Disable in memory database --&gt;\n       &lt;!--\n       &lt;dependency&gt;\n           &lt;groupId&gt;com.h2database&lt;\/groupId&gt;\n           &lt;artifactId&gt;h2&lt;\/artifactId&gt;\n           &lt;scope&gt;runtime&lt;\/scope&gt;\n       &lt;\/dependency&gt;\n       --&gt;\n \n       &lt;!-- MySQL driver --&gt;\n       &lt;dependency&gt;\n           &lt;groupId&gt;mysql&lt;\/groupId&gt;\n           &lt;artifactId&gt;mysql-connector-java&lt;\/artifactId&gt;\n           &lt;scope&gt;runtime&lt;\/scope&gt;\n       &lt;\/dependency&gt;\n<\/code><\/pre>\n\n\n\n<p>Ahora, debe agregar la configuraci\u00f3n para conectarse a su base de datos agregando un archivo de configuraci\u00f3n&nbsp;<code>src\/main\/resources\/application.properties<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Database configuration\nspring.datasource.url=jdbc:mysql:\/\/localhost:3306\/my-database\nspring.datasource.username=root\nspring.datasource.password=admin-password\n \n# Create table and database automatically\nspring.jpa.hibernate.ddl-auto=update<\/code><\/pre>\n\n\n\n<p>Ahora puede iniciar la aplicaci\u00f3n y llamar a los puntos finales existentes:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Get all people\ncurl http:\/\/localhost:8080\/people\n\n# Add a person\ncurl -i -H \"Content-Type:application\/json\" -d '{\"firstName\": \"Frodo\", \"lastName\": \"Baggins\"}' http:\/\/localhost:8080\/people\n\n# Get all people again, which now returns the created person\ncurl http:\/\/localhost:8080\/people<\/code><\/pre>\n\n\n\n<p>Us\u00f3 con \u00e9xito su aplicaci\u00f3n rudimentaria, que escribe y lee datos en su base de datos.&nbsp;El uso de la base de datos MySQL Docker le brinda una base de datos s\u00f3lida en segundos y puede usarla desde cualquier aplicaci\u00f3n.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"how-to-use-database-containers-for-integration-tests\">C\u00f3mo usar contenedores de bases de datos para pruebas de integraci\u00f3n<\/h3>\n\n\n\n<p>La aplicaci\u00f3n ya tiene pruebas que esperan una base de datos en ejecuci\u00f3n.&nbsp;Pero, debido a que reemplaz\u00f3 su base de datos en memoria con una base de datos MySQL real, las pruebas no se ejecutar\u00e1n correctamente si detiene su base de datos.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Stop database\ndocker rm -f mysql\n\n# Run tests\n.\/mvnw clean test\n\n... skipped output ...\n&#91;ERROR] Tests run: 7, Failures: 0, Errors: 7, Skipped: 0\n... skipped output ...<\/code><\/pre>\n\n\n\n<p>Para iniciar y detener r\u00e1pidamente los contenedores que ejecutan pruebas, hay una herramienta \u00fatil llamada&nbsp;<a href=\"https:\/\/github.com\/testcontainers\">testcontainers<\/a>&nbsp;.&nbsp;All\u00ed encontrar\u00e1 bibliotecas para muchos lenguajes de programaci\u00f3n, incluido Java.<\/p>\n\n\n\n<p>Primero, debe agregar algunas dependencias a su&nbsp;<code>pom.xml<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>       &lt;!-- testcontainer --&gt;\n       &lt;dependency&gt;\n           &lt;groupId&gt;org.testcontainers&lt;\/groupId&gt;\n           &lt;artifactId&gt;testcontainers&lt;\/artifactId&gt;\n           &lt;version&gt;1.16.3&lt;\/version&gt;\n           &lt;scope&gt;test&lt;\/scope&gt;\n       &lt;\/dependency&gt;\n       &lt;dependency&gt;\n           &lt;groupId&gt;org.testcontainers&lt;\/groupId&gt;\n           &lt;artifactId&gt;mysql&lt;\/artifactId&gt;\n           &lt;version&gt;1.16.3&lt;\/version&gt;\n           &lt;scope&gt;test&lt;\/scope&gt;\n       &lt;\/dependency&gt;\n       &lt;dependency&gt;\n           &lt;groupId&gt;org.testcontainers&lt;\/groupId&gt;\n           &lt;artifactId&gt;junit-jupiter&lt;\/artifactId&gt;\n           &lt;version&gt;1.16.3&lt;\/version&gt;\n           &lt;scope&gt;test&lt;\/scope&gt;\n       &lt;\/dependency&gt;\n<\/code><\/pre>\n\n\n\n<p>Debe actualizar las pruebas para utilizar los contenedores de prueba, que inician la base de datos en cada ejecuci\u00f3n de prueba.&nbsp;Agregue una anotaci\u00f3n y un campo a la prueba para hacer uso de ella:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/added imports\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.DynamicPropertyRegistry;\nimport org.springframework.test.context.DynamicPropertySource;\nimport org.testcontainers.containers.MySQLContainer;\nimport org.testcontainers.junit.jupiter.Container;\nimport org.testcontainers.junit.jupiter.Testcontainers;\n \n@SpringBootTest\n@AutoConfigureMockMvc\n@Testcontainers \/\/ Annotation to enable testcontainers\npublic class AccessingDataRestApplicationTests {\n \n   \/\/ Field to access the started database\n   @Container\n   private static MySQLContainer database = new MySQLContainer&lt;&gt;(\"mysql:5.7.34\");\n \n   \/\/Set database configuration using the started database\n   @DynamicPropertySource\n   static void databaseProperties(DynamicPropertyRegistry registry) {\n       registry.add(\"spring.datasource.url\", database::getJdbcUrl);\n       registry.add(\"spring.datasource.username\", database::getUsername);\n       registry.add(\"spring.datasource.password\", database::getPassword);\n   }\n<\/code><\/pre>\n\n\n\n<p>Para cada ejecuci\u00f3n de prueba, la base de datos se inicia autom\u00e1ticamente, lo que le permite usar una base de datos real cuando ejecuta pruebas.&nbsp;Todo el cableado, la configuraci\u00f3n, la puesta en marcha y la limpieza se realizan por usted.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"dockerize-your-application\">Dockerize su aplicaci\u00f3n<\/h2>\n\n\n\n<p>Es posible dockerizar su aplicaci\u00f3n con herramientas simples de Docker, pero no se recomienda.<\/p>\n\n\n\n<p>Puede construir su aplicaci\u00f3n, usar un contenedor base que contenga Java y copiar y ejecutar su aplicaci\u00f3n.&nbsp;Pero hay muchas trampas, y este es el caso de todos los lenguajes y marcos.&nbsp;As\u00ed que busca siempre herramientas que te hagan la vida m\u00e1s f\u00e1cil.<\/p>\n\n\n\n<p>En este ejemplo, utilizar\u00e1 contenedores&nbsp;<a href=\"https:\/\/github.com\/GoogleContainerTools\/jib\">Jib<\/a>&nbsp;y&nbsp;<a href=\"https:\/\/github.com\/GoogleContainerTools\/distroless\">distroless<\/a>&nbsp;para crear f\u00e1cilmente un contenedor Docker.&nbsp;El uso de ambos en combinaci\u00f3n le brinda un contenedor m\u00ednimo, seguro y reproducible, que funciona de la misma manera localmente y en producci\u00f3n.<\/p>\n\n\n\n<p>Para usar Jib, debe agregarlo como un complemento experto agreg\u00e1ndolo a su&nbsp;<code>pom.xml<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;build&gt;\n       &lt;plugins&gt;\n           &lt;plugin&gt;\n               &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n               &lt;artifactId&gt;spring-boot-maven-plugin&lt;\/artifactId&gt;\n           &lt;\/plugin&gt;\n \n        &lt;!-- Jib plugin --&gt;\n           &lt;plugin&gt;\n               &lt;groupId&gt;com.google.cloud.tools&lt;\/groupId&gt;\n               &lt;artifactId&gt;jib-maven-plugin&lt;\/artifactId&gt;\n               &lt;version&gt;3.2.1&lt;\/version&gt;\n               &lt;configuration&gt;\n                   &lt;from&gt;\n                       &lt;image&gt;gcr.io\/distroless\/java17:nonroot&lt;\/image&gt;\n                   &lt;\/from&gt;\n                   &lt;to&gt;\n                       &lt;image&gt;my-docker-image&lt;\/image&gt;\n                   &lt;\/to&gt;\n               &lt;\/configuration&gt;\n           &lt;\/plugin&gt;\n       &lt;\/plugins&gt;\n   &lt;\/build&gt;<\/code><\/pre>\n\n\n\n<p>Ahora puede crear la imagen y ejecutar la aplicaci\u00f3n:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># build the docker container\n.\/mvnw compile jib:dockerBuild\n\n# find your build image\ndocker images\n\n# start the database\ndocker run --rm -v \"$PWD\/data\":\/var\/lib\/mysql --name mysql -e MYSQL_ROOT_PASSWORD=admin-password -e MYSQL_DATABASE=my-database -p 3306:3306 mysql:8.0.28-debian\n\n\n# start the docker container which contains your application\ndocker run --net=host my-docker-image\n\n\u2026 skipped output\u2026\n2022-04-15 17:43:51.509  INFO 1 --- &#91;           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''\n2022-04-15 17:43:51.521  INFO 1 --- &#91;           main] c.e.a.AccessingDataRestApplication       : Started AccessingDataRestApplication in 6.146 seconds (JVM running for 6.568)<\/code><\/pre>\n\n\n\n<p>La aplicaci\u00f3n se inicia con host en modo de red&nbsp;<code>--net=host<\/code>, lo que facilita la conexi\u00f3n a la base de datos que inici\u00f3.&nbsp;Alternativamente, puede crear un&nbsp;<code>docker network<\/code>e iniciar ambos en la misma red.<\/p>\n\n\n\n<p>Puede enviar su contenedor a un registro de contenedores y hacer referencia a \u00e9l desde cualquier herramienta de orquestaci\u00f3n de contenedores para ejecutar su aplicaci\u00f3n en producci\u00f3n.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"summary\">Resumen<\/h2>\n\n\n\n<p>En este tutorial, aprendi\u00f3 a aprovechar Docker para crear, probar.&nbsp;y ejecute aplicaciones sin contaminar su sistema.<\/p>\n\n\n\n<p>Todo est\u00e1 en su entorno Docker aislado y funciona localmente, como en sistemas de integraci\u00f3n continua y sistemas de producci\u00f3n donde puede iniciar cientos de sus aplicaciones.<\/p>\n\n\n\n<p>Puede encontrar la aplicaci\u00f3n de ejemplo lista para usar en&nbsp;<a href=\"https:\/\/github.com\/sesigl\/docker-for-development-example-application\">mi Repositorio de aplicaciones de ejemplo de GitHub Docker For Development<\/a>&nbsp;.<\/p>\n\n\n\n<p>Espero que hayas disfrutado el art\u00edculo.<\/p>\n\n\n\n<p>Si te gust\u00f3 y sentiste la necesidad de darme un aplauso o simplemente quieres ponerte en contacto,&nbsp;<a href=\"https:\/\/twitter.com\/sesigl\">s\u00edgueme en Twitter<\/a>&nbsp;.<\/p>\n\n\n\n<p>Trabajo en eBay Kleinanzeigen, una de las mayores empresas de anuncios clasificados del mundo.&nbsp;Por cierto,&nbsp;<a href=\"https:\/\/www.ebay-kleinanzeigen.de\/careers\">\u00a1estamos contratando<\/a>&nbsp;!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"references\">Referencias<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/hub.docker.com\/_\/mysql\/\">Docker Hub: imagen de MySQL<\/a><\/li><li><a href=\"https:\/\/docs.docker.com\/engine\/reference\/commandline\/run\/\">Documentaci\u00f3n de Docker: ejecutar comando<\/a><\/li><li><a href=\"https:\/\/code.visualstudio.com\/docs\/remote\/containers\">Visual Studio Code: Contenedores remotos<\/a><\/li><li><a href=\"https:\/\/www.freecodecamp.org\/news\/learn-java-free-java-courses-for-beginners\/\">Aprenda Java: cursos gratuitos de Java<\/a><\/li><li><a href=\"https:\/\/www.youtube.com\/watch?v=H6gR_Cv4yWI\">Youtube: construye contenedores m\u00e1s r\u00e1pido con Jib<\/a><\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>La tecnolog\u00eda m\u00e1s popular para ejecutar contenedores es&nbsp;Docker&nbsp;, que se ejecuta en cualquier sistema operativo. En esta publicaci\u00f3n de blog, aprender\u00e1 a usar Docker para los 3 casos de uso m\u00e1s esenciales.&nbsp;Aprender\u00e1s a: ejecutar una base de datos localmente usando Docker, ejecutar pruebas automatizadas utilizando una base de datos dockerizada, ejecute su aplicaci\u00f3n localmente y [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[74],"tags":[75,76],"class_list":["post-9155","post","type-post","status-publish","format-standard","hentry","category-docker","tag-contenedores","tag-docker"],"_links":{"self":[{"href":"https:\/\/capitalsoftware.com.ni\/index.php?rest_route=\/wp\/v2\/posts\/9155","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/capitalsoftware.com.ni\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/capitalsoftware.com.ni\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/capitalsoftware.com.ni\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/capitalsoftware.com.ni\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=9155"}],"version-history":[{"count":1,"href":"https:\/\/capitalsoftware.com.ni\/index.php?rest_route=\/wp\/v2\/posts\/9155\/revisions"}],"predecessor-version":[{"id":9156,"href":"https:\/\/capitalsoftware.com.ni\/index.php?rest_route=\/wp\/v2\/posts\/9155\/revisions\/9156"}],"wp:attachment":[{"href":"https:\/\/capitalsoftware.com.ni\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=9155"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/capitalsoftware.com.ni\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=9155"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/capitalsoftware.com.ni\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=9155"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}