{"id":45960,"date":"2015-05-28T19:10:09","date_gmt":"2015-05-28T16:10:09","guid":{"rendered":"https:\/\/www.altoros.com\/blog\/?p=45960"},"modified":"2019-08-12T16:37:05","modified_gmt":"2019-08-12T13:37:05","slug":"are-diego-and-docker-really-good-friends","status":"publish","type":"post","link":"https:\/\/www.altoros.com\/blog\/are-diego-and-docker-really-good-friends\/","title":{"rendered":"Are Diego and Docker Really Good Friends?"},"content":{"rendered":"<p>Support for Docker is one of the main advantages of <a href=\"https:\/\/www.slideshare.net\/Pivotal\/cloud-foundry-summit-2014-diego-reenvisioning-the-elastic-runtime\" target=blank rel=\"noopener noreferrer\">Cloud Foundry Diego<\/a>, but how far does this compatibility go? Is it possible to push an arbitrary image from the <a href=\"https:\/\/hub.docker.com\/\" target=blank rel=\"noopener noreferrer\">Docker Hub<\/a> to Diego and, if not, what are the constraints? What&#8217;s going to change in the future? Finally, why should anyone want to use Diego with Docker at all? In this post, we&#8217;ll provide answers for these questions.<\/p>\n<p>&nbsp;<\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_79_2 counter-hierarchy ez-toc-counter ez-toc-transparent ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.altoros.com\/blog\/are-diego-and-docker-really-good-friends\/#Technical_prerequisites\" >Technical prerequisites<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.altoros.com\/blog\/are-diego-and-docker-really-good-friends\/#How_Diego_supports_Docker\" >How Diego supports Docker<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.altoros.com\/blog\/are-diego-and-docker-really-good-friends\/#The_main_incompatibilities\" >The main incompatibilities<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.altoros.com\/blog\/are-diego-and-docker-really-good-friends\/#Available_workarounds\" >Available workarounds<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/www.altoros.com\/blog\/are-diego-and-docker-really-good-friends\/#Turning_a_Docker_app_into_a_CF_service\" >Turning a Docker app into a CF service<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/www.altoros.com\/blog\/are-diego-and-docker-really-good-friends\/#Summing_it_up_for_Ops_and_Devs\" >Summing it up (for Ops and Devs)<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/www.altoros.com\/blog\/are-diego-and-docker-really-good-friends\/#Future_plans_for_Diego_Docker_and_Lattice\" >Future plans for Diego, Docker, and Lattice<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/www.altoros.com\/blog\/are-diego-and-docker-really-good-friends\/#Further_reading\" >Further reading<\/a><\/li><\/ul><\/nav><\/div>\n<h3><span class=\"ez-toc-section\" id=\"Technical_prerequisites\"><\/span>Technical prerequisites<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>We&#8217;re going to examine the features of the latest (as of the time this post was written) Cloud Foundry release (v207) and the corresponding version of Diego (release v0.1099.0). The functionality that we will describe has been tested on AWS deployments of Cloud Foundry and Diego.<\/p>\n<p>Diego has to be configured to use the Docker back end (the <code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">diego_docker<\/code> manifest property has to be set to <em>true<\/em>). In order to push Docker applications, <a href=\"https:\/\/github.com\/cloudfoundry-attic\/diego-cli-plugin\" target=blank rel=\"noopener noreferrer\">the Diego plug-in<\/a> for the CF CLI has to be installed.<\/p>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"How_Diego_supports_Docker\"><\/span>How Diego supports Docker<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>When we talk about Docker support, we mean that some Docker image, which Docker can create a container from and run processes in, is consumed by Diego to create a container, in which the same processes can run seamlessly.<\/p>\n<p>To provide such support, Diego uses <a href=\"https:\/\/github.com\/cloudfoundry-attic\/garden-linux\" target=blank rel=\"noopener noreferrer\">Garden-Linux<\/a> that constructs Linux containers and mounts Docker images to them. While not directly using Docker to create containers, Diego employs some of the libraries Docker is built with. With them in place, Garden-Linux extracts the necessary metadata (mainly the commands to be launched) from a Docker image, mounts all the image layers to the container it has created, and executes the starting commands along with the Diego health-check script when the container is launched.<\/p>\n<p>You can find more details about the Docker support in Diego, as well as some notes about the compatibility issues and work in progress in <a href=\"https:\/\/github.com\/cloudfoundry\/diego-design-notes\/blob\/master\/docker-support.md\" target=blank rel=\"noopener noreferrer\">this GitHub repo<\/a>.<\/p>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"The_main_incompatibilities\"><\/span>The main incompatibilities<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>The two main pitfalls that may prevent some Docker images from running on Diego are the health-check script indispensably checking the 8080 port and container processes running as the VCAP user with limited permissions and ownership rights.<\/p>\n<p>This is not a big deal if you run a regular user application that normally doesn\u2019t need to have root privileges or use files in system directories that may require some permissions. In that case, you can usually configure the port to fit the external requirements. The \u201cport issue\u201d does not apply to the apps that do not need routes either. Issues arise if you are working with applications that are actually services: web servers, databases, message queues, etc.<\/p>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Available_workarounds\"><\/span>Available workarounds<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>The simplest solution for the issues described above is customizing your Docker images, so that they match Diego\u2019s constraints.<\/p>\n<p>Consider <a href=\"https:\/\/registry.hub.docker.com\/_\/redis\/\" target=blank rel=\"noopener noreferrer\">the official Redis image<\/a> as an example. If we look through its Dockerfile and the starting script, we\u2019ll see that the <code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">redis<\/code> user is created and then used for starting the service. This won\u2019t work in Diego, because the <code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">vcap<\/code> user doesn\u2019t have the privilege to set the user ID. What we can do here is run Redis as the <code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">vcap<\/code> user.<\/p>\n<p>Still, we may need to change user permissions and\/or ownership rights. The latter is impossible right now, but there is a workaround to resolve the former. Permissions can be set when a Docker image is created. If we set the proper bits for the <code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">other users<\/code>, they will be applied to the <code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">vcap<\/code> user later when the command will be executed.<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nRUN chmod 777 \/data\r\n<\/pre>\n<p>Running as the <code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">vcap<\/code> user with proper permissions granted should be enough for most services (Redis, MongoDB, etc.), because they rarely rely on ownership of files. In case of the Redis image, though, it is sufficient to simply remove the corresponding user-manipulation directives.<\/p>\n<p>And what about the port? That\u2019s easy. In case of Redis, we just need to provide the <code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">--port<\/code> argument to the <code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">redis-server<\/code> command.<\/p>\n<p>The modified Redis image with the fixes described above can be found in the <a href=\"https:\/\/github.com\/Altoros\/redis\/tree\/master\/3.0\" target=blank rel=\"noopener noreferrer\">Altoros&#8217;s GitHub<\/a> repo. Redis can be installed from our <a href=\"https:\/\/registry.hub.docker.com\/u\/altoros\/redis\/\" target=blank rel=\"noopener noreferrer\">repo on Docker Hub<\/a>. The installation process is as simple as shown below.<\/p>\n<p><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\ncf docker-push redis altoros\/redis\r\n<\/pre>\n<\/p>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Turning_a_Docker_app_into_a_CF_service\"><\/span>Turning a Docker app into a CF service<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>We have deployed Redis from the Docker image in almost the same way any regular app can be deployed. Why may we need such a service and how can we use it?<\/p>\n<p>A use case we can see here is a service in a private PaaS that can be easily created either by an operator or by a developer to be consumed by a set of apps deployed to this platform. There are three main reasons why you may want this kind of service:<\/p>\n<ul>\n<li>the simplicity of service deployment<\/li>\n<li>the convenience of further service development (you can debug it locally with Docker)<\/li>\n<li>the advantages provided by Diego, including, but not limited to, health checking, monitoring, log aggregation, and scaling (in case of stateless HTTP services)<\/li>\n<\/ul>\n<p>So, how do you set it up? One thing Cloud Foundry helps us to do is connect services with apps via <a href=\"https:\/\/docs.cloudfoundry.org\/devguide\/services\/user-provided.html\" target=blank rel=\"noopener noreferrer\">user-provided service instances<\/a>. We can create an instance with the CF CLI, giving it the necessary credentials.<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\ncf create-user-provided-service redis -p \u2018{\u201chost\u201d:\u201d&lt;host&gt;\u201d,\u201dport\u201d:\u201d&lt;port&gt;\u201d,\u201ddb\u201d:\u201d&lt;db&gt;\u201d}\u2019\r\n<\/pre>\n<p>How do we know the exact host and port? Since every Diego application is actually a so-called <a href=\"https:\/\/github.com\/cloudfoundry\/diego-design-notes#what-does-diego-do\" target=blank rel=\"noopener noreferrer\">Long Running Process<\/a> (LRP), we can query the vital information via the Receptor HTTP API.<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\ncurl http:\/\/receptor.&lt;CF_DOMAIN&gt;\/v1\/actual_lrps\r\n<\/pre>\n<p>As a response, we will receive an array of JSON objects, describing the currently running LRPs. The object we need can be found by the <code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">process_guid<\/code> field that is the corresponding app\u2019s <code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">GUID (cf app redis --guid)<\/code>. The pieces of information we are looking for are the <code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">address<\/code> field that corresponds to the <code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">host<\/code> parameter and the <code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">container_port<\/code> field that corresponds to the service port. The <code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">db<\/code> parameter is just an index of the database that Redis will use.<\/p>\n<p>There is one more step here: You have to configure a Cloud Foundry security group to allow incoming TCP traffic for the service. For more detailed instructions, refer to the README file of <a href=\"https:\/\/github.com\/cloudfoundry\/cf-mysql-release#security-groups\" target=blank rel=\"noopener noreferrer\">cf-mysql-release<\/a>.<\/p>\n<p>Some important things to note here:<\/p>\n<ul>\n<li style=\"margin-bottom: 6px;\">The application route is not of any use to Redis, because Router in Cloud Foundry has no support for TCP traffic. Sure, if you deploy the HTTP service, the route just works, and there is no need to investigate the host and port.<\/li>\n<li style=\"margin-bottom: 6px;\">It is up to you which credentials to provide. This depends on the applications that consume the service (e.g., in case of Redis, you can additionally set the password or omit the <code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">db<\/code> parameter, so that it defaults to \u201c0\u201d).<\/li>\n<li style=\"margin-bottom: 6px;\">Each time you start an app, Diego assigns a new port to it. After a restart, the service needs to be updated (<code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">cf update-user-provided-service<\/code>) and its consumers need to rebind it and restage (yeah, that\u2019s lame).<\/li>\n<li style=\"margin-bottom: 6px;\">A user-provided service instance exists only inside the space it was created in.<\/li>\n<li style=\"margin-bottom: 6px;\">There is currently no way to get a user-provided service instance with tags. Therefore, your application needs to search for the service by name. This results in some constraints related to binding multiple instances of the same service to multiple instances of a single application.<\/li>\n<li>Containers that require persistent data is one of the anti-goals of the Diego team. Therefore, this approach is not suitable for databases and other services that are used for persistent data storage.<\/li>\n<\/ul>\n<p>We\u2019ve modified a popular <code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">cf-redis-example-app<\/code> from Pivotal to work with the user-provided Redis instance. You can get it from <a href=\"https:\/\/github.com\/Altoros\/cf-redis-example-app\" target=blank rel=\"noopener noreferrer\">this GitHub repo<\/a>. Note that if you want to push the app to the Diego back end, the external network access has to be <a href=\"https:\/\/github.com\/cloudfoundry\/garden\/blob\/master\/doc\/garden-api.md#allow-a-container-to-access-external-networks-and-ports\" target=blank rel=\"noopener noreferrer\">explicitly enabled<\/a> to consume the Redis service.<\/p>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Summing_it_up_for_Ops_and_Devs\"><\/span>Summing it up (for Ops and Devs)<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>To conclude, below is what the above-described process looks like from an operator\u2019s and developer\u2019s perspectives.<\/p>\n<p>The operator&#8217;s way:<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\ncf docker-push redis altoros\/redis\r\ncf app redis --guid  # we\u2019ll use this in the next command\r\ncurl http:\/\/receptor.&lt;CF_DOMAIN&gt;\/v1\/actual_lrps\/  # search for the host and port\r\ncf cups redis -p \u2018{\u201chost\u201d:\u201d&lt;HOST&gt;\u201d,\u201dport\u201d:\u201d&lt;PORT&gt;\u201d,\u201ddb\u201d:\u201d0\u201d}\u2019\r\n\r\n# create a security group to allow the incoming tcp traffic\r\n<\/pre>\n<p>The developer&#8217;s way:<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\ngit clone https:\/\/github.com\/Altoros\/cf-redis-example-app.git\r\ncd cf-redis-example-app\r\ncf push\r\ncf bind-service redis-example-app redis\r\ncf restage redis-example-app\r\n# try it:\r\ncurl -X PUT -d \u201cdata=value\u201d &lt;APP_ROUTE&gt;\/testkey\r\n<\/pre>\n<p>The service developer&#8217;s way:<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\ngit clone https:\/\/github.com\/Altoros\/redis.git\r\ncd redis\/3.0\r\n# do some modifications\r\ndocker build -t altoros\/redis .\r\ndocker run altoros\/redis  # local debugging\r\ndocker push altoros\/redis\r\ncf restage redis\r\n<\/pre>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Future_plans_for_Diego_Docker_and_Lattice\"><\/span>Future plans for Diego, Docker, and Lattice<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Diego is currently in active development. Docker support is being improved, as well. Soon, it will be possible to <a href=\"https:\/\/www.pivotaltracker.com\/n\/projects\/1158420\/stories\/91955652\" target=blank rel=\"noopener noreferrer\">run processes as an arbitrary user<\/a>.<\/p>\n<p>As we talk about Diego and Docker, we can\u2019t simply skip <a href=\"http:\/\/lattice.cf\/\" target=blank rel=\"noopener noreferrer\">Lattice<\/a>\u2014a project that is now a better friend of Docker than Cloud Foundry Diego. Lattice is a platform that offers a cluster scheduler, HTTP load balancing, log aggregation, and health management for containerized workloads. Its container runtime is based on Diego, but some additional steps have been made towards Docker support. In the documentation, there are <a href=\"http:\/\/lattice.cf\/docs\/docker-image-examples\/\" target=blank rel=\"noopener noreferrer\">numerous examples<\/a> of official Docker images that can be run on Lattice. In addition, Lattice can be configured to communicate with a <a href=\"http:\/\/lattice.cf\/docs\/private-docker-registry\/\" target=blank rel=\"noopener noreferrer\">private Docker registry<\/a>.<\/p>\n<p>For more details about the future of Diego and Docker, read <a href=\"https:\/\/docs.google.com\/document\/d\/12akzXK4yYU1Jf3YKIf3heDT5taN8qEHMGICJ8SAQxQw\/edit#\" target=blank rel=\"noopener noreferrer\">the Google doc<\/a> shared by the Diego development team.<\/p>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Further_reading\"><\/span>Further reading<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul>\n<li><a href=\"https:\/\/www.altoros.com\/blog\/cloud-foundry-garden-back-ends-container-security-and-debugging-oss-cf\/\">Cloud Foundry\u2019s Garden: Back Ends, Container Security, and Debugging<\/a><\/li>\n<li><a href=\"https:\/\/www.altoros.com\/blog\/enabling-persistent-storage-for-docker-and-kubernetes-on-oracle-cloud\/\">Enabling Persistent Storage for Docker and Kubernetes on Oracle Cloud<\/a><\/li>\n<li><a href=\"https:\/\/www.altoros.com\/blog\/how-to-push-private-docker-images-and-enable-caching-on-cloud-foundry-diego\/\">How to Push Private Docker Images and Enable Caching on Cloud Foundry Diego<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Support for Docker is one of the main advantages of Cloud Foundry Diego, but how far does this compatibility go? Is it possible to push an arbitrary image from the Docker Hub to Diego and, if not, what are the constraints? What&#8217;s going to change in the future? Finally, why [&#8230;]<\/p>\n","protected":false},"author":75,"featured_media":45969,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"content-type":"","footnotes":"","_links_to":"","_links_to_target":""},"categories":[7],"tags":[873,570,206],"class_list":["post-45960","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-news-and-opinion","tag-cloud-native","tag-containers","tag-oss-cloud-foundry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.6 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Are Diego and Docker Really Good Friends? | Altoros<\/title>\n<meta name=\"description\" content=\"Find out how to customize and push the official Redis image, as well as turn it into a simple service to be consumed by other apps.\" \/>\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.altoros.com\/blog\/are-diego-and-docker-really-good-friends\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Are Diego and Docker Really Good Friends? | Altoros\" \/>\n<meta property=\"og:description\" content=\"Support for Docker is one of the main advantages of Cloud Foundry Diego, but how far does this compatibility go? Is it possible to push an arbitrary image from the Docker Hub to Diego and, if not, what are the constraints? What&#8217;s going to change in the future? Finally, why [...]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.altoros.com\/blog\/are-diego-and-docker-really-good-friends\/\" \/>\n<meta property=\"og:site_name\" content=\"Altoros\" \/>\n<meta property=\"article:published_time\" content=\"2015-05-28T16:10:09+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2019-08-12T13:37:05+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2015\/05\/cloud-foundry-docker-diego-comparsion.png\" \/>\n\t<meta property=\"og:image:width\" content=\"640\" \/>\n\t<meta property=\"og:image:height\" content=\"360\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Lev Berman\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Lev Berman\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.altoros.com\/blog\/are-diego-and-docker-really-good-friends\/\",\"url\":\"https:\/\/www.altoros.com\/blog\/are-diego-and-docker-really-good-friends\/\",\"name\":\"Are Diego and Docker Really Good Friends? | Altoros\",\"isPartOf\":{\"@id\":\"https:\/\/www.altoros.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.altoros.com\/blog\/are-diego-and-docker-really-good-friends\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.altoros.com\/blog\/are-diego-and-docker-really-good-friends\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2015\/05\/cloud-foundry-docker-diego-comparsion.png\",\"datePublished\":\"2015-05-28T16:10:09+00:00\",\"dateModified\":\"2019-08-12T13:37:05+00:00\",\"author\":{\"@id\":\"https:\/\/www.altoros.com\/blog\/#\/schema\/person\/297aed86d00f60f2bc94d8994f454a8c\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.altoros.com\/blog\/are-diego-and-docker-really-good-friends\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.altoros.com\/blog\/are-diego-and-docker-really-good-friends\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.altoros.com\/blog\/are-diego-and-docker-really-good-friends\/#primaryimage\",\"url\":\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2015\/05\/cloud-foundry-docker-diego-comparsion.png\",\"contentUrl\":\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2015\/05\/cloud-foundry-docker-diego-comparsion.png\",\"width\":640,\"height\":360},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.altoros.com\/blog\/are-diego-and-docker-really-good-friends\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.altoros.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Are Diego and Docker Really Good Friends?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.altoros.com\/blog\/#website\",\"url\":\"https:\/\/www.altoros.com\/blog\/\",\"name\":\"Altoros\",\"description\":\"Insight\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.altoros.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.altoros.com\/blog\/#\/schema\/person\/297aed86d00f60f2bc94d8994f454a8c\",\"name\":\"Lev Berman\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.altoros.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2016\/12\/Lev-Berman-150x150.png\",\"contentUrl\":\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2016\/12\/Lev-Berman-150x150.png\",\"caption\":\"Lev Berman\"},\"description\":\"Lev Berman is a Go developer and Cloud Foundry engineer at Altoros. He has 3+ years of experience in software development, including building cloud-native applications. Working both as a developer and DevOps engineer, Lev currently focuses on BOSH, Cloud Foundry\/Diego, and containerization technologies, such as Docker. He also holds an MS degree from the Moscow Institute of Physics and Technology.\\u2028\\u2028\",\"url\":\"https:\/\/www.altoros.com\/blog\/author\/lev-berman\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Are Diego and Docker Really Good Friends? | Altoros","description":"Find out how to customize and push the official Redis image, as well as turn it into a simple service to be consumed by other apps.","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.altoros.com\/blog\/are-diego-and-docker-really-good-friends\/","og_locale":"en_US","og_type":"article","og_title":"Are Diego and Docker Really Good Friends? | Altoros","og_description":"Support for Docker is one of the main advantages of Cloud Foundry Diego, but how far does this compatibility go? Is it possible to push an arbitrary image from the Docker Hub to Diego and, if not, what are the constraints? What&#8217;s going to change in the future? Finally, why [...]","og_url":"https:\/\/www.altoros.com\/blog\/are-diego-and-docker-really-good-friends\/","og_site_name":"Altoros","article_published_time":"2015-05-28T16:10:09+00:00","article_modified_time":"2019-08-12T13:37:05+00:00","og_image":[{"width":640,"height":360,"url":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2015\/05\/cloud-foundry-docker-diego-comparsion.png","type":"image\/png"}],"author":"Lev Berman","twitter_misc":{"Written by":"Lev Berman","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.altoros.com\/blog\/are-diego-and-docker-really-good-friends\/","url":"https:\/\/www.altoros.com\/blog\/are-diego-and-docker-really-good-friends\/","name":"Are Diego and Docker Really Good Friends? | Altoros","isPartOf":{"@id":"https:\/\/www.altoros.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.altoros.com\/blog\/are-diego-and-docker-really-good-friends\/#primaryimage"},"image":{"@id":"https:\/\/www.altoros.com\/blog\/are-diego-and-docker-really-good-friends\/#primaryimage"},"thumbnailUrl":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2015\/05\/cloud-foundry-docker-diego-comparsion.png","datePublished":"2015-05-28T16:10:09+00:00","dateModified":"2019-08-12T13:37:05+00:00","author":{"@id":"https:\/\/www.altoros.com\/blog\/#\/schema\/person\/297aed86d00f60f2bc94d8994f454a8c"},"breadcrumb":{"@id":"https:\/\/www.altoros.com\/blog\/are-diego-and-docker-really-good-friends\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.altoros.com\/blog\/are-diego-and-docker-really-good-friends\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.altoros.com\/blog\/are-diego-and-docker-really-good-friends\/#primaryimage","url":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2015\/05\/cloud-foundry-docker-diego-comparsion.png","contentUrl":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2015\/05\/cloud-foundry-docker-diego-comparsion.png","width":640,"height":360},{"@type":"BreadcrumbList","@id":"https:\/\/www.altoros.com\/blog\/are-diego-and-docker-really-good-friends\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.altoros.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Are Diego and Docker Really Good Friends?"}]},{"@type":"WebSite","@id":"https:\/\/www.altoros.com\/blog\/#website","url":"https:\/\/www.altoros.com\/blog\/","name":"Altoros","description":"Insight","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.altoros.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.altoros.com\/blog\/#\/schema\/person\/297aed86d00f60f2bc94d8994f454a8c","name":"Lev Berman","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.altoros.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2016\/12\/Lev-Berman-150x150.png","contentUrl":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2016\/12\/Lev-Berman-150x150.png","caption":"Lev Berman"},"description":"Lev Berman is a Go developer and Cloud Foundry engineer at Altoros. He has 3+ years of experience in software development, including building cloud-native applications. Working both as a developer and DevOps engineer, Lev currently focuses on BOSH, Cloud Foundry\/Diego, and containerization technologies, such as Docker. He also holds an MS degree from the Moscow Institute of Physics and Technology.\u2028\u2028","url":"https:\/\/www.altoros.com\/blog\/author\/lev-berman\/"}]}},"_links":{"self":[{"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/posts\/45960","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/users\/75"}],"replies":[{"embeddable":true,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/comments?post=45960"}],"version-history":[{"count":7,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/posts\/45960\/revisions"}],"predecessor-version":[{"id":45971,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/posts\/45960\/revisions\/45971"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/media\/45969"}],"wp:attachment":[{"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/media?parent=45960"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/categories?post=45960"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/tags?post=45960"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}