{"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\/ko\/couchbase-meets-net-core-docker\/","title":{"rendered":"\uce74\uc6b0\uce58\ubca0\uc774\uc2a4, .Net Core\uc640 \ub3c4\ucee4\uc758 \ub9cc\ub0a8"},"content":{"rendered":"<p><em>Brant Burnett is a <a href=\"https:\/\/developer.couchbase.com\/experts-and-champions\">Couchbase Expert<\/a>, systems architect, and .Net developer experienced in desktop and web full stack development. \u00a0For the last 12 years, he has been a working with CenterEdge Software, a family entertainment software company based in Roxboro, NC. \u00a0Brant is experienced in developing applications for all segments of their software suite. \u00a0Over the last 4 years, he has worked to transition the company&#8217;s cloud infrastructure from a Microsoft SQL platform to a pure Couchbase NoSQL platform. \u00a0Through his work at CenterEdge, Brant has been able to focus on creating serious software solutions for fun businesses.<\/em><\/p>\n<p>With\u00a0the release of the <u><a href=\"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-2-4-0-net-core-ga\/\" target=\"_blank\" rel=\"noopener\">Couchbase .NET SDK 2.4.0<\/a><\/u>, Couchbase now has official support for <u><a href=\"https:\/\/www.microsoft.com\/net\/core\" target=\"_blank\" rel=\"noopener\">.NET Core<\/a><\/u>. This opens up a wide new world for .NET <a href=\"https:\/\/www.couchbase.com\/downloads\/\">Couchbase<\/a> developers. In particular, we can now use <u><a href=\"https:\/\/www.docker.com\/\" target=\"_blank\" rel=\"noopener\">Docker<\/a><\/u>\u00a0to easily manage our applications and improve our deployment process, something previously reserved for the likes of Java and Node.js.<\/p>\n<p>At <u><a href=\"https:\/\/centeredgesoftware.com\/\" target=\"_blank\" rel=\"noopener\">CenterEdge Software<\/a><\/u>, we\u2019re quickly moving to break our ASP.NET monolithic applications into Docker-based ASP.NET Core microservices. We\u2019re very excited about the new possibilities that it provides, and the improvements to our application\u2019s robustness and ease of deployments. \u00a0Hopefully, this overview of the approaches we\u2019re using to make this transition will help others follow suit.<\/p>\n<h2>Configuration and Environments<\/h2>\n<p>In most ASP.NET Core applications, configuration is based on settings read from the <em>appsettings.json<\/em>\u00a0file in the root of your project. These settings are then overridden by environment-specific settings (such as <em>appsettings.Development.json<\/em>). These settings can then be overridden in turn by environment variables present when the application is started.<\/p>\n<p>At CenterEdge, we\u2019ve defined the .NET Core environments to mean specific things relative to our real-world environments. Note that you can also add your own environment names, you don\u2019t need to use the defaults, but the defaults worked for us.<\/p>\n<ul>\n<li>Development \u2013\u00a0Local machine development using Visual Studio. The configuration points to Couchbase Server on the local machine, etc.<\/li>\n<li>Staging \u2013\u00a0In-cloud testing environments<\/li>\n<li>Production \u2013\u00a0Both the pre-production environment (for final tests before deployment) and the final production environment. These environments are generally the same as Staging but with lighter logging by default.<\/li>\n<\/ul>\n<p>So our base appsettings.json usually looks something like this:<\/p>\n<p>{<br \/>\n&#8220;Logging&#8221;:\u00a0{<br \/>\n&#8220;IncludeScopes&#8221;:\u00a0false,<br \/>\n&#8220;LogLevel&#8221;:\u00a0{<br \/>\n&#8220;Default&#8221;:\u00a0&#8220;Debug&#8221;,<br \/>\n&#8220;System&#8221;:\u00a0&#8220;Information&#8221;,<br \/>\n&#8220;Microsoft&#8221;:\u00a0&#8220;Information&#8221;,<br \/>\n&#8220;Couchbase&#8221;:\u00a0&#8220;Debug&#8221;<br \/>\n}<br \/>\n},<br \/>\n&#8220;Couchbase&#8221;:\u00a0{<br \/>\n&#8220;Buckets&#8221;:\u00a0[<br \/>\n{<br \/>\n&#8220;Name&#8221;:\u00a0&#8220;my-bucket&#8221;<br \/>\n}<br \/>\n]<br \/>\n}<br \/>\n}<\/p>\n<p>The above configuration uses localhost for Couchbase Server by default, since we don\u2019t have any server URLs specified. Next we\u2019ll create <em>appsettings.Staging.json<\/em>\u00a0and\/or <em>appsettings.Production.json<\/em>\u00a0like this:<\/p>\n<p>{<br \/>\n&#8220;Logging&#8221;:\u00a0{<br \/>\n&#8220;LogLevel&#8221;:\u00a0{<br \/>\n&#8220;Default&#8221;:\u00a0&#8220;Information&#8221;,<br \/>\n&#8220;Couchbase&#8221;:\u00a0&#8220;Information&#8221;<br \/>\n}<br \/>\n}<br \/>\n&#8220;CouchbaseServiceDiscovery&#8221;:\u00a0&#8220;_couchbase._tcp.services.local&#8221;<br \/>\n}<\/p>\n<p>This reduces our log levels to something more reasonable, and also has a setting for service discovery (discussed later).<\/p>\n<h2>Dependency Injection<\/h2>\n<p>ASP.NET Core uses a lot of techniques that are different from the traditional ASP.NET model, which means integrating Couchbase into .NET Core applications is a bit different. In particular, ASP.NET Core is built from the ground up to work with <a href=\"https:\/\/www.couchbase.com\/blog\/dependency-injection-aspnet-couchbase\/\">dependency injection<\/a>.<\/p>\n<p>To support this, we use the <u><a href=\"https:\/\/www.nuget.org\/packages\/Couchbase.Extensions.DependencyInjection\/\" target=\"_blank\" rel=\"noopener\">Couchbase.Extensions.DependencyInjection<\/a><\/u>\u00a0package to bridge the gap between Couchbase SDK bucket objects and the dependency injection system. Couchbase is registered during <em>ConfigureServices <\/em>in the <em>Startup <\/em>class, passing the configuration section from above. We also add some shutdown code to close connections when the web application is exiting.<\/p>\n<p>public\u00a0void\u00a0ConfigureServices(IServiceCollection\u00a0services)<br \/>\n{<br \/>\n\/\/ Register Couchbase with configuration section<br \/>\nservices<\/p>\n<p>.AddCouchbase(Configuration.GetSection(&#8220;Couchbase&#8221;))<\/p>\n<p>.AddCouchbaseBucket&lt;IMyBucketProvider&gt;(&#8220;my-bucket&#8221;);<\/p>\n<p>if\u00a0(!Environment.IsDevelopment())<br \/>\n{<br \/>\nservices.AddCouchbaseDnsDiscovery(Configuration[&#8220;CouchbaseServiceDiscovery&#8221;]);<br \/>\n}<\/p>\n<p>services.AddMvc();<br \/>\n\/\/ Register other services here<br \/>\n}<\/p>\n<p>public\u00a0void\u00a0Configure(IApplicationBuilder\u00a0app,\u00a0IHostingEnvironment\u00a0env,<\/p>\n<p>ILoggerFactory\u00a0loggerFactory,<br \/>\nIApplicationLifetime\u00a0applicationLifetime)<br \/>\n{<br \/>\n\/\/ &#8230;<\/p>\n<p>\/\/ Not showing standard application startup here<\/p>\n<p>\/\/ &#8230;<\/p>\n<p>\/\/ When application is stopped gracefully shutdown Couchbase connections<br \/>\napplicationLifetime.ApplicationStopped.Register(()\u00a0=&gt;<br \/>\n{<br \/>\napp.ApplicationServices.GetRequiredService&lt;ICouchbaseLifetimeService&gt;().Close();<br \/>\n});<br \/>\n}<\/p>\n<p>You can access any bucket in any controller by injecting <em>IBucketProvider<\/em>\u00a0via the constructor. However, you may note that the above example also makes a call to <em>AddCouchbaseBucket&lt;IMyBucketProvider&gt;(\u201cmy-bucket\u201d)<\/em>.<\/p>\n<p>This method allows you to register an empty interface inherited from <em>INamedBucketProvider<\/em>:<\/p>\n<p>public\u00a0interface\u00a0IMyBucketProvider\u00a0:\u00a0INamedBucketProvider<br \/>\n{<br \/>\n}<\/p>\n<p>And then inject it into a controller or business logic service. It will always provide the same bucket, based on the configuration you provided during <em>ConfigureServices<\/em>.<\/p>\n<p>public\u00a0class\u00a0HomeController\u00a0:\u00a0Controller<br \/>\n{<br \/>\nprivate\u00a0readonly\u00a0IMyBucketProvider\u00a0_bucketProvider;<\/p>\n<p>public\u00a0HomeController(IMyBucketProvider\u00a0bucketProvider)<br \/>\n{<br \/>\n_bucketProvider =\u00a0bucketProvider;<br \/>\n}<\/p>\n<p>public\u00a0IActionResult\u00a0Index()<br \/>\n{<br \/>\nvar\u00a0bucket =\u00a0_bucketProvider.GetBucket();<\/p>\n<p>var\u00a0result =<br \/>\nawait bucket.QueryAsync&lt;Model&gt;(<br \/>\n&#8220;SELECT Extent.* FROM `my-bucket` AS Extent&#8221;);<\/p>\n<p>if\u00a0(!result.Success)<br \/>\n{<br \/>\nthrow\u00a0new\u00a0Exception(&#8220;Couchbase Error&#8221;,\u00a0result.Exception);<br \/>\n}<\/p>\n<p>return\u00a0View(result.Rows);<br \/>\n}<br \/>\n}<\/p>\n<h2>Service Discovery<\/h2>\n<p>When working with microservices, service discovery is a common problem. Each environment that you run will tend to have different services at different endpoints. Couchbase is one such service, which may exist at a different address in each environment. There are many solutions for service discovery, but at CenterEdge we decided to stick with a simple solution for now, <u><a href=\"https:\/\/en.wikipedia.org\/wiki\/SRV_record\" target=\"_blank\" rel=\"noopener\">DNS SRV<\/a><\/u>\u00a0records.<\/p>\n<p>To support this, we use the <u><a href=\"https:\/\/www.nuget.org\/packages\/Couchbase.Extensions.DnsDiscovery\/\" target=\"_blank\" rel=\"noopener\">Couchbase.Extensions.DnsDiscovery<\/a><\/u>\u00a0package. This package will find DNS SRV records which list the nodes in the cluster. To support this, we create a private DNS domain in AWS Route 53 named \u201cservices.local\u201d, and create a SRV recordset named \u201c_couchbase._tcp.services.local\u201d that has the list of Couchbase nodes. The Route 53 recordset looks something like this:<\/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>In the above example for ConfigureServices in startup, you may have noticed the following section:<\/p>\n<p>if\u00a0(!Environment.IsDevelopment())<br \/>\n{<br \/>\nservices.AddCouchbaseDnsDiscovery(Configuration[&#8220;CouchbaseServiceDiscovery&#8221;]);<br \/>\n}<\/p>\n<p>This will replace any servers passed via configuration with the servers found by looking up the DNS SRV record. We also provide the DNS name via configuration, making it easy to override if necessary. We specifically don\u2019t use this extension in our Development environment, where we\u2019re using localhost to access the Couchbase cluster.<\/p>\n<h2>That\u2019s Cool, What About Docker?<\/h2>\n<p>So far, everything we\u2019ve done is applicable to ASP.NET Core in general, and is not necessarily specific to Docker. So how do we move from a general application to one that runs in a Docker container?<\/p>\n<p>First, there a few preparatory steps you\u2019ll need to complete on your development machine:<\/p>\n<ol>\n<li>Ensure that you have <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 enabled in Windows<\/a><\/u><\/li>\n<li>Install <u><a href=\"https:\/\/docs.docker.com\/docker-for-windows\/\" target=\"_blank\" rel=\"noopener\">Docker for Windows<\/a><\/u><\/li>\n<li>Configure a <u><a href=\"https:\/\/docs.docker.com\/docker-for-windows\/#\/shared-drives\" target=\"_blank\" rel=\"noopener\">Shared Drive in Docker<\/a><\/u>\u00a0for the drive where your application lives<\/li>\n<li>Install <u><a href=\"https:\/\/marketplace.visualstudio.com\/items?itemName=MicrosoftCloudExplorer.VisualStudioToolsforDocker-Preview\" target=\"_blank\" rel=\"noopener\">Visual Studio Tools for Docker<\/a><\/u><\/li>\n<li>Ensure that Docker is started (you can configure Docker to autostart on login)<\/li>\n<\/ol>\n<p>Now, you\u2019re ready to go. Just right click on your project in Visual Studio, and go to Add &gt; Docker Support. This adds the necessary files to your project.<\/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\">Add Docker Support<\/p><\/div>\n<p>While several files are added, there are some files that are particularly important. The first file I\u2019d like to point out is <em>Dockerfile<\/em>:<\/p>\n<p>FROM microsoft\/aspnetcore:1.0.1<br \/>\nENTRYPOINT [&#8220;dotnet&#8221;,\u00a0&#8220;TestApp.dll&#8221;]<br \/>\nARG source=.<br \/>\nWORKDIR \/app<br \/>\nEXPOSE 80<br \/>\nCOPY $source .<\/p>\n<p>There are two key lines in this file that you might need to modify:<\/p>\n<p>FROM microsoft\/aspnetcore:1.0.1<\/p>\n<p>You must change this line if you\u2019re using a different version of .NET Core, such as 1.0.3 or 1.1.0. The version tag on this line should match the version of .NET Core used in your project.json file.<\/p>\n<p>ENTRYPOINT [&#8220;dotnet&#8221;,\u00a0&#8220;TestApp.dll&#8221;]<\/p>\n<p>If you rename your project, it will output a different DLL filename. Change this line to reference the correct DLL filename.<\/p>\n<p>The next file is <em>docker-compose.yml<\/em>. This file, along with some related files, controls the nature of the Docker containers started when you click Run. We\u2019ll need to make a change in <em>docker-compose.yml<\/em>\u00a0to get the Couchbase Server connection working.<\/p>\n<p>Our configuration for the Development environment is trying to access \u201clocalhost\u201d to access Couchbase Server. This approach works fine if the application is running in IIS Express. However, inside a Docker container \u201clocalhost\u201d no longer points to your development computer. \u00a0Instead it refers to the isolated Docker container, much like it would within a virtual machine.<\/p>\n<p>To fix this, we need to add an environment section to <em>docker-compose.yml<\/em>\u00a0to use your computer\u2019s name instead of \u201clocalhost\u201d:<\/p>\n<p>version:\u00a0&#8216;2&#8217;<\/p>\n<p>services:<br \/>\ntestapp:<br \/>\nimage:\u00a0user\/testapp${TAG}<br \/>\nbuild:<br \/>\ncontext:\u00a0.<br \/>\ndockerfile:\u00a0Dockerfile<br \/>\nports:<br \/>\n&#8211;\u00a0&#8220;80&#8221;<br \/>\nenvironment:<br \/>\n&#8211;\u00a0Couchbase:Servers:0=https:\/\/$COMPUTERNAME:8091\/<\/p>\n<p>Just add the last two lines above to your file. Docker Compose will automatically substitute <em>$COMPUTERNAME<\/em>\u00a0with the name of your computer, which is helpful when sharing the application with your team via source control.<\/p>\n<p>Now you\u2019re ready to test in Docker. Just change the Run drop down in your Visual Studio toolbar to Docker instead of IIS Express before you start your app. It even supports debugging and shows logs in the Debug window.<\/p>\n<p>If you want to get really fancy, you can also tweak <em>docker-compose.yml<\/em>\u00a0to do things like launch additional required containers, override other settings via environment variables, and more. For example, at CenterEdge we use this approach to launch additional microservices that are dependencies of the application being developed.<\/p>\n<h2>Deployment<\/h2>\n<p>Your exact deployment approach will vary depending on your Docker platform. For example, CenterEdge uses Amazon AWS, so we\u2019ll deploy using <u><a href=\"https:\/\/aws.amazon.com\/ecs\/\" target=\"_blank\" rel=\"noopener\">EC2 Container Service<\/a><\/u>. Regardless of your platform of choice, you\u2019ll need to make a Docker image from your application and publish it to a Docker container registry.<\/p>\n<p>At CenterEdge we\u2019ve added this to our continuous integration process, but here\u2019s a summary of the steps involved:<\/p>\n<ol>\n<li>Run \u201cdotnet publish path\/to\/your\/app -c Release\u201d to publish your application. This will publish to \u201cbin\/Release\/netcoreapp1.0\/publish\u201d by default, but this can be controlled with the \u201c-o some\/path\u201d parameter. For .NET Core 1.1, it will be netcoreapp1.1 instead of netcoreapp1.0 by default.<\/li>\n<li>Run \u201cdocker build -t myappname path\/to\/your\/app\/bin\/Release\/netcoreapp1.0\/publish\u201d to build a Docker image. It will be tagged as \u201cmyappname\u201d.<\/li>\n<li>Run \u201cdocker tag myappname yourdockerregistry\/myappname:sometag\u201d to tag the Docker image for your Docker registry. Substitute \u201cyourdockerregistry\u201d with the path to your Docker registry. For Docker Hub, this is just your username. Substitute \u201csometag\u201d with tag you want to use, such as \u201clatest\u201d or \u201c1.0.5\u201d.<\/li>\n<li>Run \u201cdocker push yourdockerregistry\/myappname:sometag\u201d to push the image to your Docker container registry. This assumes that you\u2019ve already used \u201cdocker login\u201d to authenticate with your registry.<\/li>\n<\/ol>\n<p>Regarding versioning, at CenterEdge we use NuGet-style version numbering for our microservices. For example, \u201c1.1.0\u201d or \u201c2.0.5-beta002\u201d. This version number is the tag we use in our Docker container registry. We also follow <u><a href=\"https:\/\/semver.org\/\" target=\"_blank\" rel=\"noopener\">SemVer<\/a><\/u>, meaning that increments to different parts of the number have specific meanings. If we increment the first digit, it means the API has breaking changes and is not fully backwards compatible. Incrementing the second digit indicates significant new features. The third digit is incremented for bug fixes.<\/p>\n<h2>Conclusion<\/h2>\n<p>Hopefully,\u00a0you now have the basic tools you\u2019ll need to transition your .NET applications using Couchbase to .NET Core and Docker. We\u2019ve found the transition to be fun and exciting. \u00a0While ASP.NET Core has changed some approaches and other things have been deprecated, the overall platform feels much cleaner and easier to use. And I\u2019m sure even more great things are coming in the future.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Couchbase .NET SDK 2.4.0\uc774 \ucd9c\uc2dc\ub428\uc5d0 \ub530\ub77c Couchbase\ub294 \uc774\uc81c .NET Core\ub97c \uacf5\uc2dd\uc801\uc73c\ub85c \uc9c0\uc6d0\ud569\ub2c8\ub2e4. \uc774\ub85c\uc368 .NET Couchbase \uac1c\ubc1c\uc790\uc5d0\uac8c \uc0c8\ub85c\uc6b4 \uc138\uc0c1\uc774 \uc5f4\ub838\uc2b5\ub2c8\ub2e4. \ud2b9\ud788, \uc774\uc804\uc5d0\ub294 Java \ubc0f Node.js\uc5d0\uc11c\ub9cc \uac00\ub2a5\ud588\ub358 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uad00\ub9ac \ubc0f \ubc30\ud3ec \ud504\ub85c\uc138\uc2a4\ub97c \uac1c\uc120\ud558\uae30 \uc704\ud574 Docker\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\uac8c \ub418\uc5c8\uc2b5\ub2c8\ub2e4.<\/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"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.3 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\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\/ko\/couchbase-meets-net-core-docker\/\" \/>\n<meta property=\"og:locale\" content=\"ko_KR\" \/>\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\/ko\/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\ubd84\" \/>\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\":\"ko-KR\",\"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\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/couchbase-meets-net-core-docker\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@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\":\"ko-KR\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@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\":\"ko-KR\",\"@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\\\/ko\\\/author\\\/laura-czajkowski\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Couchbase\uc640 .Net Core \ubc0f Docker\uc758 \ub9cc\ub0a8 - Couchbase \ube14\ub85c\uadf8","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\/ko\/couchbase-meets-net-core-docker\/","og_locale":"ko_KR","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\/ko\/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\ubd84"},"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":"ko-KR","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\uc640 .Net Core \ubc0f Docker\uc758 \ub9cc\ub0a8 - Couchbase \ube14\ub85c\uadf8","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":"ko-KR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/couchbase-meets-net-core-docker\/"]}]},{"@type":"ImageObject","inLanguage":"ko-KR","@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":"\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \ube14\ub85c\uadf8","description":"NoSQL \ub370\uc774\ud130\ubca0\uc774\uc2a4, Couchbase","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":"ko-KR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \ube14\ub85c\uadf8","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"ko-KR","@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, \uac1c\ubc1c\uc790 \ucee4\ubba4\ub2c8\ud2f0 \uad00\ub9ac\uc790, Couchbase","image":{"@type":"ImageObject","inLanguage":"ko-KR","@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":"\ub85c\ub77c \ucc60\ucf54\ube0c\uc2a4\ud0a4\ub294 \uce74\uc6b0\uce58\ubca0\uc774\uc2a4\uc758 Snr. \uac1c\ubc1c\uc790 \ucee4\ubba4\ub2c8\ud2f0 \ub9e4\ub2c8\uc800\ub85c \uce74\uc6b0\uce58\ubca0\uc774\uc2a4\uc758 \ucee4\ubba4\ub2c8\ud2f0\ub97c \ucd1d\uad04\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uadf8\ub140\ub294 \uc6d4\uac04 \uac1c\ubc1c\uc790 \ub274\uc2a4\ub808\ud130\ub97c \ub2f4\ub2f9\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4.","url":"https:\/\/www.couchbase.com\/blog\/ko\/author\/laura-czajkowski\/"}]}},"acf":[],"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","0":null,"1":"","2":"","3":"","4":"","5":"","6":"","7":"","8":""}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/posts\/2858","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/users\/53"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/comments?post=2858"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/posts\/2858\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/media\/2864"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/media?parent=2858"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/categories?post=2858"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/tags?post=2858"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/ppma_author?post=2858"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}