{"id":3238,"date":"2017-04-13T05:04:54","date_gmt":"2017-04-13T12:04:54","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=3238"},"modified":"2023-06-19T02:57:20","modified_gmt":"2023-06-19T09:57:20","slug":"docker-vaadin-meet-couchbase-part1","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/docker-vaadin-meet-couchbase-part1\/","title":{"rendered":"Docker y Vaadin se encuentran con Couchbase - Parte 1"},"content":{"rendered":"<p><em><a href=\"https:\/\/www.linkedin.com\/in\/ratnopam-chakrabarti\" target=\"_blank\" rel=\"noopener noreferrer\">Ratnopam Chakrabarti<\/a>\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<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2542\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/02\/ratnopamchakrabarti2.jpeg\" alt=\"Ratnopam Chakrabarti\" width=\"150\" height=\"200\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/ratnopamchakrabarti2.jpeg 150w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/ratnopamchakrabarti2-15x20.jpeg 15w\" sizes=\"auto, (max-width: 150px) 100vw, 150px\" \/><\/p>\n<h2>Introducci\u00f3n<\/h2>\n<p>Ejecutar Couchbase como un contenedor Docker es bastante f\u00e1cil. Simplemente hereda de la \u00faltima imagen oficial de Couchbase y a\u00f1ade tu comportamiento personalizado de acuerdo a tus necesidades. En este post, voy a mostrar c\u00f3mo se puede poner en marcha una aplicaci\u00f3n web utilizando Spring Boot, Vaadin, y por supuesto Couchbase (como backend) - todo usando Docker.<\/p>\n<p>Esta es la primera parte de una serie de dos partes donde voy a describir maneras de ejecutar una aplicaci\u00f3n web con todas las funciones impulsado por Couchbase como el backend NoSQL utilizando conjuntos de herramientas Docker. En este post, describir\u00e9 los pasos para configurar un entorno Couchbase usando Docker; tambi\u00e9n mencionar\u00e9 formas de Dockerizar la aplicaci\u00f3n web (en este caso, es una aplicaci\u00f3n Spring Boot con Vaadin) y hablar con el backend Couchbase para las operaciones CRUD.<\/p>\n<h2>Requisitos previos<\/h2>\n<p>Docker debe estar configurado y en funcionamiento. Consulte el siguiente enlace para obtener informaci\u00f3n detallada sobre la instalaci\u00f3n: <u><a href=\"https:\/\/docs.docker.com\/engine\/installation\/\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/docs.docker.com\/engine\/installation\/<\/a><\/u>\u00a0Si est\u00e1s en macOS o Windows 10, puedes optar por los paquetes nativos de Docker. Si est\u00e1s en una versi\u00f3n anterior de Windows (7 u 8) como yo, entonces puedes usar Docker Toolbox que viene con Docker achine.<\/p>\n<h2>La aplicaci\u00f3n<\/h2>\n<p>La nuestra es una sencilla aplicaci\u00f3n CRUD para mantener una librer\u00eda. Los usuarios de la aplicaci\u00f3n pueden a\u00f1adir libros introduciendo informaci\u00f3n como t\u00edtulo y\/o autor, y luego pueden ver la lista de libros, editar alguna informaci\u00f3n, e incluso borrar los libros. La aplicaci\u00f3n est\u00e1 construida sobre Spring Boot. El backend es alimentado por Couchbase 4.6, y para el front-end he utilizado Vaadin 7 ya que tiene una integraci\u00f3n bastante buena con el framework Spring Boot.<\/p>\n<p>A continuaci\u00f3n se indican los principales pasos para crear esta aplicaci\u00f3n:<\/p>\n<ul>\n<li>Ejecutar y configurar Couchbase 4.6, incluyendo la configuraci\u00f3n del cubo y los servicios utilizando Docker.<\/li>\n<li>Construir la aplicaci\u00f3n utilizando Spring Boot, Vaadin, y Couchbase.<\/li>\n<li>Dockerizar y ejecutar la aplicaci\u00f3n.<\/li>\n<\/ul>\n<h3>Ejecutar Couchbase 4.6 usando Docker<\/h3>\n<p>Comprueba la IP de tu host Docker. Usted puede utilizar:<\/p>\n<pre class=\"lang:default decode:true\">docker-machine ip default\u00a0to find out the docker_host ip address. You can also check the environment variables by doing \u00a0\r\n\r\nprintenv | grep -i docker_host; it would show something like this -&gt;\r\n\r\nDOCKER_HOST=tcp:\/\/192.168.99.100:2376\r\n\r\n<\/pre>\n<p>La siguiente tarea es escribir el Dockerfile para ejecutar y configurar Couchbase. Para que nuestra aplicaci\u00f3n hable con el backend de Couchbase, necesitamos configurar un bucket llamado \"books\" y tambi\u00e9n habilitar los servicios de consulta de \u00edndices en el nodo de Couchbase. El Dockerfile para todo esto se puede encontrar\u00a0<a href=\"https:\/\/github.com\/ratchakr\/My-Docker-Images\/blob\/master\/couchbase-4.6\/Dockerfile\">aqu\u00ed<\/a>.<\/p>\n<p>El Dockerfile utiliza un script de configuraci\u00f3n para configurar el nodo Couchbase. Couchbase ofrece puntos finales REST que pueden habilitar f\u00e1cilmente servicios como consultas, N1QL e \u00edndices. Tambi\u00e9n se pueden configurar buckets utilizando estas API REST. El script de configuraci\u00f3n puede descargarse de <a href=\"https:\/\/github.com\/ratchakr\/My-Docker-Images\/blob\/master\/couchbase-4.6\/configure.sh\"><u>aqu\u00ed.<\/u><\/a><\/p>\n<p>Intentemos ahora construir y ejecutar la imagen de Couchbase.<\/p>\n<p>Vaya al directorio donde est\u00e1 el Dockerfile.<\/p>\n<pre class=\"lang:default decode:true\">Build the image -&gt;\r\n\r\ndocker build -t &lt;chakrar27&gt;\/couchbase:books .\r\n\r\nReplace chakrar27 by your image-prefix or docker hub id.\r\n\r\nOnce the image is built, verify by doing\r\n\r\n$ docker images<\/pre>\n<p>&nbsp;<\/p>\n<p><em>REPOSITORIO ETIQUETA IMAGEN ID CREADO TAMA\u00d1O<\/em><\/p>\n<p><em>chakrar27\/couchbase books 93e7ba199eef hace 1 hora 581 MB<\/em><\/p>\n<p><em>couchbase latest 337dab68d2d1 hace 9 d\u00edas 581 MB<\/em><\/p>\n<p>Ejecute la imagen escribiendo<\/p>\n<pre class=\"lang:default decode:true\">docker run -p 8091-8093:8091-8093 -p 8094:8094 -p 11210:11210 chakrar27\/couchbase:books\r\n\r\n<\/pre>\n<p>Muestra de salida:<\/p>\n<pre class=\"lang:default decode:true\">Starting Couchbase Server -- Web UI available at https:\/\/&lt;ip&gt;:8091 and logs available in \/opt\/couchbase\/var\/lib\/couchbase\/logs\r\n\r\nStart configuring env by calling REST endpoints\r\n\r\nNote: Unnecessary use of -X or --request, POST is already inferred.\r\n\r\n* \u00a0 Trying 192.168.99.100...\r\n\r\n\u00a0 % Total \u00a0 \u00a0% Received % Xferd \u00a0Average Speed \u00a0 Time \u00a0 \u00a0Time \u00a0 \u00a0 Time \u00a0Current\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0Dload \u00a0Upload \u00a0 Total \u00a0 Spent \u00a0 \u00a0Left \u00a0Speed\r\n\r\n\u00a0 0 \u00a0 \u00a0 0 \u00a0 \u00a00 \u00a0 \u00a0 0 \u00a0 \u00a00 \u00a0 \u00a0 0 \u00a0 \u00a0 \u00a00 \u00a0 \u00a0 \u00a00 --:--:-- --:--:-- --:--:-- \u00a0 \u00a0 0* Connected to 127.0.0.1 (127.0.0.1) port 8091 (#0)\r\n\r\n&gt; POST \/pools\/default HTTP\/1.1\r\n\r\n&gt; Host: 127.0.0.1:8091\r\n\r\n&gt; User-Agent: curl\/7.49.1-DEV\r\n\r\n&gt; Accept: *\/*\r\n\r\n&gt; Content-Length: 55\r\n\r\n&gt; Content-Type: application\/x-www-form-urlencoded\r\n\r\n&gt;\r\n\r\n} [55 bytes data]\r\n\r\n* upload completely sent off: 55 out of 55 bytes\r\n\r\n&lt; HTTP\/1.1 200 OK\r\n\r\n&lt; Server: Couchbase Server\r\n\r\n&lt; Pragma: no-cache\r\n\r\n&lt; Date: Fri, 24 Mar 2017 03:20:51 GMT\r\n\r\n&lt; Content-Length: 0\r\n\r\n&lt; Cache-Control: no-cache\r\n\r\n&lt;\r\n\r\n100 \u00a0 \u00a055 \u00a0 \u00a00 \u00a0 \u00a0 0 \u00a0100 \u00a0 \u00a055 \u00a0 \u00a0 \u00a00 \u00a0 2966 --:--:-- --:--:-- --:--:-- \u00a03666\r\n\r\n* Connection #0 to host 127.0.0.1 left intact\r\n\r\n* \u00a0 Trying 127.0.0.1...\r\n\r\n\u00a0 % Total \u00a0 \u00a0% Received % Xferd \u00a0Average Speed \u00a0 Time \u00a0 \u00a0Time \u00a0 \u00a0 Time \u00a0Current\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0Dload \u00a0Upload \u00a0 Total \u00a0 Spent \u00a0 \u00a0Left \u00a0Speed\r\n\r\n\u00a0 0 \u00a0 \u00a0 0 \u00a0 \u00a00 \u00a0 \u00a0 0 \u00a0 \u00a00 \u00a0 \u00a0 0 \u00a0 \u00a0 \u00a00 \u00a0 \u00a0 \u00a00 --:--:-- --:--:-- --:--:-- \u00a0 \u00a0 0* Connected to 127.0.0.1 (127.0.0.1) port 8091 (#0)\r\n\r\n&gt; POST \/node\/controller\/setupServices HTTP\/1.1\r\n\r\n&gt; Host: 127.0.0.1:8091\r\n\r\n&gt; User-Agent: curl\/7.49.1-DEV\r\n\r\n&gt; Accept: *\/*\r\n\r\n&gt; Content-Length: 32\r\n\r\n&gt; Content-Type: application\/x-www-form-urlencoded\r\n\r\n&gt;\r\n\r\n} [32 bytes data]\r\n\r\n* upload completely sent off: 32 out of 32 bytes\r\n\r\n&lt; HTTP\/1.1 200 OK\r\n\r\n&lt; Server: Couchbase Server\r\n\r\n&lt; Pragma: no-cache\r\n\r\n&lt; Date: Fri, 24 Mar 2017 03:20:56 GMT\r\n\r\n&lt; Content-Length: 0\r\n\r\n&lt; Cache-Control: no-cache\r\n\r\n&lt;\r\n\r\n100 \u00a0 \u00a032 \u00a0 \u00a00 \u00a0 \u00a0 0 \u00a0100 \u00a0 \u00a032 \u00a0 \u00a0 \u00a00 \u00a0 3389 --:--:-- --:--:-- --:--:-- \u00a04000\r\n\r\n* Connection #0 to host 127.0.0.1 left intact\r\n\r\n\u00a0 % Total \u00a0 \u00a0% Received % Xferd \u00a0Average Speed \u00a0 Time \u00a0 \u00a0Time \u00a0 \u00a0 Time \u00a0Current\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0Dload \u00a0Upload \u00a0 Total \u00a0 Spent \u00a0 \u00a0Left \u00a0Speed\r\n\r\n100 \u00a0 180 \u00a0100 \u00a0 152 \u00a0100 \u00a0 \u00a028 \u00a0 8068 \u00a0 1486 --:--:-- --:--:-- --:--:-- \u00a08444\r\n\r\nHTTP\/1.1 200 OK\r\n\r\nServer: Couchbase Server\r\n\r\nPragma: no-cache\r\n\r\nDate: Fri, 24 Mar 2017 03:21:01 GMT\r\n\r\nContent-Type: application\/json\r\n\r\nContent-Length: 152\r\n\r\nCache-Control: no-cache\r\n\r\n{\"storageMode\":\"memory_optimized\",\"indexerThreads\":0,\"memorySnapshotInterval\":200,\"stableSnapshotInterval\":5000,\"maxRollbackPoints\":5,\"logLevel\":\"info\"}Note: Unnecessary use of -X or --request, POST is already inferred.\r\n\r\n* \u00a0 Trying 127.0.0.1...\r\n\r\n\u00a0 % Total \u00a0 \u00a0% Received % Xferd \u00a0Average Speed \u00a0 Time \u00a0 \u00a0Time \u00a0 \u00a0 Time \u00a0Current\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0Dload \u00a0Upload \u00a0 Total \u00a0 Spent \u00a0 \u00a0Left \u00a0Speed\r\n\r\n\u00a0 0 \u00a0 \u00a0 0 \u00a0 \u00a00 \u00a0 \u00a0 0 \u00a0 \u00a00 \u00a0 \u00a0 0 \u00a0 \u00a0 \u00a00 \u00a0 \u00a0 \u00a00 --:--:-- --:--:-- --:--:-- \u00a0 \u00a0 0* Connected to 127.0.0.1 (127.0.0.1) port 8091 (#0)\r\n\r\n&gt; POST \/settings\/web HTTP\/1.1\r\n\r\n&gt; Host: 127.0.0.1:8091\r\n\r\n&gt; User-Agent: curl\/7.49.1-DEV\r\n\r\n&gt; Accept: *\/*\r\n\r\n&gt; Content-Length: 50\r\n\r\n&gt; Content-Type: application\/x-www-form-urlencoded\r\n\r\n&gt;\r\n\r\n} [50 bytes data]\r\n\r\n* upload completely sent off: 50 out of 50 bytes\r\n\r\n&lt; HTTP\/1.1 200 OK\r\n\r\n&lt; Server: Couchbase Server\r\n\r\n&lt; Pragma: no-cache\r\n\r\n&lt; Date: Fri, 24 Mar 2017 03:21:01 GMT\r\n\r\n&lt; Content-Type: application\/json\r\n\r\n&lt; Content-Length: 44\r\n\r\n&lt; Cache-Control: no-cache\r\n\r\n&lt;\r\n\r\n{ [44 bytes data]\r\n\r\n100 \u00a0 \u00a094 \u00a0100 \u00a0 \u00a044 \u00a0100 \u00a0 \u00a050 \u00a0 1554 \u00a0 1765 --:--:-- --:--:-- --:--:-- \u00a02380\r\n\r\n* Connection #0 to host 127.0.0.1 left intact\r\n\r\n{\"newBaseUri\":\"https:\/\/127.0.0.1:8091\/\"}bucket set up start\r\n\r\nbucket name = \u00a0books\r\n\r\nNote: Unnecessary use of -X or --request, POST is already inferred.\r\n\r\n* \u00a0 Trying 127.0.0.1...\r\n\r\n\u00a0 % Total \u00a0 \u00a0% Received % Xferd \u00a0Average Speed \u00a0 Time \u00a0 \u00a0Time \u00a0 \u00a0 Time \u00a0Current\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0Dload \u00a0Upload \u00a0 Total \u00a0 Spent \u00a0 \u00a0Left \u00a0Speed\r\n\r\n\u00a0 0 \u00a0 \u00a0 0 \u00a0 \u00a00 \u00a0 \u00a0 0 \u00a0 \u00a00 \u00a0 \u00a0 0 \u00a0 \u00a0 \u00a00 \u00a0 \u00a0 \u00a00 --:--:-- --:--:-- --:--:-- \u00a0 \u00a0 0* Connected to 127.0.0.1 (127.0.0.1) port 8091 (#0)\r\n\r\n* Server auth using Basic with user 'Administrator'\r\n\r\n&gt; POST \/pools\/default\/buckets HTTP\/1.1\r\n\r\n&gt; Host: 127.0.0.1:8091\r\n\r\n&gt; Authorization: Basic QWRtaW5pc3RyYXRvcjpwYXNzd29yZA==\r\n\r\n&gt; User-Agent: curl\/7.49.1-DEV\r\n\r\n&gt; Accept: *\/*\r\n\r\n&gt; Content-Length: 55\r\n\r\n&gt; Content-Type: application\/x-www-form-urlencoded\r\n\r\n&gt;\r\n\r\n} [55 bytes data]\r\n\r\n* upload completely sent off: 55 out of 55 bytes\r\n\r\n&lt; HTTP\/1.1 202 Accepted\r\n\r\n&lt; Server: Couchbase Server\r\n\r\n&lt; Pragma: no-cache\r\n\r\n&lt; Location: \/pools\/default\/buckets\/books\r\n\r\n&lt; Date: Fri, 24 Mar 2017 03:21:01 GMT\r\n\r\n&lt; Content-Length: 0\r\n\r\n&lt; Cache-Control: no-cache\r\n\r\n&lt;\r\n\r\n100 \u00a0 \u00a055 \u00a0 \u00a00 \u00a0 \u00a0 0 \u00a0100 \u00a0 \u00a055 \u00a0 \u00a0 \u00a00 \u00a0 \u00a0748 --:--:-- --:--:-- --:--:-- \u00a0 820\r\n\r\n* Connection #0 to host 127.0.0.1 left intact\r\n\r\nbucket set up done\r\n\r\n\/entrypoint.sh couchbase-server<\/pre>\n<p>Verifique la configuraci\u00f3n escribiendo <u><a href=\"https:\/\/192.168.99.100:8091\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/192.168.99.100:8091<\/a><\/u>\u00a0en tu navegador favorito.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/04\/pasted-image-0-4.png\" alt=\"Configuration\" width=\"899\" height=\"391\" \/><\/p>\n<p>Escriba \"Administrador\" como nombre de usuario y \"contrase\u00f1a\" en el campo Contrase\u00f1a y haga clic en Iniciar sesi\u00f3n.<\/p>\n<p>Comprueba la configuraci\u00f3n del nodo Couchbase y verifica que est\u00e1 de acuerdo con el configure.sh que utilizamos anteriormente.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/04\/pasted-image-0-5.png\" alt=\"Couchbase Setting Cluster Ram Quota\" width=\"607\" height=\"323\" \/><\/p>\n<p>El cubo \"libros\".<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/04\/pasted-image-0.png\" alt=\"Data bucket settings\" width=\"701\" height=\"323\" \/><\/p>\n<p>En este punto nuestra infraestructura back-end Couchbase est\u00e1 lista y funcionando. Ahora necesitamos construir una aplicaci\u00f3n que pueda utilizar este backend para construir algo funcional.<\/p>\n<h3>Construir la aplicaci\u00f3n utilizando Spring Boot, Vaadin, y Couchbase<\/h3>\n<p>Vaya a start.spring.io y a\u00f1ada Couchbase como dependencia. Esto colocar\u00eda las librer\u00edas spring-data-couchbase en el classpath de la aplicaci\u00f3n. Dado que Couchbase se considera un ciudadano de primera clase del ecosistema Spring Boot, podemos hacer uso de la funci\u00f3n de autoconfiguraci\u00f3n de Spring Boot para acceder al bucket de Couchbase en tiempo de ejecuci\u00f3n.<\/p>\n<p>Adem\u00e1s, a\u00f1adir Vaadin como una dependencia en el proyecto. Vamos a utilizarlo para la construcci\u00f3n de la capa de interfaz de usuario.<\/p>\n<p>El archivo del modelo de objetos del proyecto (pom) se encuentra en <a href=\"https:\/\/github.com\/ratchakr\/bookstoreapp\/blob\/master\/pom.xml\">aqu\u00ed<\/a>.<\/p>\n<p>Creamos un repositorio Couchbase as\u00ed:<\/p>\n<pre class=\"lang:default decode:true\">@ViewIndexed(designDoc = \"book\")\r\n\r\n@N1qlPrimaryIndexed\r\n\r\n@N1qlSecondaryIndexed(indexName = \"bookSecondaryIndex\")\r\n\r\npublic interface BookStoreRepository extends CouchbasePagingAndSortingRepository&lt;Book, Long&gt; {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0List&lt;Book&gt; findAll();\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0List&lt;Book&gt; findByAuthor(String author);\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0List&lt;Book&gt; findByTitleStartsWithIgnoreCase(String title);\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0List&lt;Book&gt; findByCategory(String category);\r\n\r\n}<\/pre>\n<p>Las anotaciones garantizan que se proporcionar\u00e1 una vista denominada \"book\" en tiempo de ejecuci\u00f3n para soportar consultas basadas en vistas. Se crear\u00e1 un \u00edndice primario para soportar consultas N1QL. Adem\u00e1s, tambi\u00e9n se proporcionar\u00e1 un \u00edndice secundario.<\/p>\n<p>Los m\u00e9todos han sido definidos para devolver List. No tenemos que proporcionar ninguna implementaci\u00f3n, ya que la spring-data-couchbase ya la proporciona entre bastidores.<\/p>\n<p>Necesitamos definir la entidad, que en nuestro caso es Book. La anotamos con @Document.<\/p>\n<p>@Documento<\/p>\n<pre class=\"lang:default decode:true\">public class Book {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0@Id\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0private String id = UUID.randomUUID().toString();\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0private String title;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0private String author;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0private String isbn;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0private String category;\r\n\r\n}<\/pre>\n<p>Para activar la configuraci\u00f3n autom\u00e1tica, utilice el archivo application.properties o application.yml como se muestra a continuaci\u00f3n:<\/p>\n<pre class=\"lang:default decode:true\">spring.couchbase.bootstrap-hosts=127.0.0.1\r\n\r\nspring.couchbase.bucket.name=books\r\n\r\nspring.couchbase.bucket.password=\r\n\r\nspring.data.couchbase.auto-index=true\r\n\r\n<\/pre>\n<p>Una cosa a tener en cuenta aqu\u00ed es que cuando el contenedor de la aplicaci\u00f3n se ejecuta, necesitar\u00eda conectarse al contenedor de Couchbase y establecer la auto-configuraci\u00f3n. La propiedad <strong>spring.couchbase.bootstrap-hosts<\/strong><em>\u00a0<\/em>lista la direcci\u00f3n IP del nodo Couchbase. Aqu\u00ed, he especificado 127.0.0.1 que no va a funcionar ya que en tiempo de ejecuci\u00f3n, el contenedor de la aplicaci\u00f3n no encontrar\u00e1 el contenedor Couchbase ejecut\u00e1ndose en esa IP. As\u00ed que tenemos que pasar una variable de entorno (variable env) al ejecutar la imagen Docker de la aplicaci\u00f3n.<\/p>\n<p>Para pasar una variable env como se mencion\u00f3 anteriormente, tenemos que escribir el Dockerfile de la aplicaci\u00f3n de tal manera que el valor de la variable env <strong>spring.couchbase.bootstrap-hosts <\/strong>se puede pasar como una variable env. Aqu\u00ed est\u00e1 el Dockerfile de la aplicaci\u00f3n:<\/p>\n<pre class=\"lang:default decode:true\">FROM frolvlad\/alpine-oraclejdk8:full\r\n\r\nVOLUME \/tmp\r\n\r\nADD target\/bookstore-1.0.0-SNAPSHOT.jar app.jar\r\n\r\nRUN sh -c 'touch \/app.jar'\r\n\r\nCMD java -Dspring.couchbase.bootstrap-hosts=$HOSTS -Djava.security.egd=file:\/dev\/.\/urandom -jar \/app.jar<\/pre>\n<p>Como puede ver, b\u00e1sicamente estamos anulando el valor de la directiva <strong>spring.couchbase.bootstrap-hosts <\/strong>definida en el archivo application.properties por la variable env HOSTS.<\/p>\n<p>Esto es pr\u00e1cticamente todo lo que tenemos que hacer para conectar Spring Boot con Couchbase.<\/p>\n<h5><span style=\"color: #008000\">UI (U e I)<\/span><\/h5>\n<p>Para la interfaz de usuario, utilizamos la integraci\u00f3n spring-vaadin. Estoy usando la versi\u00f3n 7.7.3 de Vaadin, vaadin-spring versi\u00f3n 1.1.0, y \"Viritin\", un \u00fatil complemento de Vaadin. Para instalar Viritin, a\u00f1ada la siguiente dependencia:<\/p>\n<pre class=\"lang:default decode:true\">&lt;dependency&gt;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;groupId&gt;org.vaadin&lt;\/groupId&gt;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;artifactId&gt;viritin&lt;\/artifactId&gt;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;version&gt;1.57&lt;\/version&gt;\r\n\r\n&lt;\/dependency&gt;<\/pre>\n<p>Anote la clase UI como<\/p>\n<p><em>@SpringUI<\/em><\/p>\n<p><em>@Theme(\"valo\")<\/em><\/p>\n<p>public class Librer\u00edaUI extends UI {<\/p>\n<p>\/\/\/\/\/\/<\/p>\n<p>}<\/p>\n<p>Y luego enganchar los m\u00e9todos del repositorio con los elementos de la UI.<\/p>\n<p>Un bean que implementa el m\u00e9todo <em>CommandLineRunner <\/em>se utiliza para prepoblar la base de datos con algunos valores iniciales.<\/p>\n<p>Para obtener el c\u00f3digo fuente completo, consulte <a href=\"https:\/\/github.com\/ratchakr\/bookstoreapp\">este enlace<\/a>.<\/p>\n<h3>Dockerizar la aplicaci\u00f3n<\/h3>\n<p>Usando Maven, es muy f\u00e1cil Dockerizar una aplicaci\u00f3n usando el plugin docker-maven de Spotify. Por favor, revisa la secci\u00f3n de plugins del archivo pom.xml.<\/p>\n<p>Alternativamente, puede construir utilizando la l\u00ednea de comandos Docker -&gt;<\/p>\n<pre class=\"lang:default decode:true\">docker build -t chakrar27\/books:standalone .\r\n\r\n<\/pre>\n<p>Y luego ejecuta la imagen -&gt; Ten en cuenta que necesitamos pasar el valor de la variable HOSTS que nuestro contenedor de aplicaciones va a buscar cuando intente conectarse al contenedor de Couchbase. El comando de ejecuci\u00f3n se ver\u00eda as\u00ed:<\/p>\n<pre class=\"lang:default decode:true\">docker run -p 8080:8080 -e HOSTS=192.168.99.100\u00a0chakrar27\/books:standalone\r\n\r\n<\/pre>\n<p>Una vez iniciada la aplicaci\u00f3n, vaya a <u><a href=\"https:\/\/192.168.99.100:8080\/\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/192.168.99.100:8080\/<\/a><\/u><\/p>\n<p>Aparece la siguiente p\u00e1gina:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/04\/pasted-image-0-2.png\" alt=\"pasted image 0 2\" \/><\/p>\n<p>Una entrada puede editarse y guardarse.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/04\/pasted-image-0-1.png\" alt=\"pasted image 0 1\" \/><\/p>\n<p>La consulta N1QL que se ejecuta por debajo tambi\u00e9n ofrece una funci\u00f3n de filtrado muy \u00fatil.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/04\/pasted-image-0-3.png\" alt=\"pasted image 0 3\" \/><\/p>\n<p>Los usuarios tambi\u00e9n pueden a\u00f1adir un nuevo libro y eliminar un registro existente. Todas las funcionalidades CRUD (Create\/Read\/Update\/Delete) de esta sencilla aplicaci\u00f3n est\u00e1n potenciadas por consultas N1QL de Couchbase, que habilitamos creando el \"BookStoreRepository\", y, a su vez, extiende el \"CouchbasePagingAndSortingRepository\".<\/p>\n<p>&nbsp;<\/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>Ejecutar Couchbase como un contenedor Docker es bastante f\u00e1cil. Simplemente hereda de la \u00faltima imagen oficial de Couchbase y a\u00f1ade tu comportamiento personalizado de acuerdo a tus necesidades. En este post, voy a mostrar c\u00f3mo se puede poner en marcha una aplicaci\u00f3n web utilizando Spring Boot, Vaadin, y por supuesto Couchbase (como backend) - todo usando Docker.<\/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,1818],"tags":[1519,1923,1630],"ppma_author":[9026],"class_list":["post-3238","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-couchbase-server","category-java","tag-docker","tag-docker-containers","tag-spring-boot"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.9 (Yoast SEO v25.9) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Docker and Vaadin Meet Couchbase - Part 1 - 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-part1\/\" \/>\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 1\" \/>\n<meta property=\"og:description\" content=\"Running Couchbase as a Docker container is fairly easy. Simply inherit from the latest, official Couchbase image and add your customized behavior according to your requirement. In this post, I am going to show how you can fire up a web application using Spring Boot, Vaadin, and of course Couchbase (as backend)\u2013 all using Docker.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/docker-vaadin-meet-couchbase-part1\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2017-04-13T12:04:54+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-06-19T09:57:20+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/02\/ratnopamchakrabarti2.jpeg\" \/>\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=\"10 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-part1\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/docker-vaadin-meet-couchbase-part1\/\"},\"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 1\",\"datePublished\":\"2017-04-13T12:04:54+00:00\",\"dateModified\":\"2023-06-19T09:57:20+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/docker-vaadin-meet-couchbase-part1\/\"},\"wordCount\":1218,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/docker-vaadin-meet-couchbase-part1\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"keywords\":[\"docker\",\"docker containers\",\"spring-boot\"],\"articleSection\":[\"Couchbase Server\",\"Java\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/docker-vaadin-meet-couchbase-part1\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/docker-vaadin-meet-couchbase-part1\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/docker-vaadin-meet-couchbase-part1\/\",\"name\":\"Docker and Vaadin Meet Couchbase - Part 1 - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/docker-vaadin-meet-couchbase-part1\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/docker-vaadin-meet-couchbase-part1\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2017-04-13T12:04:54+00:00\",\"dateModified\":\"2023-06-19T09:57:20+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/docker-vaadin-meet-couchbase-part1\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/docker-vaadin-meet-couchbase-part1\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/docker-vaadin-meet-couchbase-part1\/#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-part1\/#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 1\"}]},{\"@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 and Vaadin Meet Couchbase - Part 1 - The Couchbase Blog","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-part1\/","og_locale":"es_MX","og_type":"article","og_title":"Docker and Vaadin Meet Couchbase - Part 1","og_description":"Running Couchbase as a Docker container is fairly easy. Simply inherit from the latest, official Couchbase image and add your customized behavior according to your requirement. In this post, I am going to show how you can fire up a web application using Spring Boot, Vaadin, and of course Couchbase (as backend)\u2013 all using Docker.","og_url":"https:\/\/www.couchbase.com\/blog\/es\/docker-vaadin-meet-couchbase-part1\/","og_site_name":"The Couchbase Blog","article_published_time":"2017-04-13T12:04:54+00:00","article_modified_time":"2023-06-19T09:57:20+00:00","og_image":[{"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/02\/ratnopamchakrabarti2.jpeg","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":"10 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/docker-vaadin-meet-couchbase-part1\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/docker-vaadin-meet-couchbase-part1\/"},"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 1","datePublished":"2017-04-13T12:04:54+00:00","dateModified":"2023-06-19T09:57:20+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/docker-vaadin-meet-couchbase-part1\/"},"wordCount":1218,"commentCount":1,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/docker-vaadin-meet-couchbase-part1\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["docker","docker containers","spring-boot"],"articleSection":["Couchbase Server","Java"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/docker-vaadin-meet-couchbase-part1\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/docker-vaadin-meet-couchbase-part1\/","url":"https:\/\/www.couchbase.com\/blog\/docker-vaadin-meet-couchbase-part1\/","name":"Docker and Vaadin Meet Couchbase - Part 1 - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/docker-vaadin-meet-couchbase-part1\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/docker-vaadin-meet-couchbase-part1\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2017-04-13T12:04:54+00:00","dateModified":"2023-06-19T09:57:20+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/docker-vaadin-meet-couchbase-part1\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/docker-vaadin-meet-couchbase-part1\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/docker-vaadin-meet-couchbase-part1\/#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-part1\/#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 1"}]},{"@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","author_category":"","last_name":"Czajkowski","first_name":"Laura","job_title":"","user_url":"","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\/3238","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=3238"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/3238\/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=3238"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=3238"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=3238"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=3238"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}