{"id":17874,"date":"2017-07-17T14:33:51","date_gmt":"2017-07-17T11:33:51","guid":{"rendered":"http:\/\/www.webcodegeeks.com\/?p=17874"},"modified":"2017-07-26T09:44:30","modified_gmt":"2017-07-26T06:44:30","slug":"developers-guide-docker-gentle-introduction","status":"publish","type":"post","link":"https:\/\/www.webcodegeeks.com\/devops\/developers-guide-docker-gentle-introduction\/","title":{"rendered":"A Developer&#8217;s Guide To Docker &#8211; A Gentle Introduction"},"content":{"rendered":"<p><span style=\"font-size: 20px;\">Check out the Okta user management API and never build auth again! Get started in minutes with a free developer account. <a href=\"https:\/\/developer.okta.com\/signup\/?utm_campaign=Syndication&gt;Global&gt;develop-microservices-jhipster-FY18Q2&#038;utm_medium=post&#038;utm_source=java-code-geeks-all-developer\">Register Today!<\/a><\/span><\/p>\n<p><em>It works on my machine.<\/em>\u00a0We\u2019ve all heard it. Most of us have said it. It\u2019s been impossible to get around it\u2026 until now. Not only can adding Docker to your development environment solve that issue, but it can make it drop-dead simple to onboard new developers, keep a team working forward and allow everyone on the team use their desired tools!<\/p>\n<h2>Why Containers?<\/h2>\n<p>\u201cAren\u2019t containers just lightweight Virtual Machines?\u201d<\/p>\n<p>That\u2019s the question I get most often when I start talking to folks about containers. If it helps, you can think of them that way; but containers bring a lot more to the game than just a lightweight VM.<\/p>\n<h2>Before Containerization with Docker<\/h2>\n<p>It used to be, that if you wanted to host an application on your corporate network, it would take\u00a0<em>weeks<\/em>. The operations team would have to make a request for the hardware, it would have to be approved, the finance department would have to make a purchase order, the ops team would have to order the hardware and when it got in, they\u2019d have to put it in the server rack, get it on the network, install the operating system, and any other software needed to run your application. Of course, when ops people order servers, they don\u2019t order the Intel Celeron processor and 512Mb of RAM; they get the 24, quad-core Xeon processor server with 15 bajillion gigabytes of RAM. This means that once your app is installed, the server runs at about 3% utilization. Not ideal from a CapEx and OpEx cost standpoint.<\/p>\n<h2>Enter the Virtual Machine<\/h2>\n<p>Virtual Machines helped with some of the utilization issues. You could use that monster server to host several VMs and get the utilization much closer to 80 or 90 percent. But you still had to install operating systems, software dependencies and make sure each gets patched with updates. This means logging into each virtual machine and updating and securing each. So if you have a farm of 20 VMs, that\u2019s 20 times of logging in, loading patches, securing, etc. Some automation tools have made this process less labor-intensive, but it\u2019s still not ideal. You\u2019d also have to decide at design time how much resources to set aside for the virtual machine. Those resources are then lost by the host machine while the virtual machine is running.<\/p>\n<h2>Containers to the Rescue<\/h2>\n<p>Containers take the idea of the virtual machine one step farther. Instead of setting up a virtual machine and setting aside resources for it, you could let a container run like an application. It takes only as much resources as it needs to do it\u2019s job. You can limit the amount of resources it can access, but when it\u2019s doing nothing, it takes up almost no resources. When a virtual machine is doing nothing, it is still running a full-blown OS, and all the software that your application needs are still taking up resources.<\/p>\n<p>Containers share the host operating system\u2019s kernel. They run just like applications. They are given user space, but the underlying processes needed to run the application are owned by the host machine. This make them not only lightweight, but less resource intensive than VMs, because VMs need resources just to run the operating system and base processes. Having their own user space means that they are secured away from the host operating system, but they share kernel processes.<\/p>\n<p>I am not a network or operations guy, I am just a developer. So it helps for me to think of containers as just applications, that think they\u2019re full machines.<\/p>\n<p>Assuming you have\u00a0<a href=\"https:\/\/docs.docker.com\/engine\/installation\/\">Docker installed<\/a>, let\u2019s dive in.<\/p>\n<h2>Some Technical Terminology<\/h2>\n<p>To get started, it\u2019s important to get your head around two main terms: Images and Containers. Images are saved containers that you can then turn around and use to make other containers. If you\u2019ve done any object-oriented development, you know that a class is a blueprint for creating an object. Images are like blueprints for creating containers.<\/p>\n<h2>Listing and Getting Images<\/h2>\n<p>To list the images you have downloaded to your host machine, run a simple command:<\/p>\n<pre class=\"gutter: false;brush:bash\">docker image list<\/pre>\n<p><a href=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/07\/1-1.png\"><img decoding=\"async\" class=\"aligncenter wp-image-17875\" style=\"border: none;\" src=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/07\/1-1.png\" alt=\"\" width=\"860\" height=\"156\" srcset=\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/07\/1-1.png 1776w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/07\/1-1-300x54.png 300w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/07\/1-1-768x139.png 768w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/07\/1-1-1024x186.png 1024w\" sizes=\"(max-width: 860px) 100vw, 860px\" \/><\/a><br \/>\nYou should see some headers, but nothing in the listing (unless you have pulled some container images before). I have a few images already on my machine.<\/p>\n<p>To pull the latest version of the\u00a0<a href=\"https:\/\/www.nginx.com\/\">NGINX<\/a>\u00a0image from\u00a0<a href=\"https:\/\/hub.docker.com\/\">Docker Hub<\/a>, run the command:<\/p>\n<pre class=\"gutter: false;brush:bash\">docker pull nginx:latest<\/pre>\n<p><a href=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/07\/1-2.png\"><img decoding=\"async\" class=\"aligncenter wp-image-17876\" style=\"border: none;\" src=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/07\/1-2.png\" alt=\"\" width=\"860\" height=\"171\" srcset=\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/07\/1-2.png 1254w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/07\/1-2-300x60.png 300w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/07\/1-2-768x153.png 768w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/07\/1-2-1024x204.png 1024w\" sizes=\"(max-width: 860px) 100vw, 860px\" \/><\/a><\/p>\n<p>You can leave off the\u00a0<code class=\"highlighter-rouge\" style=\"font-size: 13px;\">:latest<\/code>\u00a0and Docker will pull the image tagged with latest, but we\u2019ll be explicit here. Just remember that\u00a0<code class=\"highlighter-rouge\" style=\"font-size: 13px;\">:latest<\/code>\u00a0changes every time the owner of that image uploads a new version. So it\u2019s not a good idea to use latest in production. Generally, the latest image will also have another tag (1.13.0 at the time of this article) that is much better to use for production. It will still be the same image, even if NGINX uploads a new version of the image tomorrow.<\/p>\n<h2>Running Containers<\/h2>\n<p>You can now run a container based on the\u00a0<code class=\"highlighter-rouge\" style=\"font-size: 13px;\">nginx:latest<\/code>\u00a0image by running:<\/p>\n<pre class=\"gutter: false;brush:bash\">docker run -it nginx:latest \/bin\/bash<\/pre>\n<p><a href=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/07\/1-3.png\"><img decoding=\"async\" class=\"aligncenter wp-image-17877\" style=\"border: none;\" src=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/07\/1-3.png\" alt=\"\" width=\"860\" height=\"103\" srcset=\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/07\/1-3.png 1064w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/07\/1-3-300x36.png 300w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/07\/1-3-768x92.png 768w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/07\/1-3-1024x123.png 1024w\" sizes=\"(max-width: 860px) 100vw, 860px\" \/><\/a><\/p>\n<p>This tells Docker that we want to run a container based on the\u00a0<code class=\"highlighter-rouge\" style=\"font-size: 13px;\">nginx:latest<\/code>\u00a0image, that we want it to be interactive (<code class=\"highlighter-rouge\" style=\"font-size: 13px;\">-i<\/code>), that we want a pseudo tty shell (<code class=\"highlighter-rouge\" style=\"font-size: 13px;\">-t<\/code>), and finally, we want the main command for this container to be\u00a0<code class=\"highlighter-rouge\" style=\"font-size: 13px;\">\/bin\/bash<\/code>. This runs the\u00a0<code class=\"highlighter-rouge\" style=\"font-size: 13px;\">\/bin\/bash<\/code>\u00a0command at process ID 1 in the container. This means, when the bash shell in the container exits, the container will stop.<\/p>\n<p>You should be dropped into a shell for the nginx container. We can open a new terminal while that one is running and see it from the host by typing:<\/p>\n<pre class=\"gutter: false;brush:bash\">docker container list<\/pre>\n<p>this should give is a listing like:<\/p>\n<p><a href=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/07\/1-4.png\"><img decoding=\"async\" class=\"aligncenter wp-image-17878\" style=\"border: none;\" src=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/07\/1-4.png\" alt=\"\" width=\"860\" height=\"56\" srcset=\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/07\/1-4.png 2880w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/07\/1-4-300x20.png 300w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/07\/1-4-768x50.png 768w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/07\/1-4-1024x67.png 1024w\" sizes=\"(max-width: 860px) 100vw, 860px\" \/><\/a><\/p>\n<p>You can see the container\u2019s ID is: 511b121137ac and at the command line inside the container, I am logged in as\u00a0<code class=\"highlighter-rouge\" style=\"font-size: 13px;\">root@511b121137ac<\/code>. You can also see the command is\u00a0<code class=\"highlighter-rouge\" style=\"font-size: 13px;\">\/bin\/bash<\/code>\u00a0that is running at PID 1 in the container and the container name is\u00a0<code class=\"highlighter-rouge\" style=\"font-size: 13px;\">determined_banach<\/code>\u00a0(it will be different for you). If you don\u2019t specify a name for the container, Docker will make one from a list of adjectives and famous computer scientist last names (think\u00a0<code class=\"highlighter-rouge\" style=\"font-size: 13px;\">hungry_babbage<\/code>\u00a0or\u00a0<code class=\"highlighter-rouge\" style=\"font-size: 13px;\">slippery_bohr<\/code>).<\/p>\n<p>Now, if you type\u00a0<code class=\"highlighter-rouge\" style=\"font-size: 13px;\">exit<\/code>\u00a0at the command line inside the container, we\u2019ll be dropped back into the host machine\u2019s command line. If we go to our other terminal (where we listed running containers) and re-run the\u00a0<code class=\"highlighter-rouge\" style=\"font-size: 13px;\">docker container list<\/code>\u00a0command, we\u2019ll see an empty list.<\/p>\n<p>But what if you want to see\u00a0<strong>all<\/strong>\u00a0the containers whether they\u2019re running or not? You can run the\u00a0<code class=\"highlighter-rouge\" style=\"font-size: 13px;\">docker container list<\/code>\u00a0command with the\u00a0<code class=\"highlighter-rouge\" style=\"font-size: 13px;\">-a<\/code>\u00a0switch (for all).<\/p>\n<pre class=\"gutter: false;brush:bash\">docker container list -a<\/pre>\n<p><a href=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/07\/1-5.png\"><img decoding=\"async\" class=\"aligncenter wp-image-17879\" style=\"border: none;\" src=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/07\/1-5.png\" alt=\"\" width=\"860\" height=\"108\" srcset=\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/07\/1-5.png 1776w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/07\/1-5-300x38.png 300w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/07\/1-5-768x96.png 768w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/07\/1-5-1024x128.png 1024w\" sizes=\"(max-width: 860px) 100vw, 860px\" \/><\/a><\/p>\n<p>As you can see the nginx-based container is now stopped and it exited with a code \u20180\u2019, meaning it exited normally.<\/p>\n<h2>Cleaning Up Your Docker Environment<\/h2>\n<p>Just because the container isn\u2019t running, doesn\u2019t mean it\u2019s gone. It\u2019s still there in a stopped state. If you want to actually delete a container from your host machine you use the\u00a0<code class=\"highlighter-rouge\" style=\"font-size: 13px;\">rm<\/code>\u00a0command like so:<\/p>\n<pre class=\"gutter: false;brush:bash\">docker rm determined_banach<\/pre>\n<p>You could also use the\u00a0<code class=\"highlighter-rouge\" style=\"font-size: 13px;\">Container ID<\/code>\u00a0to remove a container, but you actually only have to give it as much of the ID as you need to make it unique in the list of containers. So if there are three containers on the host that all start with\u00a0<code class=\"highlighter-rouge\" style=\"font-size: 13px;\">41...<\/code>\u00a0you would just have to type the first three characters of the\u00a0<code class=\"highlighter-rouge\" style=\"font-size: 13px;\">Container ID<\/code>\u00a0(<code class=\"highlighter-rouge\" style=\"font-size: 13px;\">416<\/code>\u00a0for example) to remove it.<\/p>\n<p>If you decide you don\u2019t want to build any more containers from a particular image, you can remove it with the\u00a0<code class=\"highlighter-rouge\" style=\"font-size: 13px;\">rmi<\/code>\u00a0command.<\/p>\n<pre class=\"gutter: false;brush:bash\">docker rmi nginx:latest<\/pre>\n<p>You don\u2019t have to specify\u00a0<code class=\"highlighter-rouge\" style=\"font-size: 13px;\">:latest<\/code>\u00a0for the image tag, Docker will assume you\u2019re referring to\u00a0<code class=\"highlighter-rouge\" style=\"font-size: 13px;\">:latest<\/code>\u00a0if you don\u2019t specify, but it\u2019s good practice to always use a tagged image. In a production scenario, it\u2019s important to\u00a0<strong>not<\/strong>\u00a0use\u00a0<code class=\"highlighter-rouge\" style=\"font-size: 13px;\">:latest<\/code>, as the\u00a0<code class=\"highlighter-rouge\" style=\"font-size: 13px;\">:latest<\/code>\u00a0image is updated whenever a new version of the image is pushed to the repository. So the image you get with the\u00a0<code class=\"highlighter-rouge\" style=\"font-size: 13px;\">:latest<\/code>\u00a0tag today maybe\u00a0<strong>very<\/strong>\u00a0different from the one you got yesterday.<\/p>\n<h2>More Containers to Come!<\/h2>\n<p>Keep an eye out for future posts about Docker where we\u2019ll look at creating images and containers from a\u00a0<code class=\"highlighter-rouge\" style=\"font-size: 13px;\">Dockerfile<\/code>\u00a0and how to coordinate an environment of containers (API, database and UI) with Docker-Compose.<\/p>\n<p><span style=\"font-size: 20px;\">Check out the Okta user management API and never build auth again! Get started in minutes with a free developer account. <a href=\"https:\/\/developer.okta.com\/signup\/?utm_campaign=Syndication&gt;Global&gt;develop-microservices-jhipster-FY18Q2&#038;utm_medium=post&#038;utm_source=java-code-geeks-all-developer\">Register Today!<\/a><\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Check out the Okta user management API and never build auth again! Get started in minutes with a free developer account. Register Today! It works on my machine.\u00a0We\u2019ve all heard it. Most of us have said it. It\u2019s been impossible to get around it\u2026 until now. Not only can adding Docker to your development environment &hellip;<\/p>\n","protected":false},"author":541,"featured_media":10356,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[17],"tags":[217],"class_list":["post-17874","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-devops","tag-docker"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>A Developer&#039;s Guide To Docker - A Gentle Introduction - Web Code Geeks - 2026<\/title>\n<meta name=\"description\" content=\"Check out the Okta user management API and never build auth again! Get started in minutes with a free developer account. Register Today! It works on my\" \/>\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.webcodegeeks.com\/devops\/developers-guide-docker-gentle-introduction\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"A Developer&#039;s Guide To Docker - A Gentle Introduction - Web Code Geeks - 2026\" \/>\n<meta property=\"og:description\" content=\"Check out the Okta user management API and never build auth again! Get started in minutes with a free developer account. Register Today! It works on my\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.webcodegeeks.com\/devops\/developers-guide-docker-gentle-introduction\/\" \/>\n<meta property=\"og:site_name\" content=\"Web Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/webcodegeeks\" \/>\n<meta property=\"article:published_time\" content=\"2017-07-17T11:33:51+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2017-07-26T06:44:30+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2016\/01\/docker-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Lee Brandt\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@webcodegeeks\" \/>\n<meta name=\"twitter:site\" content=\"@webcodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Lee Brandt\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.webcodegeeks.com\/devops\/developers-guide-docker-gentle-introduction\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/devops\/developers-guide-docker-gentle-introduction\/\"},\"author\":{\"name\":\"Lee Brandt\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/0a47d634e01fc625cddc0692bad456b8\"},\"headline\":\"A Developer&#8217;s Guide To Docker &#8211; A Gentle Introduction\",\"datePublished\":\"2017-07-17T11:33:51+00:00\",\"dateModified\":\"2017-07-26T06:44:30+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/devops\/developers-guide-docker-gentle-introduction\/\"},\"wordCount\":1405,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/devops\/developers-guide-docker-gentle-introduction\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2016\/01\/docker-logo.jpg\",\"keywords\":[\"Docker\"],\"articleSection\":[\"DevOps\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.webcodegeeks.com\/devops\/developers-guide-docker-gentle-introduction\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.webcodegeeks.com\/devops\/developers-guide-docker-gentle-introduction\/\",\"url\":\"https:\/\/www.webcodegeeks.com\/devops\/developers-guide-docker-gentle-introduction\/\",\"name\":\"A Developer's Guide To Docker - A Gentle Introduction - Web Code Geeks - 2026\",\"isPartOf\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/devops\/developers-guide-docker-gentle-introduction\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/devops\/developers-guide-docker-gentle-introduction\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2016\/01\/docker-logo.jpg\",\"datePublished\":\"2017-07-17T11:33:51+00:00\",\"dateModified\":\"2017-07-26T06:44:30+00:00\",\"description\":\"Check out the Okta user management API and never build auth again! Get started in minutes with a free developer account. Register Today! It works on my\",\"breadcrumb\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/devops\/developers-guide-docker-gentle-introduction\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.webcodegeeks.com\/devops\/developers-guide-docker-gentle-introduction\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/devops\/developers-guide-docker-gentle-introduction\/#primaryimage\",\"url\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2016\/01\/docker-logo.jpg\",\"contentUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2016\/01\/docker-logo.jpg\",\"width\":150,\"height\":150},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.webcodegeeks.com\/devops\/developers-guide-docker-gentle-introduction\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.webcodegeeks.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"DevOps\",\"item\":\"https:\/\/www.webcodegeeks.com\/category\/devops\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"A Developer&#8217;s Guide To Docker &#8211; A Gentle Introduction\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#website\",\"url\":\"https:\/\/www.webcodegeeks.com\/\",\"name\":\"Web Code Geeks\",\"description\":\"Web Developers Resource Center\",\"publisher\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.webcodegeeks.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\/\/www.webcodegeeks.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png\",\"contentUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/webcodegeeks\",\"https:\/\/x.com\/webcodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/0a47d634e01fc625cddc0692bad456b8\",\"name\":\"Lee Brandt\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/e199ea33ed5e64e515b5d1fe420c95be682de0f179907731c2019be84467fc71?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/e199ea33ed5e64e515b5d1fe420c95be682de0f179907731c2019be84467fc71?s=96&d=mm&r=g\",\"caption\":\"Lee Brandt\"},\"sameAs\":[\"http:\/\/developer.okta.com\"],\"url\":\"https:\/\/www.webcodegeeks.com\/author\/lee-brandt\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"A Developer's Guide To Docker - A Gentle Introduction - Web Code Geeks - 2026","description":"Check out the Okta user management API and never build auth again! Get started in minutes with a free developer account. Register Today! It works on my","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.webcodegeeks.com\/devops\/developers-guide-docker-gentle-introduction\/","og_locale":"en_US","og_type":"article","og_title":"A Developer's Guide To Docker - A Gentle Introduction - Web Code Geeks - 2026","og_description":"Check out the Okta user management API and never build auth again! Get started in minutes with a free developer account. Register Today! It works on my","og_url":"https:\/\/www.webcodegeeks.com\/devops\/developers-guide-docker-gentle-introduction\/","og_site_name":"Web Code Geeks","article_publisher":"https:\/\/www.facebook.com\/webcodegeeks","article_published_time":"2017-07-17T11:33:51+00:00","article_modified_time":"2017-07-26T06:44:30+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2016\/01\/docker-logo.jpg","type":"image\/jpeg"}],"author":"Lee Brandt","twitter_card":"summary_large_image","twitter_creator":"@webcodegeeks","twitter_site":"@webcodegeeks","twitter_misc":{"Written by":"Lee Brandt","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.webcodegeeks.com\/devops\/developers-guide-docker-gentle-introduction\/#article","isPartOf":{"@id":"https:\/\/www.webcodegeeks.com\/devops\/developers-guide-docker-gentle-introduction\/"},"author":{"name":"Lee Brandt","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/0a47d634e01fc625cddc0692bad456b8"},"headline":"A Developer&#8217;s Guide To Docker &#8211; A Gentle Introduction","datePublished":"2017-07-17T11:33:51+00:00","dateModified":"2017-07-26T06:44:30+00:00","mainEntityOfPage":{"@id":"https:\/\/www.webcodegeeks.com\/devops\/developers-guide-docker-gentle-introduction\/"},"wordCount":1405,"commentCount":0,"publisher":{"@id":"https:\/\/www.webcodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.webcodegeeks.com\/devops\/developers-guide-docker-gentle-introduction\/#primaryimage"},"thumbnailUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2016\/01\/docker-logo.jpg","keywords":["Docker"],"articleSection":["DevOps"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.webcodegeeks.com\/devops\/developers-guide-docker-gentle-introduction\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.webcodegeeks.com\/devops\/developers-guide-docker-gentle-introduction\/","url":"https:\/\/www.webcodegeeks.com\/devops\/developers-guide-docker-gentle-introduction\/","name":"A Developer's Guide To Docker - A Gentle Introduction - Web Code Geeks - 2026","isPartOf":{"@id":"https:\/\/www.webcodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.webcodegeeks.com\/devops\/developers-guide-docker-gentle-introduction\/#primaryimage"},"image":{"@id":"https:\/\/www.webcodegeeks.com\/devops\/developers-guide-docker-gentle-introduction\/#primaryimage"},"thumbnailUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2016\/01\/docker-logo.jpg","datePublished":"2017-07-17T11:33:51+00:00","dateModified":"2017-07-26T06:44:30+00:00","description":"Check out the Okta user management API and never build auth again! Get started in minutes with a free developer account. Register Today! It works on my","breadcrumb":{"@id":"https:\/\/www.webcodegeeks.com\/devops\/developers-guide-docker-gentle-introduction\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.webcodegeeks.com\/devops\/developers-guide-docker-gentle-introduction\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/devops\/developers-guide-docker-gentle-introduction\/#primaryimage","url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2016\/01\/docker-logo.jpg","contentUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2016\/01\/docker-logo.jpg","width":150,"height":150},{"@type":"BreadcrumbList","@id":"https:\/\/www.webcodegeeks.com\/devops\/developers-guide-docker-gentle-introduction\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.webcodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"DevOps","item":"https:\/\/www.webcodegeeks.com\/category\/devops\/"},{"@type":"ListItem","position":3,"name":"A Developer&#8217;s Guide To Docker &#8211; A Gentle Introduction"}]},{"@type":"WebSite","@id":"https:\/\/www.webcodegeeks.com\/#website","url":"https:\/\/www.webcodegeeks.com\/","name":"Web Code Geeks","description":"Web Developers Resource Center","publisher":{"@id":"https:\/\/www.webcodegeeks.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.webcodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.webcodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.webcodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/webcodegeeks","https:\/\/x.com\/webcodegeeks"]},{"@type":"Person","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/0a47d634e01fc625cddc0692bad456b8","name":"Lee Brandt","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/e199ea33ed5e64e515b5d1fe420c95be682de0f179907731c2019be84467fc71?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/e199ea33ed5e64e515b5d1fe420c95be682de0f179907731c2019be84467fc71?s=96&d=mm&r=g","caption":"Lee Brandt"},"sameAs":["http:\/\/developer.okta.com"],"url":"https:\/\/www.webcodegeeks.com\/author\/lee-brandt\/"}]}},"_links":{"self":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts\/17874","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/users\/541"}],"replies":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/comments?post=17874"}],"version-history":[{"count":0,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts\/17874\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/media\/10356"}],"wp:attachment":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/media?parent=17874"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/categories?post=17874"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/tags?post=17874"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}