{"id":2986,"date":"2017-04-18T05:00:23","date_gmt":"2017-04-18T12:00:23","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=2986"},"modified":"2023-07-21T00:41:13","modified_gmt":"2023-07-21T07:41:13","slug":"docker-deploy-containerized-java-couchbase-web-application","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/docker-deploy-containerized-java-couchbase-web-application\/","title":{"rendered":"Utilizar Docker para desplegar una aplicaci\u00f3n web Java con Couchbase en contenedores"},"content":{"rendered":"<p>No hace mucho escrib\u00ed sobre <a href=\"https:\/\/www.couchbase.com\/blog\/es\/deploy-node-js-couchbase-web-application-docker-containers\/\" target=\"_blank\" rel=\"noopener\">contenerizaci\u00f3n de una API RESTful Node.js y un servidor Couchbase<\/a> para demostrar lo f\u00e1cil que es desplegar aplicaciones web de forma r\u00e1pida y fiable.  En esa gu\u00eda creamos una API sencilla, construimos una imagen Docker a partir de ella, la desplegamos como contenedor y desplegamos Couchbase como contenedor.  Sin embargo, entiendo que no todo el mundo est\u00e1 familiarizado con Node.js.<\/p>\n<p>Aqu\u00ed vamos a construir una sencilla API Java RESTful utilizando Spring Boot, crear una aplicaci\u00f3n <a href=\"https:\/\/www.docker.com\" target=\"_blank\" rel=\"noopener\">Docker<\/a> y desplegarla como contenedor con <a href=\"https:\/\/www.couchbase.com\/blog\/es\/\" target=\"_blank\" rel=\"noopener\">Couchbase<\/a>.  Esto crear\u00e1 un entorno familiar para los desarrolladores Java.<\/p>\n<p><!--more--><\/p>\n<p>Este tutorial requiere que tengas Docker instalado y configurado en tu m\u00e1quina.  Con Docker crearemos im\u00e1genes Docker personalizadas y las desplegaremos como contenedores.<\/p>\n<h2>Crear una imagen Docker personalizada para Couchbase Server<\/h2>\n<p>Empecemos creando una imagen Docker personalizada para Couchbase Server.  Mientras que una imagen <a href=\"https:\/\/hub.docker.com\/_\/couchbase\/\" target=\"_blank\" rel=\"noopener\">imagen oficial de Couchbase<\/a> no se aprovisiona autom\u00e1ticamente cuando se despliega.  Nuestra imagen personalizada se aprovisionar\u00e1 autom\u00e1ticamente al desplegarse como contenedor.<\/p>\n<p>En alg\u00fan lugar de tu ordenador crea un directorio con un\u00a0<strong>Dockerfile<\/strong> y\u00a0<strong>configure.sh<\/strong> en \u00e9l.  El sitio\u00a0<strong>Dockerfile<\/strong> ser\u00e1 el plano de nuestra imagen y el archivo\u00a0<strong>configure.sh<\/strong> ser\u00e1 el script de aprovisionamiento que se ejecute cuando se despliegue el contenedor.<\/p>\n<p>Abra el\u00a0<strong>configure.sh<\/strong> e incluya lo siguiente:<\/p>\n<pre class=\"lang:default highlight:0 decode:true\">set -m\r\n\r\n\/entrypoint.sh couchbase-server &amp;\r\n\r\nsleep 15\r\n\r\ncurl -v -X POST https:\/\/127.0.0.1:8091\/pools\/default -d memoryQuota=512 -d indexMemoryQuota=512\r\n\r\ncurl -v https:\/\/127.0.0.1:8091\/node\/controller\/setupServices -d services=kv%2cn1ql%2Cindex\r\n\r\ncurl -v https:\/\/127.0.0.1:8091\/settings\/web -d port=8091 -d username=$COUCHBASE_ADMINISTRATOR_USERNAME -d password=$COUCHBASE_ADMINISTRATOR_PASSWORD\r\n\r\ncurl -i -u $COUCHBASE_ADMINISTRATOR_USERNAME:$COUCHBASE_ADMINISTRATOR_PASSWORD -X POST https:\/\/127.0.0.1:8091\/settings\/indexes -d 'storageMode=memory_optimized'\r\n\r\ncurl -v -u $COUCHBASE_ADMINISTRATOR_USERNAME:$COUCHBASE_ADMINISTRATOR_PASSWORD -X POST https:\/\/127.0.0.1:8091\/pools\/default\/buckets -d name=$COUCHBASE_BUCKET -d bucketType=couchbase -d ramQuotaMB=128 -d authType=sasl -d saslPassword=$COUCHBASE_BUCKET_PASSWORD\r\n\r\nsleep 15\r\n\r\ncurl -v https:\/\/127.0.0.1:8093\/query\/service -d \"statement=CREATE PRIMARY INDEX ON \\`$COUCHBASE_BUCKET\\`\"\r\n\r\nfg 1<\/pre>\n<p>Couchbase puede ser configurado a trav\u00e9s de HTTP despu\u00e9s de ser desplegado.  Nuestro script de configuraci\u00f3n especificar\u00e1 recursos de instancia, credenciales administrativas, un Bucket y un \u00edndice primario.  Ver\u00e1s que se utilizan una serie de variables como\u00a0<code>$COUCHBASE_NOMBRE_DE_USUARIO_ADMINISTRATIVO<\/code> y\u00a0<code>$COUCHBASE_BUCKET<\/code>.  Estos datos pueden introducirse en tiempo de ejecuci\u00f3n para evitar que tengamos que codificar informaci\u00f3n sensible.<\/p>\n<p>M\u00e1s informaci\u00f3n sobre el aprovisionamiento de un contenedor Couchbase a trav\u00e9s de HTTP puede verse en un <a href=\"https:\/\/www.thepolyglotdeveloper.com\/2017\/04\/using-couchbase-docker-deploying-containerized-nosql-cluster\/\" target=\"_blank\" rel=\"noopener\">art\u00edculo anterior<\/a> que escrib\u00ed sobre el tema.<\/p>\n<p>Con el script de aprovisionamiento completo, tenemos que terminar el\u00a0<strong>Dockerfile<\/strong> .  \u00c1bralo e incluya lo siguiente:<\/p>\n<pre class=\"lang:default highlight:0 decode:true\">DESDE couchbase\r\n\r\nCOPIAR configure.sh \/opt\/couchbase\r\n\r\nCMD [\"\/opt\/couchbase\/configure.sh\"]<\/pre>\n<p>La imagen Docker personalizada utilizar\u00e1 la imagen Docker oficial como base, copiar\u00e1 nuestro script de aprovisionamiento durante el proceso de compilaci\u00f3n y lo ejecutar\u00e1 en tiempo de ejecuci\u00f3n.<\/p>\n<p>Para crear la imagen personalizada para Couchbase, ejecute lo siguiente:<\/p>\n<pre class=\"lang:default highlight:0 decode:true\">docker build -t couchbase-custom \/ruta\/a\/directorio\/con\/dockerfile<\/pre>\n<p>En el comando anterior\u00a0<code>couchbase-personalizar<\/code> es el nombre de la imagen y se construye a partir de la ruta que contiene el archivo\u00a0<strong>Dockerfile<\/strong> archivo.<\/p>\n<h2>Desarrollo de una API RESTful de Spring Boot con Java<\/h2>\n<p>Antes de que podamos contenerizar nuestra aplicaci\u00f3n Java tenemos que construirla.  Como estamos utilizando Spring Boot, tenemos que descargar un proyecto de inicio.  Esto se puede hacer f\u00e1cilmente desde la p\u00e1gina <a href=\"https:\/\/start.spring.io\/\" target=\"_blank\" rel=\"noopener\">Inicializaci\u00f3n de muelles<\/a> sitio web.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-3026 size-full\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/03\/spring-boot-initializr.png\" alt=\"Spring Boot Initializr\" width=\"2476\" height=\"1036\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/03\/spring-boot-initializr.png 2476w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/03\/spring-boot-initializr-300x126.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/03\/spring-boot-initializr-1024x428.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/03\/spring-boot-initializr-768x321.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/03\/spring-boot-initializr-1536x643.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/03\/spring-boot-initializr-2048x857.png 2048w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/03\/spring-boot-initializr-20x8.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/03\/spring-boot-initializr-1320x552.png 1320w\" sizes=\"auto, (max-width: 2476px) 100vw, 2476px\" \/><\/p>\n<p>Para este proyecto estoy utilizando\u00a0<code>com.couchbase<\/code> como mi\u00a0<strong>grupo<\/strong> y\u00a0<code>docker<\/code> como mi\u00a0<strong>artefacto<\/strong>.  Tambi\u00e9n prefiero Gradle, as\u00ed que estoy usando eso en lugar de Maven.<\/p>\n<p>Extraiga el proyecto descargado y abra el archivo\u00a0<strong>src\/main\/resources\/application.properties<\/strong> archivo.  En este archivo incluya lo siguiente:<\/p>\n<pre class=\"lang:default highlight:0 decode:true\">couchbase_host=couchbase\r\ncouchbase_bucket=default\r\ncouchbase_bucket_password=<\/pre>\n<p>En lo anterior estamos asumiendo que nuestra instancia host se llama\u00a0<code>couchbase<\/code> y tiene un Bucket sin contrase\u00f1a llamado\u00a0<code>por defecto<\/code>.  Si estuvieras probando localmente, el host probablemente ser\u00eda localhost.  En cualquier caso, todas estas propiedades van a ser definidas en tiempo de ejecuci\u00f3n del contenedor a trav\u00e9s de variables de entorno.<\/p>\n<p>Ahora abra el proyecto\u00a0<strong>src\/main\/java\/com\/couchbase\/DockerApplication.java<\/strong> archivo.  Aqu\u00ed vamos a cargar nuestras propiedades y definir nuestros endpoints.  Abra este archivo e incluya el siguiente c\u00f3digo Java:<\/p>\n<pre class=\"lang:default highlight:0 decode:true\">package com.couchbase;\r\n\r\nimport com.couchbase.client.java.Bucket;\r\nimport com.couchbase.client.java.Cluster;\r\nimport com.couchbase.client.java.CouchbaseCluster;\r\nimport com.couchbase.client.java.query.*;\r\nimport com.couchbase.client.java.query.consistency.ScanConsistency;\r\nimport com.couchbase.client.java.document.json.JsonObject;\r\nimport com.couchbase.client.java.document.JsonDocument;\r\nimport org.springframework.beans.factory.annotation.Value;\r\nimport org.springframework.boot.SpringApplication;\r\nimport org.springframework.boot.autoconfigure.*;\r\nimport org.springframework.context.annotation.*;\r\nimport org.springframework.http.*;\r\nimport org.springframework.web.bind.annotation.*;\r\nimport javax.servlet.*;\r\nimport javax.servlet.http.HttpServletResponse;\r\nimport java.util.*;\r\nimport java.util.concurrent.TimeUnit;\r\n\r\n@SpringBootApplication\r\n@RestController\r\n@RequestMapping(\"\/\")\r\npublic class DockerApplication {\r\n\r\n    @Value(\"${couchbase_host}\")\r\n    private String hostname;\r\n\r\n    @Value(\"${couchbase_bucket}\")\r\n    private String bucket;\r\n\r\n    @Value(\"${couchbase_bucket_password}\")\r\n    private String password;\r\n\r\n    public @Bean\r\n    Cluster cluster() {\r\n        return CouchbaseCluster.create(hostname);\r\n    }\r\n\r\n    public @Bean\r\n    Bucket bucket() {\r\n        return cluster().openBucket(bucket, password);\r\n    }\r\n\r\n    @RequestMapping(value=\"\/\", method= RequestMethod.GET)\r\n    public String root() {\r\n        return \"Try visiting the `\/get` or `\/save` endpoints\";\r\n    }\r\n\r\n\r\n    @RequestMapping(value=\"\/get\", method= RequestMethod.GET)\r\n    public Object get() {\r\n        String query = \"SELECT `\" + bucket().name() + \"`.* FROM `\" + bucket().name() + \"`\";\r\n        return bucket().async().query(N1qlQuery.simple(query, N1qlParams.build().consistency(ScanConsistency.REQUEST_PLUS)))\r\n                .flatMap(AsyncN1qlQueryResult::rows)\r\n                .map(result -&gt; result.value().toMap())\r\n                .toList()\r\n                .timeout(10, TimeUnit.SECONDS)\r\n                .toBlocking()\r\n                .single();\r\n    }\r\n\r\n    @RequestMapping(value=\"\/save\", method=RequestMethod.POST)\r\n    public Object save(@RequestBody String json) {\r\n        JsonObject jsonData = JsonObject.fromJson(json);\r\n        JsonDocument document = JsonDocument.create(UUID.randomUUID().toString(), jsonData);\r\n        bucket().insert(document);\r\n        return new ResponseEntity&lt;String&gt;(json, HttpStatus.OK);\r\n    }\r\n\r\n\tpublic static void main(String[] args) {\r\n\t\tSpringApplication.run(DockerApplication.class, args);\r\n\t}\r\n}<\/pre>\n<p>En lo anterior no ocurren demasiadas cosas.  Gran parte es c\u00f3digo repetitivo y declaraciones de importaci\u00f3n.  Como el objetivo de este art\u00edculo no es usar Java con Couchbase, no explicar\u00e9 cada parte del c\u00f3digo.  En su lugar, debes saber que tiene tres puntos finales, uno de los cuales obtendr\u00e1 todos los documentos en el Bucket y uno de los cuales guardar\u00e1 nuevos documentos en Couchbase.<\/p>\n<p>Si usas Gradle como yo, tienes que cambiar la directiva\u00a0<strong>build.gradle<\/strong> archivo.  Necesita tener una tarea creada y dependencias a\u00f1adidas.  Su\u00a0<strong>build.gradle<\/strong> deber\u00eda tener este aspecto:<\/p>\n<pre class=\"lang:default highlight:0 decode:true\">buildscript {\r\n\text {\r\n\t\tspringBootVersion = '1.5.2.RELEASE'\r\n\t}\r\n\trepositories {\r\n\t\tmavenCentral()\r\n\t}\r\n\tdependencies {\r\n\t\tclasspath(\"org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}\")\r\n\t}\r\n}\r\n\r\napply plugin: 'java'\r\napply plugin: 'eclipse'\r\napply plugin: 'org.springframework.boot'\r\n\r\nversion = '0.0.1-SNAPSHOT'\r\nsourceCompatibility = 1.8\r\n\r\nrepositories {\r\n\tmavenCentral()\r\n}\r\n\r\n\r\ndependencies {\r\n    compile('org.springframework.boot:spring-boot-starter-web')\r\n\tcompile('org.springframework:spring-tx')\r\n\tcompile('org.springframework.security:spring-security-core')\r\n\tcompile('com.couchbase.client:java-client')\r\n\ttestCompile('org.springframework.boot:spring-boot-starter-test')\r\n}\r\n\r\ntask(run, dependsOn: 'classes', type: JavaExec) {\r\n    main = 'com.couchbase.DockerApplication'\r\n    classpath = sourceSets.main.runtimeClasspath\r\n}<\/pre>\n<p>Para construir la aplicaci\u00f3n, ejecute lo siguiente:<\/p>\n<pre class=\"lang:default highlight:0 decode:true\">gradle build -x test<\/pre>\n<p>Ahora tendr\u00e1s un archivo JAR para ser utilizado en nuestra imagen Docker.<\/p>\n<h2>Creaci\u00f3n de una imagen Docker personalizada para la aplicaci\u00f3n Spring Boot<\/h2>\n<p>Construir una imagen personalizada requerir\u00e1 que tengamos un\u00a0<strong>Dockerfile<\/strong> en su lugar.  En la base de su proyecto Java, a\u00f1ada un archivo\u00a0<strong>Dockerfile<\/strong> e incluya lo siguiente:<\/p>\n<pre class=\"lang:default highlight:0 decode:true\">FROM openjdk:8\r\n\r\nCOPY .\/build\/libs\/java-project-0.0.1-SNAPSHOT.jar spring-boot.jar\r\n\r\nCMD java -jar spring-boot.jar<\/pre>\n<p>En el ejemplo anterior estamos usando la imagen oficial de OpenJDK como base y estamos copiando nuestro JAR en la imagen en tiempo de compilaci\u00f3n.  En el despliegue, el JAR se ejecuta.<\/p>\n<p>Para construir esta imagen, ejecute lo siguiente:<\/p>\n<pre class=\"lang:default highlight:0 decode:true\">docker build -t spring-boot-custom \/ruta\/a\/directorio\/con\/dockerfile<\/pre>\n<p>El comando anterior deber\u00eda resultarte familiar.  Estamos creando un\u00a0<code>spring-boot-custom<\/code> utilizando el plano que se encuentra en el directorio de nuestro\u00a0<strong>Dockerfile<\/strong> archivo.<\/p>\n<p>Para obtener m\u00e1s informaci\u00f3n sobre la creaci\u00f3n de im\u00e1genes Docker personalizadas, puede visitar un art\u00edculo anterior que escrib\u00ed llamado, <a href=\"https:\/\/www.thepolyglotdeveloper.com\/2017\/03\/build-custom-docker-image-containerized-web-application\/\" target=\"_blank\" rel=\"noopener\">Cree una imagen Docker personalizada para su aplicaci\u00f3n web en contenedores<\/a>.<\/p>\n<h2>Despliegue de las im\u00e1genes de Couchbase y Spring Boot como contenedores<\/h2>\n<p>Hay varias opciones a la hora de desplegar nuestras im\u00e1genes.  Podemos utilizar un archivo Compose o desplegarlos como contenedores vainilla.  Me parece que Compose es un enfoque m\u00e1s limpio, as\u00ed que lo usaremos.<\/p>\n<p>En alg\u00fan lugar de tu ordenador crea un\u00a0<strong>docker-compose.yml<\/strong> e incluya lo siguiente:<\/p>\n<pre class=\"lang:default highlight:0 decode:true\">version: '2'\r\n\r\nservices:\r\n    couchbase:\r\n        image: couchbase-custom\r\n        ports:\r\n            - 8091:8091\r\n            - 8092:8092\r\n            - 8093:8093\r\n        environment:\r\n            - COUCHBASE_ADMINISTRATOR_USERNAME=Administrator\r\n            - COUCHBASE_ADMINISTRATOR_PASSWORD=password\r\n            - COUCHBASE_BUCKET=default\r\n            - COUCHBASE_BUCKET_PASSWORD=\r\n\r\n    spring-boot:\r\n        image: spring-boot-custom\r\n        ports:\r\n            - 8080:8080\r\n        environment:\r\n            - COUCHBASE_HOST=couchbase\r\n            - COUCHBASE_BUCKET=default\r\n            - COUCHBASE_BUCKET_PASSWORD=\r\n        restart: always<\/pre>\n<p>En el archivo anterior estamos definiendo las im\u00e1genes personalizadas que construimos y estamos haciendo el mapeo de puertos a la m\u00e1quina anfitriona.  Lo que es particularmente interesante es el\u00a0<code>medio ambiente<\/code> opciones.  \u00c9stas coinciden con las variables que tenemos en nuestro\u00a0<strong>aplicaci\u00f3n.propiedades<\/strong> y\u00a0<strong>configure.sh<\/strong> archivos.<\/p>\n<p>Para desplegar nuestros contenedores con Compose, ejecuta lo siguiente:<\/p>\n<pre class=\"lang:default highlight:0 decode:true\">docker-compose run -d --service-ports --name couchbase couchbase\r\ndocker-compose run -d --service-ports --name spring-boot spring-boot<\/pre>\n<p>Algo a tener en cuenta sobre los comandos anteriores.  Couchbase no se despliega instant\u00e1neamente.  Tendr\u00e1s que esperar hasta que est\u00e9 completamente desplegado antes de desplegar la aplicaci\u00f3n Java.  Despu\u00e9s de lanzar ambas aplicaciones, compru\u00e9balas navegando a la aplicaci\u00f3n Java en tu navegador web.<\/p>\n<h2>Conclusi\u00f3n<\/h2>\n<p>Acaba de ver c\u00f3mo crear <a href=\"https:\/\/www.docker.com\" target=\"_blank\" rel=\"noopener\">Docker<\/a> para una aplicaci\u00f3n Spring Boot y un servidor Couchbase.  Despu\u00e9s de desplegar cada uno como contenedores ser\u00e1n capaces de comunicarse entre s\u00ed lo que es incre\u00edblemente conveniente para el mantenimiento.<\/p>\n<p>Si te interesa ver c\u00f3mo se hace esto con Node.js, echa un vistazo a la p\u00e1gina <a href=\"https:\/\/www.couchbase.com\/blog\/es\/deploy-node-js-couchbase-web-application-docker-containers\/\" target=\"_blank\" rel=\"noopener\">art\u00edculo anterior<\/a> que escrib\u00ed sobre el tema.  Si est\u00e1s interesado en aprender m\u00e1s sobre el Java SDK para Couchbase, echa un vistazo al <a href=\"https:\/\/www.couchbase.com\/blog\/es\/developers\/\" target=\"_blank\" rel=\"noopener\">Portal para desarrolladores de Couchbase<\/a>.<\/p>","protected":false},"excerpt":{"rendered":"<p>Not too long ago I wrote about containerizing a Node.js RESTful API and Couchbase Server to demonstrate how easy it is to deploy web applications in a quick and reliable fashion. \u00a0In that guide we created a simple API, built [&hellip;]<\/p>","protected":false},"author":63,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1815,1816,1818],"tags":[1897,1520,1519,1776],"ppma_author":[9032],"class_list":["post-2986","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-best-practices-and-tutorials","category-couchbase-server","category-java","tag-containerized","tag-containers","tag-docker","tag-web-application"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.3 (Yoast SEO v26.3) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Use Docker to Deploy a Containerized Java with Couchbase Web Application<\/title>\n<meta name=\"description\" content=\"Learn how to deploy a containerized Java RESTful API and Couchbase NoSQL database using Docker and custom, hand-crafted, images.\" \/>\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-deploy-containerized-java-couchbase-web-application\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Use Docker to Deploy a Containerized Java with Couchbase Web Application\" \/>\n<meta property=\"og:description\" content=\"Learn how to deploy a containerized Java RESTful API and Couchbase NoSQL database using Docker and custom, hand-crafted, images.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/docker-deploy-containerized-java-couchbase-web-application\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/thepolyglotdeveloper\" \/>\n<meta property=\"article:published_time\" content=\"2017-04-18T12:00:23+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-07-21T07:41:13+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/03\/spring-boot-initializr.png\" \/>\n<meta name=\"author\" content=\"Nic Raboy, Developer Advocate, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@nraboy\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Nic Raboy, Developer Advocate, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 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-deploy-containerized-java-couchbase-web-application\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/docker-deploy-containerized-java-couchbase-web-application\/\"},\"author\":{\"name\":\"Nic Raboy, Developer Advocate, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/bb545ebe83bb2d12f91095811d0a72e1\"},\"headline\":\"Use Docker to Deploy a Containerized Java with Couchbase Web Application\",\"datePublished\":\"2017-04-18T12:00:23+00:00\",\"dateModified\":\"2023-07-21T07:41:13+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/docker-deploy-containerized-java-couchbase-web-application\/\"},\"wordCount\":1049,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/docker-deploy-containerized-java-couchbase-web-application\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"keywords\":[\"containerized\",\"containers\",\"docker\",\"web application\"],\"articleSection\":[\"Best Practices and Tutorials\",\"Couchbase Server\",\"Java\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/docker-deploy-containerized-java-couchbase-web-application\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/docker-deploy-containerized-java-couchbase-web-application\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/docker-deploy-containerized-java-couchbase-web-application\/\",\"name\":\"Use Docker to Deploy a Containerized Java with Couchbase Web Application\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/docker-deploy-containerized-java-couchbase-web-application\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/docker-deploy-containerized-java-couchbase-web-application\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2017-04-18T12:00:23+00:00\",\"dateModified\":\"2023-07-21T07:41:13+00:00\",\"description\":\"Learn how to deploy a containerized Java RESTful API and Couchbase NoSQL database using Docker and custom, hand-crafted, images.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/docker-deploy-containerized-java-couchbase-web-application\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/docker-deploy-containerized-java-couchbase-web-application\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/docker-deploy-containerized-java-couchbase-web-application\/#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-deploy-containerized-java-couchbase-web-application\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Use Docker to Deploy a Containerized Java with Couchbase Web Application\"}]},{\"@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\/bb545ebe83bb2d12f91095811d0a72e1\",\"name\":\"Nic Raboy, Developer Advocate, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/8863514d8bed0cf6080f23db40e00354\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g\",\"caption\":\"Nic Raboy, Developer Advocate, Couchbase\"},\"description\":\"Nic Raboy is an advocate of modern web and mobile development technologies. He has experience in Java, JavaScript, Golang and a variety of frameworks such as Angular, NativeScript, and Apache Cordova. Nic writes about his development experiences related to making web and mobile development easier to understand.\",\"sameAs\":[\"https:\/\/www.thepolyglotdeveloper.com\",\"https:\/\/www.facebook.com\/thepolyglotdeveloper\",\"https:\/\/x.com\/nraboy\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/es\/author\/nic-raboy-2\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Utilizar Docker para desplegar una aplicaci\u00f3n web Java con Couchbase en contenedores","description":"Aprenda a desplegar una API Java RESTful en contenedores y una base de datos NoSQL Couchbase utilizando Docker e im\u00e1genes personalizadas creadas a mano.","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-deploy-containerized-java-couchbase-web-application\/","og_locale":"es_MX","og_type":"article","og_title":"Use Docker to Deploy a Containerized Java with Couchbase Web Application","og_description":"Learn how to deploy a containerized Java RESTful API and Couchbase NoSQL database using Docker and custom, hand-crafted, images.","og_url":"https:\/\/www.couchbase.com\/blog\/es\/docker-deploy-containerized-java-couchbase-web-application\/","og_site_name":"The Couchbase Blog","article_author":"https:\/\/www.facebook.com\/thepolyglotdeveloper","article_published_time":"2017-04-18T12:00:23+00:00","article_modified_time":"2023-07-21T07:41:13+00:00","og_image":[{"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/03\/spring-boot-initializr.png","type":"","width":"","height":""}],"author":"Nic Raboy, Developer Advocate, Couchbase","twitter_card":"summary_large_image","twitter_creator":"@nraboy","twitter_misc":{"Written by":"Nic Raboy, Developer Advocate, Couchbase","Est. reading time":"5 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/docker-deploy-containerized-java-couchbase-web-application\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/docker-deploy-containerized-java-couchbase-web-application\/"},"author":{"name":"Nic Raboy, Developer Advocate, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/bb545ebe83bb2d12f91095811d0a72e1"},"headline":"Use Docker to Deploy a Containerized Java with Couchbase Web Application","datePublished":"2017-04-18T12:00:23+00:00","dateModified":"2023-07-21T07:41:13+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/docker-deploy-containerized-java-couchbase-web-application\/"},"wordCount":1049,"commentCount":1,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/docker-deploy-containerized-java-couchbase-web-application\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["containerized","containers","docker","web application"],"articleSection":["Best Practices and Tutorials","Couchbase Server","Java"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/docker-deploy-containerized-java-couchbase-web-application\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/docker-deploy-containerized-java-couchbase-web-application\/","url":"https:\/\/www.couchbase.com\/blog\/docker-deploy-containerized-java-couchbase-web-application\/","name":"Utilizar Docker para desplegar una aplicaci\u00f3n web Java con Couchbase en contenedores","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/docker-deploy-containerized-java-couchbase-web-application\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/docker-deploy-containerized-java-couchbase-web-application\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2017-04-18T12:00:23+00:00","dateModified":"2023-07-21T07:41:13+00:00","description":"Aprenda a desplegar una API Java RESTful en contenedores y una base de datos NoSQL Couchbase utilizando Docker e im\u00e1genes personalizadas creadas a mano.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/docker-deploy-containerized-java-couchbase-web-application\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/docker-deploy-containerized-java-couchbase-web-application\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/docker-deploy-containerized-java-couchbase-web-application\/#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-deploy-containerized-java-couchbase-web-application\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Use Docker to Deploy a Containerized Java with Couchbase Web Application"}]},{"@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\/bb545ebe83bb2d12f91095811d0a72e1","name":"Nic Raboy, Defensor del Desarrollador, Couchbase","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/8863514d8bed0cf6080f23db40e00354","url":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g","caption":"Nic Raboy, Developer Advocate, Couchbase"},"description":"Nic Raboy es un defensor de las tecnolog\u00edas modernas de desarrollo web y m\u00f3vil. Tiene experiencia en Java, JavaScript, Golang y una variedad de frameworks como Angular, NativeScript y Apache Cordova. Nic escribe sobre sus experiencias de desarrollo relacionadas con hacer el desarrollo web y m\u00f3vil m\u00e1s f\u00e1cil de entender.","sameAs":["https:\/\/www.thepolyglotdeveloper.com","https:\/\/www.facebook.com\/thepolyglotdeveloper","https:\/\/x.com\/nraboy"],"url":"https:\/\/www.couchbase.com\/blog\/es\/author\/nic-raboy-2\/"}]}},"authors":[{"term_id":9032,"user_id":63,"is_guest":0,"slug":"nic-raboy-2","display_name":"Nic Raboy, Developer Advocate, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g","author_category":"","last_name":"Raboy","first_name":"Nic","job_title":"","user_url":"https:\/\/www.thepolyglotdeveloper.com","description":"Nic Raboy es un defensor de las tecnolog\u00edas modernas de desarrollo web y m\u00f3vil. Tiene experiencia en Java, JavaScript, Golang y una variedad de frameworks como Angular, NativeScript y Apache Cordova. Nic escribe sobre sus experiencias de desarrollo relacionadas con hacer el desarrollo web y m\u00f3vil m\u00e1s f\u00e1cil de entender."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/2986","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\/63"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=2986"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/2986\/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=2986"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=2986"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=2986"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=2986"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}