{"id":1078,"date":"2017-04-13T05:04:54","date_gmt":"2017-04-13T12:04:54","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/docker-vaadin-meet-couchbase-part1\/"},"modified":"2017-04-13T05:04:54","modified_gmt":"2017-04-13T12:04:54","slug":"docker-vaadin-meet-couchbase-part1","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/docker-vaadin-meet-couchbase-part1\/","title":{"rendered":"Docker and Vaadin Meet Couchbase &#8211; Part 1"},"content":{"rendered":"\n<p><em><a href=\"https:\/\/www.linkedin.com\/in\/ratnopam-chakrabarti\" target=\"_blank\" rel=\"noopener noreferrer\">Ratnopam Chakrabarti<\/a>\u00a0is a software developer currently working for Ericsson Inc. He has been focused on IoT, machine-to-machine technologies, connected cars, and smart city domains for quite a while. He loves learning new technologies and putting them to work. When he\u2019s not working, he enjoys spending time with his 3-year-old son.<\/em><\/p>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2542\" src=\"https:\/\/www.couchbase.com\/wp-content\/uploads\/sites\/5\/2026\/05\/ratnopamchakrabarti2.jpeg\" alt=\"Ratnopam Chakrabarti\" width=\"150\" height=\"200\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Introduction<\/h2>\n\n\n\n<p>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.<\/p>\n\n\n\n<p>This is part one of a two-part series where I am going to describe ways to run a fully featured web application powered by Couchbase as the NoSQL backend using Docker toolsets. In this post, I will describe the steps to set up and configure a Couchbase environment using Docker; I will also mention ways to Dockerize the web application (in this case, it\u2019s a Spring Boot application with Vaadin) and talk to the Couchbase backend for the CRUD operations.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Prerequisites<\/h2>\n\n\n\n<p>Docker needs to be set up and working. Please refer to the following link for details of the installation: <u><a href=\"https:\/\/docs.docker.com\/engine\/installation\/\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/docs.docker.com\/engine\/installation\/<\/a><\/u>\u00a0If you are on macOS or Windows 10, you can go for native Docker packages. If you are on an earlier version of Windows (7 or 8) like me, then you can use Docker Toolbox which comes with Docker achine.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Application<\/h2>\n\n\n\n<p>Ours is a simple CRUD application for maintaining a bookstore. Users of the application can add books by entering information such as title and\/or author, and can then view the list of books, edit some information, and even delete the books. The app is built on Spring Boot. The backend is powered by Couchbase 4.6, and for the front-end I have used Vaadin 7 since it has pretty neat integration with the Spring Boot framework.<\/p>\n\n\n\n<p>The main steps to build this app are listed below:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Run and configure Couchbase 4.6, including setting up the bucket and services using Docker.<\/li>\n\n\n<li>Build the application using Spring Boot, Vaadin, and Couchbase.<\/li>\n\n\n<li>Dockerize and run the application.<\/li>\n\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Run Couchbase 4.6 using Docker<\/h3>\n\n\n\n<p>Check your Docker host IP. You can use:<\/p>\n\n\n<p>[crayon lang=&#8221;default&#8221; decode=&#8221;true&#8221;]docker-machine ip default\u00a0to find out the docker_host ip address. You can also check the environment variables by doing \u00a0<\/p>\n<p>printenv | grep -i docker_host; it would show something like this -&gt;<\/p>\n<p>DOCKER_HOST=tcp:\/\/192.168.99.100:2376<\/p>\n<p>[\/crayon]<\/p>\n\n\n\n<p>The next task is to write the Dockerfile to run and configure Couchbase. For our application to talk to the Couchbase backend, we need to set up a bucket named \u201cbooks\u201d and also enable the index query services on the Couchbase node. The Dockerfile to all of this can be found\u00a0<a href=\"https:\/\/github.com\/ratchakr\/My-Docker-Images\/blob\/master\/couchbase-4.6\/Dockerfile\">here<\/a>.<\/p>\n\n\n\n<p>The Dockerfile uses a configuration script to set up the Couchbase node. Couchbase offers REST endpoints that can\u00a0easily enable services such as querying, N1QL,\u00a0and index. One can also set up buckets using these REST APIs. The configuration script can be downloaded from <a href=\"https:\/\/github.com\/ratchakr\/My-Docker-Images\/blob\/master\/couchbase-4.6\/configure.sh\"><u>here.<\/u><\/a><\/p>\n\n\n\n<p>Let\u2019s try to build and run the Couchbase image now.<\/p>\n\n\n\n<p>Go to the directory where the Dockerfile is.<\/p>\n\n\n<p>[crayon lang=&#8221;default&#8221; decode=&#8221;true&#8221;]Build the image -&gt;<\/p>\n<p>docker build -t &lt;chakrar27&gt;\/couchbase:books .<\/p>\n<p>Replace chakrar27 by your image-prefix or docker hub id.<\/p>\n<p>Once the image is built, verify by doing<\/p>\n<p>$ docker images[\/crayon]<\/p>\n\n\n\n<p>\u00a0<\/p>\n\n\n\n<p><em>REPOSITORY \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 TAG \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0IMAGE ID \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0CREATED \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 SIZE<\/em><\/p>\n\n\n\n<p><em>chakrar27\/couchbase \u00a0 \u00a0 \u00a0 \u00a0 \u00a0books \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 93e7ba199eef \u00a0 \u00a0 \u00a0 \u00a01 hour ago \u00a0 \u00a0 \u00a0 \u00a0 581 MB<\/em><\/p>\n\n\n\n<p><em>couchbase \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0latest \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0337dab68d2d1 \u00a0 \u00a0 \u00a0 \u00a09 days ago \u00a0 \u00a0 \u00a0 \u00a0 \u00a0581 MB<\/em><\/p>\n\n\n\n<p>Run the image by typing<\/p>\n\n\n<p>[crayon lang=&#8221;default&#8221; decode=&#8221;true&#8221;]docker run -p 8091-8093:8091-8093 -p 8094:8094 -p 11210:11210 chakrar27\/couchbase:books<\/p>\n<p>[\/crayon]<\/p>\n\n\n\n<p>Sample output:<\/p>\n\n\n<p>[crayon lang=&#8221;default&#8221; decode=&#8221;true&#8221;]Starting Couchbase Server &#8212; Web UI available at https:\/\/&lt;ip&gt;:8091 and logs available in \/opt\/couchbase\/var\/lib\/couchbase\/logs<\/p>\n<p>Start configuring env by calling REST endpoints<\/p>\n<p>Note: Unnecessary use of -X or &#8211;request, POST is already inferred.<\/p>\n<p>* \u00a0 Trying 192.168.99.100&#8230;<\/p>\n<p>\u00a0 % Total \u00a0 \u00a0% Received % Xferd \u00a0Average Speed \u00a0 Time \u00a0 \u00a0Time \u00a0 \u00a0 Time \u00a0Current<\/p>\n<p>\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<\/p>\n<p>\u00a0 0 \u00a0 \u00a0 0 \u00a0 \u00a00 \u00a0 \u00a0 0 \u00a0 \u00a00 \u00a0 \u00a0 0 \u00a0 \u00a0 \u00a00 \u00a0 \u00a0 \u00a00 &#8211;:&#8211;:&#8211; &#8211;:&#8211;:&#8211; &#8211;:&#8211;:&#8211; \u00a0 \u00a0 0* Connected to 127.0.0.1 (127.0.0.1) port 8091 (#0)<\/p>\n<p>&gt; POST \/pools\/default HTTP\/1.1<\/p>\n<p>&gt; Host: 127.0.0.1:8091<\/p>\n<p>&gt; User-Agent: curl\/7.49.1-DEV<\/p>\n<p>&gt; Accept: *\/*<\/p>\n<p>&gt; Content-Length: 55<\/p>\n<p>&gt; Content-Type: application\/x-www-form-urlencoded<\/p>\n<p>&gt;<\/p>\n<p>} [55 bytes data]<\/p>\n<p>* upload completely sent off: 55 out of 55 bytes<\/p>\n<p>&lt; HTTP\/1.1 200 OK<\/p>\n<p>&lt; Server: Couchbase Server<\/p>\n<p>&lt; Pragma: no-cache<\/p>\n<p>&lt; Date: Fri, 24 Mar 2017 03:20:51 GMT<\/p>\n<p>&lt; Content-Length: 0<\/p>\n<p>&lt; Cache-Control: no-cache<\/p>\n<p>&lt;<\/p>\n<p>100 \u00a0 \u00a055 \u00a0 \u00a00 \u00a0 \u00a0 0 \u00a0100 \u00a0 \u00a055 \u00a0 \u00a0 \u00a00 \u00a0 2966 &#8211;:&#8211;:&#8211; &#8211;:&#8211;:&#8211; &#8211;:&#8211;:&#8211; \u00a03666<\/p>\n<p>* Connection #0 to host 127.0.0.1 left intact<\/p>\n<p>* \u00a0 Trying 127.0.0.1&#8230;<\/p>\n<p>\u00a0 % Total \u00a0 \u00a0% Received % Xferd \u00a0Average Speed \u00a0 Time \u00a0 \u00a0Time \u00a0 \u00a0 Time \u00a0Current<\/p>\n<p>\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<\/p>\n<p>\u00a0 0 \u00a0 \u00a0 0 \u00a0 \u00a00 \u00a0 \u00a0 0 \u00a0 \u00a00 \u00a0 \u00a0 0 \u00a0 \u00a0 \u00a00 \u00a0 \u00a0 \u00a00 &#8211;:&#8211;:&#8211; &#8211;:&#8211;:&#8211; &#8211;:&#8211;:&#8211; \u00a0 \u00a0 0* Connected to 127.0.0.1 (127.0.0.1) port 8091 (#0)<\/p>\n<p>&gt; POST \/node\/controller\/setupServices HTTP\/1.1<\/p>\n<p>&gt; Host: 127.0.0.1:8091<\/p>\n<p>&gt; User-Agent: curl\/7.49.1-DEV<\/p>\n<p>&gt; Accept: *\/*<\/p>\n<p>&gt; Content-Length: 32<\/p>\n<p>&gt; Content-Type: application\/x-www-form-urlencoded<\/p>\n<p>&gt;<\/p>\n<p>} [32 bytes data]<\/p>\n<p>* upload completely sent off: 32 out of 32 bytes<\/p>\n<p>&lt; HTTP\/1.1 200 OK<\/p>\n<p>&lt; Server: Couchbase Server<\/p>\n<p>&lt; Pragma: no-cache<\/p>\n<p>&lt; Date: Fri, 24 Mar 2017 03:20:56 GMT<\/p>\n<p>&lt; Content-Length: 0<\/p>\n<p>&lt; Cache-Control: no-cache<\/p>\n<p>&lt;<\/p>\n<p>100 \u00a0 \u00a032 \u00a0 \u00a00 \u00a0 \u00a0 0 \u00a0100 \u00a0 \u00a032 \u00a0 \u00a0 \u00a00 \u00a0 3389 &#8211;:&#8211;:&#8211; &#8211;:&#8211;:&#8211; &#8211;:&#8211;:&#8211; \u00a04000<\/p>\n<p>* Connection #0 to host 127.0.0.1 left intact<\/p>\n<p>\u00a0 % Total \u00a0 \u00a0% Received % Xferd \u00a0Average Speed \u00a0 Time \u00a0 \u00a0Time \u00a0 \u00a0 Time \u00a0Current<\/p>\n<p>\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<\/p>\n<p>100 \u00a0 180 \u00a0100 \u00a0 152 \u00a0100 \u00a0 \u00a028 \u00a0 8068 \u00a0 1486 &#8211;:&#8211;:&#8211; &#8211;:&#8211;:&#8211; &#8211;:&#8211;:&#8211; \u00a08444<\/p>\n<p>HTTP\/1.1 200 OK<\/p>\n<p>Server: Couchbase Server<\/p>\n<p>Pragma: no-cache<\/p>\n<p>Date: Fri, 24 Mar 2017 03:21:01 GMT<\/p>\n<p>Content-Type: application\/json<\/p>\n<p>Content-Length: 152<\/p>\n<p>Cache-Control: no-cache<\/p>\n<p>{&#8220;storageMode&#8221;:&#8221;memory_optimized&#8221;,&#8221;indexerThreads&#8221;:0,&#8221;memorySnapshotInterval&#8221;:200,&#8221;stableSnapshotInterval&#8221;:5000,&#8221;maxRollbackPoints&#8221;:5,&#8221;logLevel&#8221;:&#8221;info&#8221;}Note: Unnecessary use of -X or &#8211;request, POST is already inferred.<\/p>\n<p>* \u00a0 Trying 127.0.0.1&#8230;<\/p>\n<p>\u00a0 % Total \u00a0 \u00a0% Received % Xferd \u00a0Average Speed \u00a0 Time \u00a0 \u00a0Time \u00a0 \u00a0 Time \u00a0Current<\/p>\n<p>\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<\/p>\n<p>\u00a0 0 \u00a0 \u00a0 0 \u00a0 \u00a00 \u00a0 \u00a0 0 \u00a0 \u00a00 \u00a0 \u00a0 0 \u00a0 \u00a0 \u00a00 \u00a0 \u00a0 \u00a00 &#8211;:&#8211;:&#8211; &#8211;:&#8211;:&#8211; &#8211;:&#8211;:&#8211; \u00a0 \u00a0 0* Connected to 127.0.0.1 (127.0.0.1) port 8091 (#0)<\/p>\n<p>&gt; POST \/settings\/web HTTP\/1.1<\/p>\n<p>&gt; Host: 127.0.0.1:8091<\/p>\n<p>&gt; User-Agent: curl\/7.49.1-DEV<\/p>\n<p>&gt; Accept: *\/*<\/p>\n<p>&gt; Content-Length: 50<\/p>\n<p>&gt; Content-Type: application\/x-www-form-urlencoded<\/p>\n<p>&gt;<\/p>\n<p>} [50 bytes data]<\/p>\n<p>* upload completely sent off: 50 out of 50 bytes<\/p>\n<p>&lt; HTTP\/1.1 200 OK<\/p>\n<p>&lt; Server: Couchbase Server<\/p>\n<p>&lt; Pragma: no-cache<\/p>\n<p>&lt; Date: Fri, 24 Mar 2017 03:21:01 GMT<\/p>\n<p>&lt; Content-Type: application\/json<\/p>\n<p>&lt; Content-Length: 44<\/p>\n<p>&lt; Cache-Control: no-cache<\/p>\n<p>&lt;<\/p>\n<p>{ [44 bytes data]<\/p>\n<p>100 \u00a0 \u00a094 \u00a0100 \u00a0 \u00a044 \u00a0100 \u00a0 \u00a050 \u00a0 1554 \u00a0 1765 &#8211;:&#8211;:&#8211; &#8211;:&#8211;:&#8211; &#8211;:&#8211;:&#8211; \u00a02380<\/p>\n<p>* Connection #0 to host 127.0.0.1 left intact<\/p>\n<p>{&#8220;newBaseUri&#8221;:&#8221;https:\/\/127.0.0.1:8091\/&#8221;}bucket set up start<\/p>\n<p>bucket name = \u00a0books<\/p>\n<p>Note: Unnecessary use of -X or &#8211;request, POST is already inferred.<\/p>\n<p>* \u00a0 Trying 127.0.0.1&#8230;<\/p>\n<p>\u00a0 % Total \u00a0 \u00a0% Received % Xferd \u00a0Average Speed \u00a0 Time \u00a0 \u00a0Time \u00a0 \u00a0 Time \u00a0Current<\/p>\n<p>\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<\/p>\n<p>\u00a0 0 \u00a0 \u00a0 0 \u00a0 \u00a00 \u00a0 \u00a0 0 \u00a0 \u00a00 \u00a0 \u00a0 0 \u00a0 \u00a0 \u00a00 \u00a0 \u00a0 \u00a00 &#8211;:&#8211;:&#8211; &#8211;:&#8211;:&#8211; &#8211;:&#8211;:&#8211; \u00a0 \u00a0 0* Connected to 127.0.0.1 (127.0.0.1) port 8091 (#0)<\/p>\n<p>* Server auth using Basic with user &#8216;Administrator&#8217;<\/p>\n<p>&gt; POST \/pools\/default\/buckets HTTP\/1.1<\/p>\n<p>&gt; Host: 127.0.0.1:8091<\/p>\n<p>&gt; Authorization: Basic QWRtaW5pc3RyYXRvcjpwYXNzd29yZA==<\/p>\n<p>&gt; User-Agent: curl\/7.49.1-DEV<\/p>\n<p>&gt; Accept: *\/*<\/p>\n<p>&gt; Content-Length: 55<\/p>\n<p>&gt; Content-Type: application\/x-www-form-urlencoded<\/p>\n<p>&gt;<\/p>\n<p>} [55 bytes data]<\/p>\n<p>* upload completely sent off: 55 out of 55 bytes<\/p>\n<p>&lt; HTTP\/1.1 202 Accepted<\/p>\n<p>&lt; Server: Couchbase Server<\/p>\n<p>&lt; Pragma: no-cache<\/p>\n<p>&lt; Location: \/pools\/default\/buckets\/books<\/p>\n<p>&lt; Date: Fri, 24 Mar 2017 03:21:01 GMT<\/p>\n<p>&lt; Content-Length: 0<\/p>\n<p>&lt; Cache-Control: no-cache<\/p>\n<p>&lt;<\/p>\n<p>100 \u00a0 \u00a055 \u00a0 \u00a00 \u00a0 \u00a0 0 \u00a0100 \u00a0 \u00a055 \u00a0 \u00a0 \u00a00 \u00a0 \u00a0748 &#8211;:&#8211;:&#8211; &#8211;:&#8211;:&#8211; &#8211;:&#8211;:&#8211; \u00a0 820<\/p>\n<p>* Connection #0 to host 127.0.0.1 left intact<\/p>\n<p>bucket set up done<\/p>\n<p>\/entrypoint.sh couchbase-server[\/crayon]<\/p>\n\n\n\n<p>Verify the configuration by typing <u><a href=\"https:\/\/192.168.99.100:8091\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/192.168.99.100:8091<\/a><\/u>\u00a0into\u00a0your favorite browser.<\/p>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone\" src=\"https:\/\/www.couchbase.com\/wp-content\/uploads\/sites\/5\/2026\/05\/pasted-image-0-4.png\" alt=\"Configuration\" width=\"899\" height=\"391\"><\/p>\n\n\n\n<p>Type \u201cAdministrator\u201d as Username and \u201cpassword\u201d in the Password field and click Sign In.<\/p>\n\n\n\n<p>Check the settings of the Couchbase node and verify that it is according to the configure.sh we used above.<\/p>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone\" src=\"https:\/\/www.couchbase.com\/wp-content\/uploads\/sites\/5\/2026\/05\/pasted-image-0-5.png\" alt=\"Couchbase Setting Cluster Ram Quota\" width=\"607\" height=\"323\"><\/p>\n\n\n\n<p>The bucket \u201cbooks\u201d.<\/p>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone\" src=\"https:\/\/www.couchbase.com\/wp-content\/uploads\/sites\/5\/2026\/05\/pasted-image-0.png\" alt=\"Data bucket settings\" width=\"701\" height=\"323\"><\/p>\n\n\n\n<p>At this point our back-end Couchbase infrastructure is up and running. We now need to build an application that can use this backend to build something functional.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Build the application using Spring\u00a0Boot, Vaadin, and Couchbase<\/h3>\n\n\n\n<p>Go to start.spring.io and add Couchbase as a dependency. This would place spring-data-couchbase libraries in the application classpath. Since Couchbase is considered a first-class citizen of the Spring\u00a0Boot ecosystem, we can make use of the Spring\u00a0Boot auto-configuration feature to access the Couchbase bucket at runtime.<\/p>\n\n\n\n<p>Also, add Vaadin as a dependency in the project. We are going to use it for building the UI layer.<\/p>\n\n\n\n<p>The project object model (pom) file can be found <a href=\"https:\/\/github.com\/ratchakr\/bookstoreapp\/blob\/master\/pom.xml\">here<\/a>.<\/p>\n\n\n\n<p>We create a Couchbase repository like this:<\/p>\n\n\n<p>[crayon lang=&#8221;default&#8221; decode=&#8221;true&#8221;]@ViewIndexed(designDoc = &#8220;book&#8221;)<\/p>\n<p>@N1qlPrimaryIndexed<\/p>\n<p>@N1qlSecondaryIndexed(indexName = &#8220;bookSecondaryIndex&#8221;)<\/p>\n<p>public interface BookStoreRepository extends CouchbasePagingAndSortingRepository&lt;Book, Long&gt; {<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0List&lt;Book&gt; findAll();\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0List&lt;Book&gt; findByAuthor(String author);<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0List&lt;Book&gt; findByTitleStartsWithIgnoreCase(String title);<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0List&lt;Book&gt; findByCategory(String category);<\/p>\n<p>}[\/crayon]<\/p>\n\n\n\n<p>The annotations ensure that a View named \u201cbook\u201d will be supplied at runtime to support view-based queries. A primary index will be created to support N1QL queries. In addition, a secondary index will also be provided.<\/p>\n\n\n\n<p>The methods have been defined to return List&lt;Book&gt;. We don\u2019t have to provide any implementation since that is already provided behind the scenes by the spring-data-couchbase.<\/p>\n\n\n\n<p>We need to define the entity,\u00a0which in our case is Book. We annotate it with @Document.<\/p>\n\n\n\n<p>@Document<\/p>\n\n\n<p>[crayon lang=&#8221;default&#8221; decode=&#8221;true&#8221;]public class Book {<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0@Id<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0private String id = UUID.randomUUID().toString();<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0private String title;<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0private String author;<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0private String isbn;<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0private String category;<\/p>\n<p>}[\/crayon]<\/p>\n\n\n\n<p>To enable auto-configuration, use application.properties or application.yml file as shown below:<\/p>\n\n\n<p>[crayon lang=&#8221;default&#8221; decode=&#8221;true&#8221;]spring.couchbase.bootstrap-hosts=127.0.0.1<\/p>\n<p>spring.couchbase.bucket.name=books<\/p>\n<p>spring.couchbase.bucket.password=<\/p>\n<p>spring.data.couchbase.auto-index=true<\/p>\n<p>[\/crayon]<\/p>\n\n\n\n<p>One thing to note here is that when the application container runs, it would need to connect to the Couchbase container and set up the auto-configuration. The property <strong>spring.couchbase.bootstrap-hosts<\/strong><em>\u00a0<\/em>lists the IP\u00a0address of the Couchbase node. Here, I have specified 127.0.0.1 which is not going to work since at runtime, the app container will not find the Couchbase container running in that IP. So we need to pass an environment variable (env variable) when running the Docker image of the application.<\/p>\n\n\n\n<p>In order to pass an env variable as mentioned above, we need to write the Dockerfile of the application such that the value of the <strong>spring.couchbase.bootstrap-hosts <\/strong>property can be passed as an env variable. Here\u2019s the Dockerfile of the app:<\/p>\n\n\n<p>[crayon lang=&#8221;default&#8221; decode=&#8221;true&#8221;]FROM frolvlad\/alpine-oraclejdk8:full<\/p>\n<p>VOLUME \/tmp<\/p>\n<p>ADD target\/bookstore-1.0.0-SNAPSHOT.jar app.jar<\/p>\n<p>RUN sh -c &#8216;touch \/app.jar&#8217;<\/p>\n<p>CMD java -Dspring.couchbase.bootstrap-hosts=$HOSTS -Djava.security.egd=file:\/dev\/.\/urandom -jar \/app.jar[\/crayon]<\/p>\n\n\n\n<p>As you can see, we are basically overriding the value of the <strong>spring.couchbase.bootstrap-hosts <\/strong>property defined in the application.properties file by the env variable HOSTS.<\/p>\n\n\n\n<p>This is pretty much all we have to do to wire Spring\u00a0Boot with Couchbase.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\"><span>UI (U and I)<\/span><\/h5>\n\n\n\n<p>For UI, we make use of the spring-vaadin integration. I am using version 7.7.3 of Vaadin, vaadin-spring version 1.1.0,\u00a0and\u00a0\u201cViritin,\u201d a useful Vaadin add-on. To install Viritin, add the following dependency:<\/p>\n\n\n<p>[crayon lang=&#8221;default&#8221; decode=&#8221;true&#8221;]&lt;dependency&gt;<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;groupId&gt;org.vaadin&lt;\/groupId&gt;<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;artifactId&gt;viritin&lt;\/artifactId&gt;<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;version&gt;1.57&lt;\/version&gt;<\/p>\n<p>&lt;\/dependency&gt;[\/crayon]<\/p>\n\n\n\n<p>Annotate the UI class as<\/p>\n\n\n\n<p><em>@SpringUI<\/em><\/p>\n\n\n\n<p><em>@Theme(&#8220;valo&#8221;)<\/em><\/p>\n\n\n\n<p>public class BookstoreUI extends UI {<\/p>\n\n\n\n<p>\/\/\/\/\/\/<\/p>\n\n\n\n<p>}<\/p>\n\n\n\n<p>And then hook the repository methods with the UI elements.<\/p>\n\n\n\n<p>A bean that implements the <em>CommandLineRunner <\/em>interface is used to prepopulate the database with some initial values.<\/p>\n\n\n\n<p>For full source\u00a0code, refer to <a href=\"https:\/\/github.com\/ratchakr\/bookstoreapp\">this link<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Dockerize the application<\/h3>\n\n\n\n<p>Using Maven, it\u2019s very easy to Dockerize an application using Spotify\u2019s docker-maven plugin. Please check the pom.xml file plugin section.<\/p>\n\n\n\n<p>Alternatively, you can build using Docker command line -&gt;<\/p>\n\n\n<p>[crayon lang=&#8221;default&#8221; decode=&#8221;true&#8221;]docker build -t chakrar27\/books:standalone .<\/p>\n<p>[\/crayon]<\/p>\n\n\n\n<p>And then run the image -&gt; Note that we need to pass the value of the variable HOSTS that our app container is going to look for when it tries to connect to the Couchbase container. The run command would look like:<\/p>\n\n\n\n<p><p>[crayon lang=&#8221;default&#8221; decode=&#8221;true&#8221;]Build the image -&gt;<\/p>\n<p>docker build -t &lt;chakrar27&gt;\/couchbase:books .<\/p>\n<p>Replace chakrar27 by your image-prefix or docker hub id.<\/p>\n<p>Once the image is built, verify by doing<\/p>\n<p>$ docker images[\/crayon]<\/p>\n0<\/p>\n\n\n\n<p>Once the application is started, navigate to <u><a href=\"https:\/\/192.168.99.100:8080\/\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/192.168.99.100:8080\/<\/a><\/u><\/p>\n\n\n\n<p>The following page shows up:<\/p>\n\n\n\n<p><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/wp-content\/uploads\/sites\/5\/2026\/05\/pasted-image-0-2.png\" alt=\"pasted image 0 2\"><\/p>\n\n\n\n<p>An entry can be edited and saved.<\/p>\n\n\n\n<p><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/wp-content\/uploads\/sites\/5\/2026\/05\/pasted-image-0-1.png\" alt=\"pasted image 0 1\"><\/p>\n\n\n\n<p>There\u2019s also a neat filtering feature provided by the N1QL query running underneath.<\/p>\n\n\n\n<p><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/wp-content\/uploads\/sites\/5\/2026\/05\/pasted-image-0-3.png\" alt=\"pasted image 0 3\"><\/p>\n\n\n\n<p>Users\u00a0can also add a new book and delete an existing record. All the CRUD\u00a0(Create\/Read\/Update\/Delete) features of this simple application are\u00a0powered by Couchbase N1QL queries,\u00a0which we enabled by creating the \u201cBookStoreRepository,\u201d and,\u00a0in turn,\u00a0extends\u00a0the\u00a0\u201cCouchbasePagingAndSortingRepository.\u201d<\/p>\n\n\n\n<p>\u00a0<\/p>\n\n\n\n<p><a href=\"https:\/\/www.couchbase.com\/community\/community-writers-program\/\"><em>This post is part of the Couchbase Community Writing Program<\/em><\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>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.<\/p>","protected":false},"author":53,"featured_media":18,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[54,144],"tags":[149,253,254],"ppma_author":[130],"class_list":["post-1078","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-couchbase-server","category-java","tag-docker","tag-docker-containers","tag-spring-boot"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.6 (Yoast SEO v27.6) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\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\/pt\/docker-vaadin-meet-couchbase-part1\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\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\/pt\/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=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/05\/couchbase-nosql-dbaas.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1800\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/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=\"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\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/docker-vaadin-meet-couchbase-part1\\\/\"},\"wordCount\":2066,\"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\\\/5\\\/2026\\\/05\\\/couchbase-nosql-dbaas.png\",\"keywords\":[\"docker\",\"docker containers\",\"spring-boot\"],\"articleSection\":[\"Couchbase Server\",\"Java\"],\"inLanguage\":\"pt-BR\",\"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\\\/5\\\/2026\\\/05\\\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2017-04-13T12:04:54+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/docker-vaadin-meet-couchbase-part1\\\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/docker-vaadin-meet-couchbase-part1\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/docker-vaadin-meet-couchbase-part1\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/5\\\/2026\\\/05\\\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/5\\\/2026\\\/05\\\/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\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/5\\\/2026\\\/06\\\/logo.svg\",\"contentUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/5\\\/2026\\\/06\\\/logo.svg\",\"width\":\"1024\",\"height\":\"1024\",\"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\":\"pt-BR\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/bc8eebaf25cbe39bc12fd7b1ef92550becc3953ab877a3f0285a59ec2d30b754?s=96&d=mm&r=g9deb07d5daaa00220534c31768bc4409\",\"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\\\/pt\\\/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\/pt\/docker-vaadin-meet-couchbase-part1\/","og_locale":"pt_BR","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\/pt\/docker-vaadin-meet-couchbase-part1\/","og_site_name":"The Couchbase Blog","article_published_time":"2017-04-13T12:04:54+00:00","og_image":[{"width":1800,"height":630,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/05\/couchbase-nosql-dbaas.png","type":"image\/png"}],"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","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/docker-vaadin-meet-couchbase-part1\/"},"wordCount":2066,"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\/5\/2026\/05\/couchbase-nosql-dbaas.png","keywords":["docker","docker containers","spring-boot"],"articleSection":["Couchbase Server","Java"],"inLanguage":"pt-BR","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\/5\/2026\/05\/couchbase-nosql-dbaas.png","datePublished":"2017-04-13T12:04:54+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/docker-vaadin-meet-couchbase-part1\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/docker-vaadin-meet-couchbase-part1\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/docker-vaadin-meet-couchbase-part1\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/05\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/05\/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":"pt-BR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"The Couchbase Blog","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/06\/logo.svg","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/06\/logo.svg","width":"1024","height":"1024","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":"pt-BR","@id":"https:\/\/secure.gravatar.com\/avatar\/bc8eebaf25cbe39bc12fd7b1ef92550becc3953ab877a3f0285a59ec2d30b754?s=96&d=mm&r=g9deb07d5daaa00220534c31768bc4409","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\/pt\/author\/laura-czajkowski\/"}]}},"acf":[],"authors":[{"term_id":130,"user_id":53,"is_guest":0,"slug":"laura-czajkowski","display_name":"Laura Czajkowski, Developer Community Manager, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/?s=96&d=mm&r=g","0":null,"1":"","2":"","3":"","4":"","5":"","6":"","7":"","8":""}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/1078","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/users\/53"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=1078"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/1078\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/18"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=1078"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=1078"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=1078"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=1078"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}