{"id":3316,"date":"2017-04-21T04:52:51","date_gmt":"2017-04-21T11:52:51","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=3316"},"modified":"2023-06-19T02:39:16","modified_gmt":"2023-06-19T09:39:16","slug":"docker-vaadin-meet-couchbase-part2","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/docker-vaadin-meet-couchbase-part2\/","title":{"rendered":"Docker y Vaadin se encuentran con Couchbase - Parte 2"},"content":{"rendered":"<p><em><a href=\"https:\/\/www.linkedin.com\/in\/ratnopam-chakrabarti\" target=\"_blank\" rel=\"noopener noreferrer\">Ratnopam Chakrabarti<\/a><\/em><em>\u00a0es un desarrollador de software que trabaja actualmente para Ericsson Inc. Lleva bastante tiempo centrado en IoT, tecnolog\u00edas m\u00e1quina a m\u00e1quina, coches conectados y dominios de ciudades inteligentes. Le encanta aprender nuevas tecnolog\u00edas y ponerlas en pr\u00e1ctica. Cuando no est\u00e1 trabajando, le gusta pasar tiempo con su hijo de 3 a\u00f1os.<\/em><\/p>\n<h3>Introducci\u00f3n<\/h3>\n<p>Bienvenido a la segunda parte de la serie en la que describo c\u00f3mo desarrollar y ejecutar una aplicaci\u00f3n web Spring Boot totalmente funcional y potenciada por Couchbase utilizando el conjunto de herramientas Docker. En <a href=\"https:\/\/www.couchbase.com\/blog\/es\/docker-vaadin-meet-couchbase-part1\/\">primera parte <\/a>de la serie, demostr\u00e9 c\u00f3mo ejecutar dos contenedores Docker para ejecutar una aplicaci\u00f3n funcional con una interfaz de usuario presentable. Los dos contenedores Docker que est\u00e1bamos ejecutando son:<\/p>\n<ol>\n<li>A <a href=\"https:\/\/www.couchbase.com\/blog\/es\/containers\/\">Contenedor Couchbase<\/a> con ajustes preconfigurados<\/li>\n<li>Un contenedor de aplicaci\u00f3n hablando con el contenedor Couchbase (Ejecutado en el paso 1)<\/li>\n<\/ol>\n<p>Aunque este m\u00e9todo es \u00fatil, no est\u00e1 totalmente automatizado, es decir, no existe la orquestaci\u00f3n automatizada. Tienes que ejecutar dos comandos de ejecuci\u00f3n de Docker diferentes para ejecutar toda la configuraci\u00f3n.<\/p>\n<p>\u00bfHay alguna forma de construir y ejecutar el contenedor de la aplicaci\u00f3n que tambi\u00e9n active la ejecuci\u00f3n del contenedor de Couchbase? Por supuesto que hay una manera.<\/p>\n<h3>Entrar en Docker Compose<\/h3>\n<p>Utilizando <a href=\"https:\/\/www.couchbase.com\/blog\/es\/couchbase-using-docker-compose\/\">Docker Compose<\/a>puedes orquestar la ejecuci\u00f3n de entornos multicontenedor, que es exactamente lo que necesitamos para nuestro caso de uso. Necesitamos ejecutar el contenedor Couchbase primero, y luego el contenedor de la aplicaci\u00f3n debe ejecutarse y hablar con el contenedor Couchbase.<\/p>\n<p>Aqu\u00ed est\u00e1 el archivo docker-compose.yml para lograr esto:<\/p>\n<pre class=\"lang:default decode:true\">version: \"2\"\r\n\r\nservices:\r\n\r\n\u00a0 app:\r\n\r\n\u00a0 \u00a0 build: .\r\n\r\n\u00a0 \u00a0 ports:\r\n\r\n\u00a0 \u00a0 \u00a0 - 8080:8080\r\n\r\n\u00a0 \u00a0 environment:\r\n\r\n\u00a0 \u00a0 \u00a0 - BUCKET_NAME=books\r\n\r\n\u00a0 \u00a0 \u00a0 - HOST=192.168.99.100\r\n\r\n\u00a0 \u00a0 depends_on:\r\n\r\n\u00a0 \u00a0 \u00a0 - db\r\n\r\n\u00a0 db:\r\n\r\n\u00a0 \u00a0 image: chakrar27\/couchbase:books\r\n\r\n\u00a0 \u00a0 ports:\r\n\r\n\u00a0 \u00a0 \u00a0 - 8091:8091\r\n\r\n\u00a0 \u00a0 \u00a0 - 8092:8092\r\n\r\n\u00a0 \u00a0 \u00a0 - 8093:8093\r\n\r\n\u00a0 \u00a0 \u00a0 - 8094:8094\r\n\r\n\u00a0 \u00a0 \u00a0 - 11210:11210\r\n\r\n<\/pre>\n<p>Nuestra app \"depende_de\" la imagen db que es el contenedor Couchbase. En otras palabras, el contenedor Couchbase se ejecuta primero y luego el contenedor de la aplicaci\u00f3n. Hay un problema potencial aqu\u00ed: la palabra clave \"depends_on\" no garantiza que el contenedor Couchbase haya terminado de configurar la imagen y haya empezado a ejecutarse. Todo lo que asegura es que el contenedor se inicie primero; no comprueba si el contenedor est\u00e1 realmente ejecut\u00e1ndose o listo para aceptar peticiones de una aplicaci\u00f3n. Para asegurarnos de que el contenedor de Couchbase se est\u00e1 ejecutando y que todos los pasos de preconfiguraci\u00f3n, como la configuraci\u00f3n de la consulta, los servicios de \u00edndice y el bucket, se han completado, necesitamos hacer una comprobaci\u00f3n desde el contenedor de la aplicaci\u00f3n.<\/p>\n<p>Este es el Dockerfile del contenedor de la aplicaci\u00f3n que invoca un script que, a su vez, comprueba si el bucket \"books\" ya ha sido configurado o no. Entra en un bucle hasta que el bucket est\u00e1 configurado y entonces activa el contenedor de la aplicaci\u00f3n.<\/p>\n<p><u><a href=\"https:\/\/github.com\/ratchakr\/bookstoreapp\/blob\/master\/Dockerfile-v1\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/github.com\/ratchakr\/bookstoreapp\/blob\/master\/Dockerfile-v1<\/a><\/u><\/p>\n<p>El gui\u00f3n puede verse en <u><a href=\"https:\/\/github.com\/ratchakr\/bookstoreapp\/blob\/master\/run_app.sh\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/github.com\/ratchakr\/bookstoreapp\/blob\/master\/run_app.sh<\/a><\/u><\/p>\n<p>El script hace lo siguiente<\/p>\n<p>Utiliza el endpoint REST soportado por Couchbase para consultar el bucket.<\/p>\n<p>Curl se utiliza para llamar a los puntos finales REST. La instalaci\u00f3n de curl est\u00e1 cubierta en el Dockerfile de la aplicaci\u00f3n.<\/p>\n<p>El script analiza la respuesta JSON de la llamada REST utilizando una herramienta llamada jq.<\/p>\n<p>Si el cubo est\u00e1 configurado, ejecuta el contenedor de aplicaciones; de lo contrario, espera a que el cubo se configure primero.<\/p>\n<p>Vale la pena mencionar que se pueden a\u00f1adir m\u00e1s comprobaciones, como verificar si el servicio de \u00edndice y el servicio de consulta est\u00e1n configurados correctamente o no, en el script de shell para hacerlo m\u00e1s robusto. Una palabra de precauci\u00f3n es confirmar tu caso de uso particular y los requisitos antes de seguir el enfoque docker-compose; no hay una manera segura de determinar si el contenedor db Couchbase est\u00e1 completamente en marcha y listo para servir peticiones de la aplicaci\u00f3n cliente. Algunos de los enfoques que podr\u00edan funcionar son los siguientes:<\/p>\n<ol>\n<li>Si dispone de un bucket preconfigurado, puede comprobar si el bucket existe<\/li>\n<li>Compruebe si los \u00edndices est\u00e1n en su sitio<\/li>\n<li>Si conoce el recuento de registros de un bucket (digamos que de un archivo .csv que se ha importado a un bucket en el momento de la carga inicial de datos), puede comprobar si el recuento coincide con el n\u00famero de registros del archivo .csv). Para nuestro caso de uso, el mencionado anteriormente funciona bien.<\/li>\n<\/ol>\n<h3>Construir y ejecutar<\/h3>\n<p>Ahora que tenemos nuestro archivo docker-compose y Dockerfile, podemos construir la imagen de la aplicaci\u00f3n mediante el simple comando <em>docker-compose up<\/em>\u00a0mando.<\/p>\n<p>Aqu\u00ed est\u00e1 el fragmento de salida de la consola Docker:<\/p>\n<pre class=\"lang:default decode:true\">$ docker-compose up\r\n\r\nCreating network \"bookstoreapp_default\" with the default driver\r\n\r\nPulling db (chakrar27\/couchbase:books)...\r\n\r\nbooks: Pulling from chakrar27\/couchbase\r\n\r\nDigest: sha256:4bc356a1f2b5b3d7ee3daf10cd5c55480ab831a0a147b07f5b14bea3de909fd9\r\n\r\nStatus: Downloaded newer image for chakrar27\/couchbase:books\r\n\r\nBuilding app\r\n\r\nStep 1\/8 : FROM frolvlad\/alpine-oraclejdk8:full\r\n\r\nfull: Pulling from frolvlad\/alpine-oraclejdk8\r\n\r\nDigest: sha256:a344745faa77a9aa5229f26bc4f5c596d13bcfc8fcac051a701b104a469aff1f\r\n\r\nStatus: Downloaded newer image for frolvlad\/alpine-oraclejdk8:full\r\n\r\n---&gt; 5f7037acb78d\r\n\r\nStep 2\/8 : VOLUME \/tmp\r\n\r\n---&gt; Running in 7d18e0b90bfd\r\n\r\n---&gt; 6a43ccb712dc\r\n\r\nRemoving intermediate container 7d18e0b90bfd\r\n\r\nStep 3\/8 : ADD target\/bookstore-1.0.0-SNAPSHOT.jar app.jar\r\n\r\n---&gt; a3b4bf7745e0\r\n\r\nRemoving intermediate container 0404f1d094d3\r\n\r\nStep 4\/8 : RUN sh -c 'touch \/app.jar'\r\n\r\n---&gt; Running in 64d1c82a0694\r\n\r\n---&gt; 1ec5a68cafa9\r\n\r\nRemoving intermediate container 64d1c82a0694\r\n\r\nStep 5\/8 : RUN apk update &amp;&amp; apk add curl\r\n\r\n---&gt; Running in 1f912e8341bd\r\n\r\nfetch https:\/\/dl-cdn.alpinelinux.org\/alpine\/v3.5\/main\/x86_64\/APKINDEX.tar.gz\r\n\r\nfetch https:\/\/dl-cdn.alpinelinux.org\/alpine\/v3.5\/community\/x86_64\/APKINDEX.tar.gz\r\n\r\nv3.5.2-16-g53ad101cf8 [https:\/\/dl-cdn.alpinelinux.org\/alpine\/v3.5\/main]\r\n\r\nv3.5.2-14-gd7ba0e189f [https:\/\/dl-cdn.alpinelinux.org\/alpine\/v3.5\/community]\r\n\r\nOK: 7961 distinct packages available\r\n\r\n(1\/4) Installing ca-certificates (20161130-r1)\r\n\r\n(2\/4) Installing libssh2 (1.7.0-r2)\r\n\r\n(3\/4) Installing libcurl (7.52.1-r2)\r\n\r\n(4\/4) Installing curl (7.52.1-r2)\r\n\r\nExecuting busybox-1.25.1-r0.trigger\r\n\r\nExecuting ca-certificates-20161130-r1.trigger\r\n\r\nExecuting glibc-bin-2.25-r0.trigger\r\n\r\nOK: 12 MiB in 18 packages\r\n\r\n---&gt; 8f99863af926\r\n\r\nRemoving intermediate container 1f912e8341bd\r\n\r\nStep 6\/8 : ADD run_app.sh .\r\n\r\n---&gt; cedb8d545070\r\n\r\nRemoving intermediate container 8af5ac3ab0a0\r\n\r\nStep 7\/8 : RUN chmod +x run_app.sh\r\n\r\n---&gt; Running in 74a141de2f52\r\n\r\n---&gt; 77ffd7425bea\r\n\r\nRemoving intermediate container 74a141de2f52\r\n\r\nStep 8\/8 : CMD sh run_app.sh\r\n\r\n---&gt; Running in 6f81c8ebaa37\r\n\r\n---&gt; 56a3659005ef\r\n\r\nRemoving intermediate container 6f81c8ebaa37\r\n\r\nSuccessfully built 56a3659005ef\r\n\r\nImage for service app was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.\r\n\r\nCreating bookstoreapp_db_1\r\n\r\nCreating bookstoreapp_app_1\r\n\r\nAttaching to bookstoreapp_db_1, bookstoreapp_app_1\r\n\r\ndb_1 \u00a0 | docker host ip = \u00a0192.168.99.100\r\n\r\ndb_1 \u00a0 | sleeping...\r\n\r\napp_1 \u00a0| Starting application run script...........\r\n\r\napp_1 \u00a0| couchbase is running on 192.168.99.100\r\n\r\napp_1 \u00a0| bucket to check is books\r\n\r\ndb_1 \u00a0 | &lt; Date: Fri, 24 Mar 2017 06:53:00 GMT\r\n\r\ndb_1 \u00a0 | &lt; Content-Length: 0\r\n\r\ndb_1 \u00a0 | &lt; Cache-Control: no-cache\r\n\r\ndb_1 \u00a0 | &lt;\r\n\r\n100 \u00a0 \u00a055 \u00a0 \u00a00 \u00a0 \u00a0 0 \u00a0100 \u00a0 \u00a055 \u00a0 \u00a0 \u00a00 \u00a0 \u00a0827 --:--:-- --:--:-- --:--:-- \u00a0 833\r\n\r\ndb_1 \u00a0 | * Connection #0 to host 127.0.0.1 left intact\r\n\r\ndb_1 \u00a0 | bucket set up done\r\n\r\napp_1 \u00a0| response from cb\r\n\r\napp_1 \u00a0| ************************************************\r\n\r\napp_1 \u00a0| ************************************************\r\n\r\napp_1 \u00a0| response from cb books\r\n\r\napp_1 \u00a0| ************************************************\r\n\r\napp_1 \u00a0| ************************************************\r\n\r\napp_1 \u00a0| bucket is now ready bucket name books\r\n\r\napp_1 \u00a0| Run application container now\r\n\r\napp_1 \u00a0| ************************************************\r\n\r\napp_1 \u00a0|\r\n\r\napp_1 \u00a0| \u00a0 . \u00a0 ____ \u00a0 \u00a0 \u00a0 \u00a0 \u00a0_ \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0__ _ _\r\n\r\napp_1 \u00a0| \u00a0\/\\\\ \/ ___'_ __ _ _(_)_ __ \u00a0__ _ \\ \\ \\ \\\r\n\r\napp_1 \u00a0| ( ( )\\___ | '_ | '_| | '_ \\\/ _` | \\ \\ \\ \\\r\n\r\napp_1 \u00a0| \u00a0\\\\\/ \u00a0___)| |_)| | | | | || (_| | \u00a0) ) ) )\r\n\r\napp_1 \u00a0| \u00a0 ' \u00a0|____| .__|_| |_|_| |_\\__, | \/ \/ \/ \/\r\n\r\napp_1 \u00a0| \u00a0=========|_|==============|___\/=\/_\/_\/_\/\r\n\r\napp_1 \u00a0| \u00a0:: Spring Boot :: \u00a0 \u00a0 \u00a0 \u00a0(v1.4.2.RELEASE)\r\n\r\napp_1 \u00a0|\r\n\r\napp_1 \u00a0| 2017-03-24 06:53:59.839 \u00a0INFO 31 --- [ \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 main] c.chakrar.sample.books.BookStoreRunner \u00a0 : Book Details = Book [id=06bad9c4-85fc-4c0b-83a7-ad21b2fdd405, title=The Immortal Irishman, author=Timothy Egan, isbn=ISBN444, category=History]\r\n\r\napp_1 \u00a0| 2017-03-24 06:53:59.839 \u00a0INFO 31 --- [ \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 main] c.chakrar.sample.books.BookStoreRunner \u00a0 : Book Details = Book [id=328eaf44-edff-43c6-9f55-62d7e095256d, title=The Kite Runner, author=Khaled Hosseini, isbn=ISBN663, category=Fiction]\r\n\r\napp_1 \u00a0| 2017-03-24 06:53:59.839 \u00a0INFO 31 --- [ \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 main] c.chakrar.sample.books.BookStoreRunner \u00a0 : Book Details = Book [id=56882f5a-d466-457f-82c1-1c3bca0c6d75, title=Breaking Blue, author=Timothy Egan, isbn=ISBN777, category=Thriller]\r\n\r\napp_1 \u00a0| 2017-03-24 06:53:59.839 \u00a0INFO 31 --- [ \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 main] c.chakrar.sample.books.BookStoreRunner \u00a0 : Book Details = Book [id=845a2fe8-cbbf-4780-b216-41abf86d7d61, title=History of Mankind, author=Gabriel Garcia, isbn=ISBN123, category=History]\r\n\r\napp_1 \u00a0| 2017-03-24 06:53:59.840 \u00a0INFO 31 --- [ \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 main] c.chakrar.sample.books.BookStoreRunner \u00a0 : Book Details = Book [id=9d2833c3-e005-4c4f-98f9-75b69bbb7bf5, title=The Night Gardener, author=Eric Fan, isbn=ISBN333, category=Kids Books]\r\n\r\napp_1 \u00a0| 2017-03-24 06:53:59.840 \u00a0INFO 31 --- [ \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 main] c.chakrar.sample.books.BookStoreRunner \u00a0 : Book Details = Book [id=5756bf4d-551c-429e-8bc3-2339dc065ff8, title=Grit: The Power of Passion and Perseverance, author=Angela Duckworth, isbn=ISBN555, category=Business]\r\n\r\napp_1 \u00a0| 2017-03-24 06:53:59.840 \u00a0INFO 31 --- [ \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 main] c.chakrar.sample.books.BookStoreRunner \u00a0 : Book Details = Book [id=e8e34f30-6fdf-4ca7-9cef-e06f504f8778, title=War and Turpentine, author=Stefan Hertmans, isbn=ISBN222, category=Fiction]\r\n\r\napp_1 \u00a0| 2017-03-24 06:54:00.234 \u00a0INFO 31 --- [ \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 main] c.chakrar.sample.books.BookStoreRunner \u00a0 : Books by Timothy Egan = Book [id=06bad9c4-85fc-4c0b-83a7-ad21b2fdd405, title=The Immortal Irishman, author=Timothy Egan, isbn=ISBN444, category=History]\r\n\r\napp_1 \u00a0| 2017-03-24 06:54:00.238 \u00a0INFO 31 --- [ \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 main] c.chakrar.sample.books.BookStoreRunner \u00a0 : Books by Timothy Egan = Book [id=56882f5a-d466-457f-82c1-1c3bca0c6d75, title=Breaking Blue, author=Timothy Egan, isbn=ISBN777, category=Thriller]\r\n\r\napp_1 \u00a0| 2017-03-24 06:54:00.346 \u00a0INFO 31 --- [ \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 main] c.chakrar.sample.books.BookStoreRunner \u00a0 : Book Starting with title 'The' = Book [id=06bad9c4-85fc-4c0b-83a7-ad21b2fdd405, title=The Immortal Irishman, author=Timothy Egan, isbn=ISBN444, category=History]\r\n\r\napp_1 \u00a0| 2017-03-24 06:54:00.349 \u00a0INFO 31 --- [ \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 main] c.chakrar.sample.books.BookStoreRunner \u00a0 : Book Starting with title 'The' = Book [id=328eaf44-edff-43c6-9f55-62d7e095256d, title=The Kite Runner, author=Khaled Hosseini, isbn=ISBN663, category=Fiction]\r\n\r\napp_1 \u00a0| 2017-03-24 06:54:00.349 \u00a0INFO 31 --- [ \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 main] c.chakrar.sample.books.BookStoreRunner \u00a0 : Book Starting with title 'The' = Book [id=9d2833c3-e005-4c4f-98f9-75b69bbb7bf5, title=The Night Gardener, author=Eric Fan, isbn=ISBN333, category=Kids Books]\r\n\r\napp_1 \u00a0| 2017-03-24 06:54:00.443 \u00a0INFO 31 --- [ \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 main] c.chakrar.sample.books.BookStoreRunner \u00a0 : Book in Fiction = Book [id=328eaf44-edff-43c6-9f55-62d7e095256d, title=The Kite Runner, author=Khaled Hosseini, isbn=ISBN663, category=Fiction]\r\n\r\napp_1 \u00a0| 2017-03-24 06:54:00.453 \u00a0INFO 31 --- [ \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 main] c.chakrar.sample.books.BookStoreRunner \u00a0 : Book in Fiction = Book [id=e8e34f30-6fdf-4ca7-9cef-e06f504f8778, title=War and Turpentine, author=Stefan Hertmans, isbn=ISBN222, category=Fiction]\r\n\r\napp_1 \u00a0| 2017-03-24 06:54:02.745 \u00a0INFO 31 --- [nio-8080-exec-1] o.v.spring.servlet.Vaadin4SpringServlet \u00a0: Could not find a SystemMessagesProvider in the application context, using default\r\n\r\napp_1 \u00a0| 2017-03-24 06:54:02.753 \u00a0INFO 31 --- [nio-8080-exec-1] o.v.spring.servlet.Vaadin4SpringServlet \u00a0: Custom Vaadin4Spring servlet initialization completed\r\n\r\napp_1 \u00a0| 2017-03-24 06:54:02.864 \u00a0INFO 31 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[\/] \u00a0 \u00a0 \u00a0 : Initializing Spring FrameworkServlet 'dispatcherServlet'\r\n\r\napp_1 \u00a0| 2017-03-24 06:54:02.865 \u00a0INFO 31 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet \u00a0 \u00a0 \u00a0 \u00a0: FrameworkServlet 'dispatcherServlet': initialization started<\/pre>\n<p>En este punto, nuestra aplicaci\u00f3n est\u00e1 en funcionamiento con un \u00fanico comando de orquestaci\u00f3n docker-compose.<\/p>\n<p>Tipo <u>192.168.99.100:8080<\/u>\u00a0en el navegador; deber\u00eda ver la siguiente pantalla:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/04\/pasted-image-0-12.png\" alt=\"pasted image 0 12\" \/><\/p>\n<p>Docker Compose es una buena forma de orquestar entornos Docker multicontenedor. Tiene cadenas de comandos casi similares a los conjuntos de comandos \"docker\". Por ejemplo, para ver una lista de contenedores en ejecuci\u00f3n, simplemente escriba:<\/p>\n<p>docker-compose ps &gt; que le dar\u00eda<\/p>\n<pre class=\"lang:default decode:true\">$ docker-compose ps\r\n\r\nName \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Command \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 State \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0Ports\r\n\r\n---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\r\n\r\nbookstoreapp_app_1\u00a0 \u00a0\/bin\/sh -c sh run_app.sh \u00a0 \u00a0 \u00a0 \u00a0 Up \u00a0 \u00a0 \u00a00.0.0.0:8080-&gt;8080\/tcp\r\n\r\nbookstoreapp_db_1\u00a0 \u00a0 \/entrypoint.sh \/opt\/couchb ... \u00a0 Up \u00a0 \u00a0 \u00a011207\/tcp, 0.0.0.0:11210-&gt;11210\/tcp, 11211\/tcp, 18091\/tcp, 18092\/tcp, 18093\/tcp, 0.0.0.0:8091-&gt;8091\/tcp, 0.0.0.0:8092-&gt;8092\/tcp, 0.0.0.0:8093-&gt;8093\/tcp, 0.0.0.0:8094-&gt;8094\/tcp\r\n\r\n<\/pre>\n<p>Los nombres de los contenedores aparecen aqu\u00ed en negrita.<\/p>\n<p>Si necesita detener o desmantelar su entorno orquestado con Docker Compose, puede hacerlo con el comando <strong>docker-compose down <\/strong>como se muestra a continuaci\u00f3n:<\/p>\n<p>Una ejecuci\u00f3n de muestra produce:<\/p>\n<pre class=\"lang:default decode:true\">$ docker-compose down\r\n\r\nStopping bookstoreapp_app_1 ... done\r\n\r\nStopping bookstoreapp_db_1 ... done\r\n\r\nRemoving bookstoreapp_app_1 ... done\r\n\r\nRemoving bookstoreapp_db_1 ... done\r\n\r\nRemoving network bookstoreapp_default<\/pre>\n<p>Ahora, si haces un docker-compose ps, muestra que ning\u00fan contenedor se est\u00e1 ejecutando actualmente.<\/p>\n<pre class=\"lang:default decode:true\">$ docker-compose ps\r\n\r\nName \u00a0 Command \u00a0 State \u00a0 Ports\r\n\r\n---------------------------------------------------------------<\/pre>\n<p>Tambi\u00e9n puede utilizar Docker compose para un entorno de pruebas automatizado en el que se encienden los contenedores Docker, se ejecutan las pruebas y, a continuaci\u00f3n, se desmonta toda la infraestructura, todo ello con Compose. Para obtener una descripci\u00f3n detallada de Docker compose, visite la p\u00e1gina <u><a href=\"https:\/\/docs.docker.com\/compose\/overview\/\" target=\"_blank\" rel=\"noopener noreferrer\">sitio web oficial<\/a><\/u>.<\/p>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/es\/community\/community-writers-program\/\"><em>Este post forma parte del Programa de Escritura de la Comunidad Couchbase<\/em><\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>C\u00f3mo desarrollar y ejecutar una aplicaci\u00f3n web Spring Boot totalmente funcional y potenciada por Couchbase utilizando el conjunto de herramientas Docker. En la primera parte de la serie, demostr\u00e9 c\u00f3mo ejecutar dos contenedores Docker para ejecutar una aplicaci\u00f3n funcional con una interfaz de usuario presentable.<\/p>","protected":false},"author":53,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1816],"tags":[1519,1594],"ppma_author":[9026],"class_list":["post-3316","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-couchbase-server","tag-docker","tag-vaadin"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.7.1 (Yoast SEO v25.7) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Docker and Vaadin Meet Couchbase - Part 2 - The Couchbase Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/es\/docker-vaadin-meet-couchbase-part2\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Docker and Vaadin Meet Couchbase - Part 2\" \/>\n<meta property=\"og:description\" content=\"How to develop and run a Couchbase powered, fully functional Spring Boot web application using the Docker toolset. In part one of the series, I demonstrated how to run two Docker containers to run a functional application with a presentable UI.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/docker-vaadin-meet-couchbase-part2\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2017-04-21T11:52:51+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-06-19T09:39:16+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/04\/pasted-image-0-12.png\" \/>\n<meta name=\"author\" content=\"Laura Czajkowski, Developer Community Manager, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Laura Czajkowski, Developer Community Manager, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/docker-vaadin-meet-couchbase-part2\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/docker-vaadin-meet-couchbase-part2\/\"},\"author\":{\"name\":\"Laura Czajkowski, Developer Community Manager, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/5f1a0ece4e644bc8c037686fbc8f3220\"},\"headline\":\"Docker and Vaadin Meet Couchbase &#8211; Part 2\",\"datePublished\":\"2017-04-21T11:52:51+00:00\",\"dateModified\":\"2023-06-19T09:39:16+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/docker-vaadin-meet-couchbase-part2\/\"},\"wordCount\":882,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/docker-vaadin-meet-couchbase-part2\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"keywords\":[\"docker\",\"vaadin\"],\"articleSection\":[\"Couchbase Server\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/docker-vaadin-meet-couchbase-part2\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/docker-vaadin-meet-couchbase-part2\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/docker-vaadin-meet-couchbase-part2\/\",\"name\":\"Docker and Vaadin Meet Couchbase - Part 2 - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/docker-vaadin-meet-couchbase-part2\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/docker-vaadin-meet-couchbase-part2\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2017-04-21T11:52:51+00:00\",\"dateModified\":\"2023-06-19T09:39:16+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/docker-vaadin-meet-couchbase-part2\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/docker-vaadin-meet-couchbase-part2\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/docker-vaadin-meet-couchbase-part2\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/docker-vaadin-meet-couchbase-part2\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Docker and Vaadin Meet Couchbase &#8211; Part 2\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/5f1a0ece4e644bc8c037686fbc8f3220\",\"name\":\"Laura Czajkowski, Developer Community Manager, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/9deb07d5daaa00220534c31768bc4409\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/bc8eebaf25cbe39bc12fd7b1ef92550becc3953ab877a3f0285a59ec2d30b754?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/bc8eebaf25cbe39bc12fd7b1ef92550becc3953ab877a3f0285a59ec2d30b754?s=96&d=mm&r=g\",\"caption\":\"Laura Czajkowski, Developer Community Manager, Couchbase\"},\"description\":\"Laura Czajkowski is the Snr. Developer Community Manager at Couchbase overseeing the community. She\u2019s responsible for our monthly developer newsletter.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/es\/author\/laura-czajkowski\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Docker y Vaadin se encuentran con Couchbase - Parte 2 - El blog de Couchbase","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/es\/docker-vaadin-meet-couchbase-part2\/","og_locale":"es_MX","og_type":"article","og_title":"Docker and Vaadin Meet Couchbase - Part 2","og_description":"How to develop and run a Couchbase powered, fully functional Spring Boot web application using the Docker toolset. In part one of the series, I demonstrated how to run two Docker containers to run a functional application with a presentable UI.","og_url":"https:\/\/www.couchbase.com\/blog\/es\/docker-vaadin-meet-couchbase-part2\/","og_site_name":"The Couchbase Blog","article_published_time":"2017-04-21T11:52:51+00:00","article_modified_time":"2023-06-19T09:39:16+00:00","og_image":[{"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/04\/pasted-image-0-12.png","type":"","width":"","height":""}],"author":"Laura Czajkowski, Developer Community Manager, Couchbase","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Laura Czajkowski, Developer Community Manager, Couchbase","Est. reading time":"8 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/docker-vaadin-meet-couchbase-part2\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/docker-vaadin-meet-couchbase-part2\/"},"author":{"name":"Laura Czajkowski, Developer Community Manager, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/5f1a0ece4e644bc8c037686fbc8f3220"},"headline":"Docker and Vaadin Meet Couchbase &#8211; Part 2","datePublished":"2017-04-21T11:52:51+00:00","dateModified":"2023-06-19T09:39:16+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/docker-vaadin-meet-couchbase-part2\/"},"wordCount":882,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/docker-vaadin-meet-couchbase-part2\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["docker","vaadin"],"articleSection":["Couchbase Server"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/docker-vaadin-meet-couchbase-part2\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/docker-vaadin-meet-couchbase-part2\/","url":"https:\/\/www.couchbase.com\/blog\/docker-vaadin-meet-couchbase-part2\/","name":"Docker y Vaadin se encuentran con Couchbase - Parte 2 - El blog de Couchbase","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/docker-vaadin-meet-couchbase-part2\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/docker-vaadin-meet-couchbase-part2\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2017-04-21T11:52:51+00:00","dateModified":"2023-06-19T09:39:16+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/docker-vaadin-meet-couchbase-part2\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/docker-vaadin-meet-couchbase-part2\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/docker-vaadin-meet-couchbase-part2\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/docker-vaadin-meet-couchbase-part2\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Docker and Vaadin Meet Couchbase &#8211; Part 2"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"El blog de Couchbase","description":"Couchbase, la base de datos NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"El blog de Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/5f1a0ece4e644bc8c037686fbc8f3220","name":"Laura Czajkowski, Directora de la Comunidad de Desarrolladores, Couchbase","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/9deb07d5daaa00220534c31768bc4409","url":"https:\/\/secure.gravatar.com\/avatar\/bc8eebaf25cbe39bc12fd7b1ef92550becc3953ab877a3f0285a59ec2d30b754?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/bc8eebaf25cbe39bc12fd7b1ef92550becc3953ab877a3f0285a59ec2d30b754?s=96&d=mm&r=g","caption":"Laura Czajkowski, Developer Community Manager, Couchbase"},"description":"Laura Czajkowski es la Snr. Developer Community Manager en Couchbase supervisando la comunidad. Es responsable de nuestro bolet\u00edn mensual para desarrolladores.","url":"https:\/\/www.couchbase.com\/blog\/es\/author\/laura-czajkowski\/"}]}},"authors":[{"term_id":9026,"user_id":53,"is_guest":0,"slug":"laura-czajkowski","display_name":"Laura Czajkowski, Developer Community Manager, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/bc8eebaf25cbe39bc12fd7b1ef92550becc3953ab877a3f0285a59ec2d30b754?s=96&d=mm&r=g","first_name":"Laura","last_name":"Czajkowski","user_url":"","author_category":"","description":"Laura Czajkowski es la Snr. Developer Community Manager en Couchbase supervisando la comunidad. Es responsable de nuestro bolet\u00edn mensual para desarrolladores."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/3316","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/users\/53"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=3316"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/3316\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=3316"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=3316"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=3316"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=3316"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}