{"id":2858,"date":"2017-02-27T07:55:38","date_gmt":"2017-02-27T15:55:38","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=2858"},"modified":"2025-06-13T15:55:35","modified_gmt":"2025-06-13T22:55:35","slug":"couchbase-meets-net-core-docker","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/couchbase-meets-net-core-docker\/","title":{"rendered":"Couchbase se une a .Net Core y Docker"},"content":{"rendered":"<p><em>Brant Burnett es un <a href=\"https:\/\/developer.couchbase.com\/experts-and-champions\">Experto en Couchbase<\/a>Arquitecto de sistemas y desarrollador .Net con experiencia en el desarrollo completo de aplicaciones web y de escritorio.  Durante los \u00faltimos 12 a\u00f1os, ha estado trabajando con CenterEdge Software, una empresa de software de entretenimiento familiar con sede en Roxboro, Carolina del Norte.  Brant tiene experiencia en el desarrollo de aplicaciones para todos los segmentos de su suite de software.  Durante los \u00faltimos 4 a\u00f1os, ha trabajado en la transici\u00f3n de la infraestructura en la nube de la empresa de una plataforma Microsoft SQL a una plataforma Couchbase NoSQL pura.  Gracias a su trabajo en CenterEdge, Brant ha podido centrarse en la creaci\u00f3n de soluciones de software serias para empresas divertidas.<\/em><\/p>\n<p>Con la publicaci\u00f3n del <u><a href=\"https:\/\/www.couchbase.com\/blog\/es\/introducing-couchbase-net-2-4-0-net-core-ga\/\" target=\"_blank\" rel=\"noopener\">Couchbase .NET SDK 2.4.0<\/a><\/u>Couchbase ya tiene soporte oficial para <u><a href=\"https:\/\/www.microsoft.com\/net\/core\" target=\"_blank\" rel=\"noopener\">.NET Core<\/a><\/u>. Esto abre un nuevo mundo para .NET <a href=\"https:\/\/www.couchbase.com\/blog\/es\/downloads\/\">Couchbase<\/a> desarrolladores. En concreto, ahora podemos utilizar <u><a href=\"https:\/\/www.docker.com\/\" target=\"_blank\" rel=\"noopener\">Docker<\/a><\/u>\u00a0para gestionar f\u00e1cilmente nuestras aplicaciones y mejorar nuestro proceso de despliegue, algo que antes estaba reservado a aplicaciones de la talla de Java y Node.js.<\/p>\n<p>En <u><a href=\"https:\/\/centeredgesoftware.com\/\" target=\"_blank\" rel=\"noopener\">Software CenterEdge<\/a><\/u>Estamos pasando r\u00e1pidamente de nuestras aplicaciones monol\u00edticas ASP.NET a microservicios ASP.NET Core basados en Docker. Estamos muy entusiasmados con las nuevas posibilidades que ofrece, y las mejoras en la robustez de nuestra aplicaci\u00f3n y la facilidad de despliegue.  Esperamos que esta visi\u00f3n general de los enfoques que estamos utilizando para hacer esta transici\u00f3n ayude a otros a seguir su ejemplo.<\/p>\n<h2>Configuraci\u00f3n y entornos<\/h2>\n<p>En la mayor\u00eda de las aplicaciones ASP.NET Core, la configuraci\u00f3n se basa en par\u00e1metros le\u00eddos de la base de datos <em>appsettings.json<\/em>\u00a0en la ra\u00edz del proyecto. Estos par\u00e1metros se sustituyen por par\u00e1metros espec\u00edficos del entorno (como <em>appsettings.Desarrollo.json<\/em>). Estos ajustes pueden ser anulados a su vez por las variables de entorno presentes cuando se inicia la aplicaci\u00f3n.<\/p>\n<p>En CenterEdge, hemos definido los entornos .NET Core para que signifiquen cosas espec\u00edficas relativas a nuestros entornos del mundo real. Tenga en cuenta que tambi\u00e9n puede a\u00f1adir sus propios nombres de entorno, no es necesario utilizar los predeterminados, pero los predeterminados funcionaron para nosotros.<\/p>\n<ul>\n<li>Desarrollo - Desarrollo en m\u00e1quina local usando Visual Studio. La configuraci\u00f3n apunta a Couchbase Server en la m\u00e1quina local, etc.<\/li>\n<li>Staging - Entornos de prueba en la nube<\/li>\n<li>Producci\u00f3n - Tanto el entorno de preproducci\u00f3n (para las pruebas finales antes del despliegue) como el entorno de producci\u00f3n final. Estos entornos son generalmente los mismos que los de Puesta en Escena pero con un registro m\u00e1s ligero por defecto.<\/li>\n<\/ul>\n<p>As\u00ed que nuestra base appsettings.json por lo general se ve algo como esto:<\/p>\n<p>{<br \/>\n\"Registro\": {<br \/>\n\"IncludeScopes\": falso,<br \/>\n\"LogLevel\": {<br \/>\n\"Predeterminado\": \"Debug\",<br \/>\n\"Sistema\": \"Informaci\u00f3n\",<br \/>\n\"Microsoft\": \"Informaci\u00f3n\",<br \/>\n\"Couchbase\": \"Debug\"<br \/>\n}<br \/>\n},<br \/>\n\"Couchbase\": {<br \/>\n\"Cubos\": [<br \/>\n{<br \/>\n\"Nombre\": \"mi-cubo\"<br \/>\n}<br \/>\n]<br \/>\n}<br \/>\n}<\/p>\n<p>La configuraci\u00f3n anterior utiliza localhost para Couchbase Server por defecto, ya que no tenemos ninguna URL de servidor especificada. A continuaci\u00f3n crearemos <em>appsettings.Staging.json<\/em>\u00a0y\/o <em>appsettings.Production.json<\/em>\u00a0as\u00ed:<\/p>\n<p>{<br \/>\n\"Registro\": {<br \/>\n\"LogLevel\": {<br \/>\n\"Predeterminado\": \"Informaci\u00f3n\",<br \/>\n\"Couchbase\": \"Informaci\u00f3n\"<br \/>\n}<br \/>\n}<br \/>\n\"CouchbaseServiceDiscovery\": \"_couchbase._tcp.services.local\"<br \/>\n}<\/p>\n<p>Esto reduce nuestros niveles de registro a algo m\u00e1s razonable, y tambi\u00e9n tiene un ajuste para el descubrimiento de servicios (discutido m\u00e1s adelante).<\/p>\n<h2>Inyecci\u00f3n de dependencia<\/h2>\n<p>ASP.NET Core utiliza un mont\u00f3n de t\u00e9cnicas que son diferentes del modelo ASP.NET tradicional, lo que significa que integrar Couchbase en aplicaciones .NET Core es un poco diferente. En particular, ASP.NET Core est\u00e1 construido desde cero para trabajar con <a href=\"https:\/\/www.couchbase.com\/blog\/es\/dependency-injection-aspnet-couchbase\/\">inyecci\u00f3n de dependencias<\/a>.<\/p>\n<p>Para ello, utilizamos la funci\u00f3n <u><a href=\"https:\/\/www.nuget.org\/packages\/Couchbase.Extensions.DependencyInjection\/\" target=\"_blank\" rel=\"noopener\">Couchbase.Extensions.DependencyInjection<\/a><\/u>\u00a0para cerrar la brecha entre los objetos bucket del SDK de Couchbase y el sistema de inyecci\u00f3n de dependencias. Couchbase se registra durante <em>ConfigureServices <\/em>en el <em>Puesta en marcha <\/em>pasando la secci\u00f3n de configuraci\u00f3n anterior. Tambi\u00e9n a\u00f1adimos algo de c\u00f3digo de apagado para cerrar las conexiones cuando la aplicaci\u00f3n web est\u00e1 saliendo.<\/p>\n<p>public void ConfigureServices(IServiceCollection services)<br \/>\n{<br \/>\n\/\/ Registrar Couchbase con la secci\u00f3n de configuraci\u00f3n<br \/>\nservicios<\/p>\n<p>.AddCouchbase(Configuration.GetSection(\"Couchbase\"))<\/p>\n<p>.AddCouchbaseBucket(\"mi-cubo\");<\/p>\n<p>if (!Environment.IsDevelopment())<br \/>\n{<br \/>\nservices.AddCouchbaseDnsDiscovery(Configuration[\"CouchbaseServiceDiscovery\"]);<br \/>\n}<\/p>\n<p>services.AddMvc();<br \/>\n\/\/ Registre aqu\u00ed otros servicios<br \/>\n}<\/p>\n<p>public void Configure(IApplicationBuilder app, IHostingEnvironment env,<\/p>\n<p>ILoggerFactory loggerFactory,<br \/>\nIApplicationLifetime applicationLifetime)<br \/>\n{<br \/>\n\/\/ &#8230;<\/p>\n<p>\/\/ Aqu\u00ed no se muestra el inicio est\u00e1ndar de la aplicaci\u00f3n<\/p>\n<p>\/\/ &#8230;<\/p>\n<p>\/\/ Cuando la aplicaci\u00f3n se detiene se cierran las conexiones Couchbase con gracia<br \/>\napplicationLifetime.ApplicationStopped.Register(() =&gt;<br \/>\n{<br \/>\napp.ApplicationServices.GetRequiredService().Close();<br \/>\n});<br \/>\n}<\/p>\n<p>Puede acceder a cualquier cubo en cualquier controlador inyectando <em>IBucketProvider<\/em>\u00a0a trav\u00e9s del constructor. Sin embargo, puede observar que el ejemplo anterior tambi\u00e9n hace una llamada a <em>AddCouchbaseBucket(\"mi-cubo\")<\/em>.<\/p>\n<p>Este m\u00e9todo permite registrar una interfaz vac\u00eda heredada de <em>INamedBucketProvider<\/em>:<\/p>\n<p>public interface IMyBucketProvider : INamedBucketProvider<br \/>\n{<br \/>\n}<\/p>\n<p>Y luego inyectarlo en un controlador o servicio de l\u00f3gica de negocio. Siempre proporcionar\u00e1 el mismo cubo, basado en la configuraci\u00f3n que usted proporcion\u00f3 durante <em>ConfigureServices<\/em>.<\/p>\n<p>public class HomeController : Controlador<br \/>\n{<br \/>\nprivate readonly IMyBucketProvider _bucketProvider;<\/p>\n<p>public HomeController(IMyBucketProvider bucketProvider)<br \/>\n{<br \/>\n_bucketProvider = bucketProvider;<br \/>\n}<\/p>\n<p>public IActionResult \u00cdndice()<br \/>\n{<br \/>\nvar bucket = _bucketProvider.GetBucket();<\/p>\n<p>var resultado =<br \/>\nawait cubo.QueryAsync(<br \/>\n&#8220;SELECT Extent.* FROM `my-bucket` AS Extent&#8221;);<\/p>\n<p>if (!result.Success)<br \/>\n{<br \/>\nthrow new Exception(\"Error de Couchbase\", result.Exception);<br \/>\n}<\/p>\n<p>return Vista(resultado.Filas);<br \/>\n}<br \/>\n}<\/p>\n<h2>Descubrimiento de servicios<\/h2>\n<p>Cuando se trabaja con microservicios, el descubrimiento de servicios es un problema com\u00fan. Cada entorno que ejecutes tender\u00e1 a tener diferentes servicios en diferentes puntos finales. Couchbase es uno de esos servicios, que puede existir en una direcci\u00f3n diferente en cada entorno. Hay muchas soluciones para el descubrimiento de servicios, pero en CenterEdge decidimos quedarnos con una soluci\u00f3n simple por ahora, <u><a href=\"https:\/\/en.wikipedia.org\/wiki\/SRV_record\" target=\"_blank\" rel=\"noopener\">DNS SRV<\/a><\/u>\u00a0registros.<\/p>\n<p>Para ello, utilizamos la funci\u00f3n <u><a href=\"https:\/\/www.nuget.org\/packages\/Couchbase.Extensions.DnsDiscovery\/\" target=\"_blank\" rel=\"noopener\">Couchbase.Extensions.DnsDiscovery<\/a><\/u>\u00a0paquete. Este paquete encontrar\u00e1 registros DNS SRV que enumeran los nodos del cl\u00faster. Para ello, creamos un dominio DNS privado en AWS Route 53 llamado \"services.local\", y creamos un conjunto de registros SRV llamado \"_couchbase._tcp.services.local\" que contiene la lista de nodos Couchbase. El conjunto de registros de Route 53 tiene este aspecto:<\/p>\n<p>10 10 8091 couchbasedata1.int.dev.centeredgeonline.com<br \/>\n10 10 8091 couchbasedata2.int.dev.centeredgeonline.com<br \/>\n10 10 8091 couchbasedata3.int.dev.centeredgeonline.com<\/p>\n<p>En el ejemplo anterior para ConfigureServices en el inicio, es posible que haya notado la siguiente secci\u00f3n:<\/p>\n<p>if (!Environment.IsDevelopment())<br \/>\n{<br \/>\nservices.AddCouchbaseDnsDiscovery(Configuration[\"CouchbaseServiceDiscovery\"]);<br \/>\n}<\/p>\n<p>Esto reemplazar\u00e1 cualquier servidor pasado a trav\u00e9s de la configuraci\u00f3n con los servidores encontrados buscando en el registro DNS SRV. Tambi\u00e9n proporcionamos el nombre DNS a trav\u00e9s de la configuraci\u00f3n, haciendo que sea f\u00e1cil de reemplazar si es necesario. Espec\u00edficamente no usamos esta extensi\u00f3n en nuestro entorno de desarrollo, donde usamos localhost para acceder al cluster de Couchbase.<\/p>\n<h2>Eso est\u00e1 bien, \u00bfy Docker?<\/h2>\n<p>Hasta ahora, todo lo que hemos hecho es aplicable a ASP.NET Core en general, y no es necesariamente espec\u00edfico de Docker. Entonces, \u00bfc\u00f3mo pasamos de una aplicaci\u00f3n general a una que se ejecuta en un contenedor Docker?<\/p>\n<p>En primer lugar, deber\u00e1 realizar algunos pasos preparatorios en su m\u00e1quina de desarrollo:<\/p>\n<ol>\n<li>Aseg\u00farese de que dispone de <u><a href=\"https:\/\/docs.microsoft.com\/en-us\/virtualization\/hyper-v-on-windows\/quick-start\/enable-hyper-v\" target=\"_blank\" rel=\"noopener\">Hyper-V activado en Windows<\/a><\/u><\/li>\n<li>Instale <u><a href=\"https:\/\/docs.docker.com\/docker-for-windows\/\" target=\"_blank\" rel=\"noopener\">Docker para Windows<\/a><\/u><\/li>\n<li>Configurar un <u><a href=\"https:\/\/docs.docker.com\/docker-for-windows\/#\/shared-drives\" target=\"_blank\" rel=\"noopener\">Unidad compartida en Docker<\/a><\/u>\u00a0para la unidad en la que se encuentra su aplicaci\u00f3n<\/li>\n<li>Instale <u><a href=\"https:\/\/marketplace.visualstudio.com\/items?itemName=MicrosoftCloudExplorer.VisualStudioToolsforDocker-Preview\" target=\"_blank\" rel=\"noopener\">Herramientas de Visual Studio para Docker<\/a><\/u><\/li>\n<li>Aseg\u00farese de que Docker est\u00e1 iniciado (puede configurar Docker para que se inicie autom\u00e1ticamente al iniciar sesi\u00f3n).<\/li>\n<\/ol>\n<p>Ahora, est\u00e1s listo para empezar. Simplemente haz clic con el bot\u00f3n derecho del rat\u00f3n en tu proyecto en Visual Studio, y ve a Add &gt; Docker Support. Esto a\u00f1ade los archivos necesarios a tu proyecto.<\/p>\n<div style=\"width: 634px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/02\/add-docker-support-3.png\" alt=\"add docker support 3\" width=\"624\" height=\"166\" \/><p class=\"wp-caption-text\">A\u00f1adir compatibilidad con Docker<\/p><\/div>\n<p>Aunque se a\u00f1aden varios archivos, hay algunos que son especialmente importantes. El primer archivo que me gustar\u00eda se\u00f1alar es <em>Dockerfile<\/em>:<\/p>\n<p>DE microsoft\/aspnetcore:1.0.1<br \/>\nENTRYPOINT [\"dotnet\", \"TestApp.dll\"]<br \/>\nARG source=.<br \/>\ndirectorio de trabajo \/app<br \/>\nEXPONE 80<br \/>\nCOPIAR 1TP4Fuente .<\/p>\n<p>Hay dos l\u00edneas clave en este archivo que es posible que tenga que modificar:<\/p>\n<p>DE microsoft\/aspnetcore:1.0.1<\/p>\n<p>Debe cambiar esta l\u00ednea si utiliza una versi\u00f3n diferente de .NET Core, como 1.0.3 o 1.1.0. La etiqueta de versi\u00f3n de esta l\u00ednea debe coincidir con la versi\u00f3n de .NET Core utilizada en el archivo project.json.<\/p>\n<p>ENTRYPOINT [\"dotnet\", \"TestApp.dll\"]<\/p>\n<p>Si cambia el nombre de su proyecto, se mostrar\u00e1 un nombre de archivo DLL diferente. Cambie esta l\u00ednea para hacer referencia al nombre de archivo DLL correcto.<\/p>\n<p>El siguiente archivo es <em>docker-compose.yml<\/em>. Este archivo, junto con algunos archivos relacionados, controla la naturaleza de los contenedores Docker que se inician al hacer clic en Ejecutar. Tendremos que hacer un cambio en <em>docker-compose.yml<\/em>\u00a0para que funcione la conexi\u00f3n con Couchbase Server.<\/p>\n<p>Nuestra configuraci\u00f3n para el entorno de Desarrollo est\u00e1 intentando acceder a \"localhost\" para acceder a Couchbase Server. Este enfoque funciona bien si la aplicaci\u00f3n se ejecuta en IIS Express. Sin embargo, dentro de un contenedor Docker \"localhost\" ya no apunta a tu ordenador de desarrollo.  En su lugar se refiere al contenedor Docker aislado, al igual que lo har\u00eda dentro de una m\u00e1quina virtual.<\/p>\n<p>Para solucionarlo, tenemos que a\u00f1adir una secci\u00f3n de entorno a <em>docker-compose.yml<\/em>\u00a0para utilizar el nombre de su ordenador en lugar de \"localhost\":<\/p>\n<p>versi\u00f3n: \"2<\/p>\n<p>servicios:<br \/>\ntestapp:<br \/>\nimagen: user\/testapp${TAG}<br \/>\nconstruir:<br \/>\ncontexto: .<br \/>\nDockerfile: Dockerfile<br \/>\npuertos:<br \/>\n&#8211;\u00a0&#8220;80&#8221;<br \/>\nmedio ambiente:<br \/>\n- Couchbase:Servidores:0=https:\/\/$COMPUTERNAME:8091\/<\/p>\n<p>S\u00f3lo tiene que a\u00f1adir las dos \u00faltimas l\u00edneas anteriores a su archivo. Docker Compose sustituir\u00e1 autom\u00e1ticamente <em>$COMPUTERNAME<\/em>\u00a0con el nombre de su equipo, lo que resulta \u00fatil a la hora de compartir la aplicaci\u00f3n con su equipo a trav\u00e9s del control de c\u00f3digo fuente.<\/p>\n<p>Ahora est\u00e1s listo para probar en Docker. S\u00f3lo tienes que cambiar el men\u00fa desplegable Ejecutar en la barra de herramientas de Visual Studio a Docker en lugar de IIS Express antes de iniciar tu aplicaci\u00f3n. Incluso admite depuraci\u00f3n y muestra registros en la ventana Depuraci\u00f3n.<\/p>\n<p>Si quieres ser realmente sofisticado, tambi\u00e9n puedes modificar <em>docker-compose.yml<\/em>\u00a0para hacer cosas como lanzar contenedores adicionales requeridos, anular otras configuraciones a trav\u00e9s de variables de entorno y m\u00e1s. Por ejemplo, en CenterEdge utilizamos este enfoque para lanzar microservicios adicionales que son dependencias de la aplicaci\u00f3n que se est\u00e1 desarrollando.<\/p>\n<h2>Despliegue<\/h2>\n<p>El m\u00e9todo exacto de despliegue variar\u00e1 en funci\u00f3n de su plataforma Docker. Por ejemplo, CenterEdge utiliza Amazon AWS, por lo que desplegaremos utilizando <u><a href=\"https:\/\/aws.amazon.com\/ecs\/\" target=\"_blank\" rel=\"noopener\">Servicio de contenedores EC2<\/a><\/u>. Independientemente de la plataforma que elijas, tendr\u00e1s que crear una imagen Docker de tu aplicaci\u00f3n y publicarla en un registro de contenedores Docker.<\/p>\n<p>En CenterEdge hemos a\u00f1adido esto a nuestro proceso de integraci\u00f3n continua, pero aqu\u00ed tiene un resumen de los pasos necesarios:<\/p>\n<ol>\n<li>Ejecute \"dotnet publish path\/to\/your\/app -c Release\" para publicar su aplicaci\u00f3n. Esto publicar\u00e1 a \"bin\/Release\/netcoreapp1.0\/publish\" por defecto, pero esto puede ser controlado con el par\u00e1metro \"-o some\/path\". Para .NET Core 1.1, ser\u00e1 netcoreapp1.1 en lugar de netcoreapp1.0 por defecto.<\/li>\n<li>Ejecute \"docker build -t myappname path\/to\/your\/app\/bin\/Release\/netcoreapp1.0\/publish\" para crear una imagen Docker. Se etiquetar\u00e1 como \"myappname\".<\/li>\n<li>Ejecute \"docker tag myappname yourdockerregistry\/myappname:sometag\" para etiquetar la imagen Docker para su registro Docker. Sustituye \"yourdockerregistry\" por la ruta a tu registro Docker. Para Docker Hub, esto es s\u00f3lo su nombre de usuario. Sustituya \"sometag\" por la etiqueta que desee utilizar, como \"latest\" o \"1.0.5\".<\/li>\n<li>Ejecute \"docker push yourdockerregistry\/myappname:sometag\" para enviar la imagen a su registro de contenedores Docker. Esto supone que ya ha utilizado \"docker login\" para autenticarse con su registro.<\/li>\n<\/ol>\n<p>En cuanto al versionado, en CenterEdge utilizamos la numeraci\u00f3n de versiones al estilo NuGet para nuestros microservicios. Por ejemplo, \"1.1.0\" o \"2.0.5-beta002\". Este n\u00famero de versi\u00f3n es la etiqueta que utilizamos en nuestro registro de contenedores Docker. Tambi\u00e9n seguimos <u><a href=\"https:\/\/semver.org\/\" target=\"_blank\" rel=\"noopener\">SemVer<\/a><\/u>lo que significa que los incrementos a diferentes partes del n\u00famero tienen significados espec\u00edficos. Si incrementamos el primer d\u00edgito, significa que la API tiene cambios de \u00faltima hora y no es totalmente compatible con versiones anteriores. Incrementar el segundo d\u00edgito indica nuevas caracter\u00edsticas significativas. El tercer d\u00edgito se incrementa para corregir errores.<\/p>\n<h2>Conclusi\u00f3n<\/h2>\n<p>Con suerte, ahora tienes las herramientas b\u00e1sicas que necesitar\u00e1s para hacer la transici\u00f3n de tus aplicaciones .NET usando Couchbase a .NET Core y Docker. La transici\u00f3n nos ha parecido divertida y emocionante.  Aunque ASP.NET Core ha cambiado algunos enfoques y otras cosas han sido obsoletas, la plataforma en general se siente mucho m\u00e1s limpia y f\u00e1cil de usar. Y estoy seguro de que vendr\u00e1n cosas a\u00fan mejores en el futuro.<\/p>","protected":false},"excerpt":{"rendered":"<p>Con el lanzamiento de Couchbase .NET SDK 2.4.0, Couchbase ahora tiene soporte oficial para .NET Core. Esto abre un nuevo mundo para los desarrolladores .NET de Couchbase. En particular, ahora podemos utilizar Docker para gestionar f\u00e1cilmente nuestras aplicaciones y mejorar nuestro proceso de despliegue, algo que antes estaba reservado para Java y Node.js.<\/p>","protected":false},"author":53,"featured_media":2864,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1811],"tags":[1519],"ppma_author":[9026],"class_list":["post-2858","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dotnet","tag-docker"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.0 (Yoast SEO v26.0) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Couchbase Meets .Net Core and Docker - 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\/couchbase-meets-net-core-docker\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Couchbase Meets .Net Core and Docker\" \/>\n<meta property=\"og:description\" content=\"With the release of the Couchbase .NET SDK 2.4.0, Couchbase now has official support for .NET Core. This opens up a wide new world for .NET Couchbase developers. In particular, we can now use Docker to easily manage our applications and improve our deployment process, something previously reserved for the likes of Java and Node.js.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/couchbase-meets-net-core-docker\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2017-02-27T15:55:38+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-13T22:55:35+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/dockericon.png\" \/>\n\t<meta property=\"og:image:width\" content=\"792\" \/>\n\t<meta property=\"og:image:height\" content=\"269\" \/>\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=\"8 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-meets-net-core-docker\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-meets-net-core-docker\/\"},\"author\":{\"name\":\"Laura Czajkowski, Developer Community Manager, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/5f1a0ece4e644bc8c037686fbc8f3220\"},\"headline\":\"Couchbase Meets .Net Core and Docker\",\"datePublished\":\"2017-02-27T15:55:38+00:00\",\"dateModified\":\"2025-06-13T22:55:35+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-meets-net-core-docker\/\"},\"wordCount\":1857,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-meets-net-core-docker\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/dockericon.png\",\"keywords\":[\"docker\"],\"articleSection\":[\".NET\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/couchbase-meets-net-core-docker\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-meets-net-core-docker\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/couchbase-meets-net-core-docker\/\",\"name\":\"Couchbase Meets .Net Core and Docker - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-meets-net-core-docker\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-meets-net-core-docker\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/dockericon.png\",\"datePublished\":\"2017-02-27T15:55:38+00:00\",\"dateModified\":\"2025-06-13T22:55:35+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-meets-net-core-docker\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/couchbase-meets-net-core-docker\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-meets-net-core-docker\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/dockericon.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/dockericon.png\",\"width\":792,\"height\":269,\"caption\":\"Docker\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-meets-net-core-docker\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Couchbase Meets .Net Core and Docker\"}]},{\"@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":"Couchbase se une a .Net Core y Docker - El blog de Couchbase","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/es\/couchbase-meets-net-core-docker\/","og_locale":"es_MX","og_type":"article","og_title":"Couchbase Meets .Net Core and Docker","og_description":"With the release of the Couchbase .NET SDK 2.4.0, Couchbase now has official support for .NET Core. This opens up a wide new world for .NET Couchbase developers. In particular, we can now use Docker to easily manage our applications and improve our deployment process, something previously reserved for the likes of Java and Node.js.","og_url":"https:\/\/www.couchbase.com\/blog\/es\/couchbase-meets-net-core-docker\/","og_site_name":"The Couchbase Blog","article_published_time":"2017-02-27T15:55:38+00:00","article_modified_time":"2025-06-13T22:55:35+00:00","og_image":[{"width":792,"height":269,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/dockericon.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":"8 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-meets-net-core-docker\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-meets-net-core-docker\/"},"author":{"name":"Laura Czajkowski, Developer Community Manager, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/5f1a0ece4e644bc8c037686fbc8f3220"},"headline":"Couchbase Meets .Net Core and Docker","datePublished":"2017-02-27T15:55:38+00:00","dateModified":"2025-06-13T22:55:35+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-meets-net-core-docker\/"},"wordCount":1857,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-meets-net-core-docker\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/dockericon.png","keywords":["docker"],"articleSection":[".NET"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/couchbase-meets-net-core-docker\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-meets-net-core-docker\/","url":"https:\/\/www.couchbase.com\/blog\/couchbase-meets-net-core-docker\/","name":"Couchbase se une a .Net Core y Docker - El blog de Couchbase","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-meets-net-core-docker\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-meets-net-core-docker\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/dockericon.png","datePublished":"2017-02-27T15:55:38+00:00","dateModified":"2025-06-13T22:55:35+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-meets-net-core-docker\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/couchbase-meets-net-core-docker\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-meets-net-core-docker\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/dockericon.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/dockericon.png","width":792,"height":269,"caption":"Docker"},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-meets-net-core-docker\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Couchbase Meets .Net Core and Docker"}]},{"@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\/2858","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=2858"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/2858\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/2864"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=2858"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=2858"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=2858"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=2858"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}