{"id":5466,"date":"2025-07-01T10:58:18","date_gmt":"2025-07-01T10:58:18","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=5466"},"modified":"2025-07-12T05:38:38","modified_gmt":"2025-07-12T05:38:38","slug":"dockerfile-lab-exercise-1","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/dockerfile-lab-exercise-1\/","title":{"rendered":"Docker Lab &amp; Assignment &#8211; Creating an Image"},"content":{"rendered":"\n<p>Here\u2019s a detailed <strong>Tutorial and Lab Guide<\/strong> for the listed Docker commands, focused on practical usage, explanations, and <strong>step-by-step labs<\/strong> with Ubuntu + git + apache2 as the image base. The guide is split into two labs as you requested, plus explanations and examples for every command.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Docker Image and Image Management: Tutorial &amp; Lab Guide<\/h1>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Table of Contents<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><a href=\"https:\/\/chatgpt.com\/c\/6863bef7-6708-8010-8de2-735ca7c131f6#introduction\" target=\"_blank\" rel=\"noopener\">Introduction<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/chatgpt.com\/c\/6863bef7-6708-8010-8de2-735ca7c131f6#lab1\" target=\"_blank\" rel=\"noopener\">Lab 1: Creating Docker Images Using a Container (commit\/export\/import)<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/chatgpt.com\/c\/6863bef7-6708-8010-8de2-735ca7c131f6#lab2\" target=\"_blank\" rel=\"noopener\">Lab 2: Creating Docker Images Using a Dockerfile (build)<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/chatgpt.com\/c\/6863bef7-6708-8010-8de2-735ca7c131f6#management\" target=\"_blank\" rel=\"noopener\">Image Management Commands: Tutorial &amp; Examples<\/a>\n<ul class=\"wp-block-list\">\n<li>images<\/li>\n\n\n\n<li>history<\/li>\n\n\n\n<li>inspect<\/li>\n\n\n\n<li>rmi<\/li>\n\n\n\n<li>tag<\/li>\n\n\n\n<li>export<\/li>\n\n\n\n<li>import<\/li>\n\n\n\n<li>save<\/li>\n\n\n\n<li>load<\/li>\n\n\n\n<li>commit<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Introduction<\/h2>\n\n\n\n<p>Docker images are the blueprint for containers, holding everything needed to run an application\u2014code, dependencies, and runtime. Managing images efficiently is critical for any container workflow. This guide will help you understand not only how to build images, but also how to manage, tag, save, and load them.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Lab 1: Creating Docker Images Using a Container<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Objective<\/h3>\n\n\n\n<p>Create a custom Docker image based on <strong>Ubuntu<\/strong> by launching a container, installing <strong>git<\/strong> and <strong>apache2<\/strong>, and committing the container\u2019s state as a new image.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Steps<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">1. Pull the Ubuntu base image<\/h4>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">docker<\/span> <span class=\"hljs-selector-tag\">pull<\/span> <span class=\"hljs-selector-tag\">ubuntu<\/span><span class=\"hljs-selector-pseudo\">:latest<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h4 class=\"wp-block-heading\">2. Run a container interactively<\/h4>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">docker<\/span> <span class=\"hljs-selector-tag\">run<\/span> <span class=\"hljs-selector-tag\">-it<\/span> <span class=\"hljs-selector-tag\">--name<\/span> <span class=\"hljs-selector-tag\">myubuntu<\/span> <span class=\"hljs-selector-tag\">ubuntu<\/span><span class=\"hljs-selector-pseudo\">:latest<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h4 class=\"wp-block-heading\">3. Install git and apache2 inside the container<\/h4>\n\n\n\n<p>Inside the container shell:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">apt-<span class=\"hljs-keyword\">get<\/span> update\napt-<span class=\"hljs-keyword\">get<\/span> install -y git apache2\nexit\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h4 class=\"wp-block-heading\">4. Commit the container to a new image<\/h4>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">docker<\/span> <span class=\"hljs-selector-tag\">commit<\/span> <span class=\"hljs-selector-tag\">myubuntu<\/span> <span class=\"hljs-selector-tag\">ubuntu-git-apache2<\/span><span class=\"hljs-selector-pseudo\">:v1<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h4 class=\"wp-block-heading\">5. Verify the image<\/h4>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">docker images\n<\/code><\/span><\/pre>\n\n\n<p>You should see <code>ubuntu-git-apache2<\/code> listed.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">6. Tag your image for clarity<\/h4>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">docker tag ubuntu-git-apache2:v1 myrepo\/ubuntu-git-apache2:lab1\n<\/code><\/span><\/pre>\n\n\n<h4 class=\"wp-block-heading\">7. (Optional) Run a container from your new image<\/h4>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">docker run -it myrepo\/ubuntu-git-apache2:lab1 bash\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Lab 2: Creating Docker Images Using a Dockerfile<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Objective<\/h3>\n\n\n\n<p>Create a Docker image using a <strong>Dockerfile<\/strong> that sets up Ubuntu with git and apache2.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Steps<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">1. Create a new directory for your Dockerfile<\/h4>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">mkdir dockerfile-lab\ncd dockerfile-lab\n<\/code><\/span><\/pre>\n\n\n<h4 class=\"wp-block-heading\">2. Create the Dockerfile<\/h4>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"># <span class=\"hljs-selector-tag\">Dockerfile<\/span>\n<span class=\"hljs-selector-tag\">FROM<\/span> <span class=\"hljs-selector-tag\">ubuntu<\/span><span class=\"hljs-selector-pseudo\">:latest<\/span>\n\n<span class=\"hljs-selector-tag\">RUN<\/span> <span class=\"hljs-selector-tag\">apt-get<\/span> <span class=\"hljs-selector-tag\">update<\/span> &amp;&amp; \\\n    <span class=\"hljs-selector-tag\">apt-get<\/span> <span class=\"hljs-selector-tag\">install<\/span> <span class=\"hljs-selector-tag\">-y<\/span> <span class=\"hljs-selector-tag\">git<\/span> <span class=\"hljs-selector-tag\">apache2<\/span> &amp;&amp; \\\n    <span class=\"hljs-selector-tag\">apt-get<\/span> <span class=\"hljs-selector-tag\">clean<\/span>\n\n<span class=\"hljs-selector-tag\">CMD<\/span> <span class=\"hljs-selector-attr\">&#091;<span class=\"hljs-string\">\"\/bin\/bash\"<\/span>]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Save this as <code>Dockerfile<\/code>.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">3. Build the image<\/h4>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">docker<\/span> <span class=\"hljs-selector-tag\">build<\/span> <span class=\"hljs-selector-tag\">-t<\/span> <span class=\"hljs-selector-tag\">ubuntu-git-apache2<\/span><span class=\"hljs-selector-pseudo\">:dockerfile<\/span> .\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h4 class=\"wp-block-heading\">4. List the images<\/h4>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">docker images\n<\/code><\/span><\/pre>\n\n\n<h4 class=\"wp-block-heading\">5. Run the new image<\/h4>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">docker<\/span> <span class=\"hljs-selector-tag\">run<\/span> <span class=\"hljs-selector-tag\">-it<\/span> <span class=\"hljs-selector-tag\">ubuntu-git-apache2<\/span><span class=\"hljs-selector-pseudo\">:dockerfile<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Image and Container Management Commands: Explanations &amp; Examples<\/h2>\n\n\n\n<p>Below are the required commands, with clear explanations and hands-on examples using the images created in Labs 1 and 2.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">1. <strong>images<\/strong> \u2014 List Images<\/h3>\n\n\n\n<p><strong>Usage:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">docker images\n<\/code><\/span><\/pre>\n\n\n<p><strong>What it does:<\/strong><br>Lists all Docker images present locally.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">2. <strong>history<\/strong> \u2014 Show Image History<\/h3>\n\n\n\n<p><strong>Usage:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">docker<\/span> <span class=\"hljs-selector-tag\">history<\/span> <span class=\"hljs-selector-tag\">ubuntu-git-apache2<\/span><span class=\"hljs-selector-pseudo\">:dockerfile<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><strong>What it does:<\/strong><br>Displays the history of an image\u2014each layer and its command.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">3. <strong>inspect<\/strong> \u2014 Inspect Docker Object<\/h3>\n\n\n\n<p><strong>Usage:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">docker<\/span> <span class=\"hljs-selector-tag\">inspect<\/span> <span class=\"hljs-selector-tag\">ubuntu-git-apache2<\/span><span class=\"hljs-selector-pseudo\">:dockerfile<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><strong>What it does:<\/strong><br>Gives detailed low-level JSON information about an image or container.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">4. <strong>rmi<\/strong> \u2014 Remove Image(s)<\/h3>\n\n\n\n<p><strong>Usage:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">docker<\/span> <span class=\"hljs-selector-tag\">rmi<\/span> <span class=\"hljs-selector-tag\">ubuntu-git-apache2<\/span><span class=\"hljs-selector-pseudo\">:dockerfile<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><strong>What it does:<\/strong><br>Removes a specified Docker image. (Stop running containers first.)<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">5. <strong>tag<\/strong> \u2014 Tag Images<\/h3>\n\n\n\n<p><strong>Usage:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">docker tag ubuntu-git-apache2:dockerfile myrepo\/ubuntu-git-apache2:prod\n<\/code><\/span><\/pre>\n\n\n<p><strong>What it does:<\/strong><br>Creates a new tag pointing to the same image (useful for versioning).<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">6. <strong>export<\/strong> \u2014 Export Container Filesystem<\/h3>\n\n\n\n<p><strong>Usage:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">docker <span class=\"hljs-keyword\">export<\/span> myubuntu &gt; myubuntu.tar\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><strong>What it does:<\/strong><br>Exports the filesystem of a container as a tar archive (no history\/layers).<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">7. <strong>import<\/strong> \u2014 Import a Tarball as Image<\/h3>\n\n\n\n<p><strong>Usage:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">cat myubuntu.tar | docker <span class=\"hljs-keyword\">import<\/span> - myimported\/ubuntu-git-apache2:v2\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><strong>What it does:<\/strong><br>Creates an image from a tarball (reverse of <code>export<\/code>, but history lost).<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">8. <strong>save<\/strong> \u2014 Save Image(s) to Tar Archive<\/h3>\n\n\n\n<p><strong>Usage:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">docker<\/span> <span class=\"hljs-selector-tag\">save<\/span> <span class=\"hljs-selector-tag\">-o<\/span> <span class=\"hljs-selector-tag\">ubuntu-git-apache2-lab2<\/span><span class=\"hljs-selector-class\">.tar<\/span> <span class=\"hljs-selector-tag\">ubuntu-git-apache2<\/span><span class=\"hljs-selector-pseudo\">:dockerfile<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><strong>What it does:<\/strong><br>Saves one or more images to a tar archive (preserves history\/layers).<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">9. <strong>load<\/strong> \u2014 Load Image(s) from Tar Archive<\/h3>\n\n\n\n<p><strong>Usage:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-14\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">docker<\/span> <span class=\"hljs-selector-tag\">load<\/span> <span class=\"hljs-selector-tag\">-i<\/span> <span class=\"hljs-selector-tag\">ubuntu-git-apache2-lab2<\/span><span class=\"hljs-selector-class\">.tar<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-14\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><strong>What it does:<\/strong><br>Loads an image (including all tags and layers) from a tar archive created with <code>docker save<\/code>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">10. <strong>commit<\/strong> \u2014 Create Image from Container<\/h3>\n\n\n\n<p><strong>Usage:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">docker commit myubuntu myrepo\/ubuntu-git-apache2:manual\n<\/code><\/span><\/pre>\n\n\n<p><strong>What it does:<\/strong><br>Creates a new image from a container\u2019s current state.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Full Example: End-to-End Workflow<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Start with Ubuntu, install software in a container:<\/strong> <br><code>docker run -it --name ub-test ubuntu <\/code><br><code>apt-get update &amp;&amp; apt-get install -y git apache2 <\/code><br><code>exit<\/code><\/li>\n\n\n\n<li><strong>Commit the container as an image:<\/strong> <br><code>docker commit ub-test ub-git-apache:manual<\/code><\/li>\n\n\n\n<li><strong>Save and Load the image:<\/strong> <br><code>docker save -o ub-git-apache.tar ub-git-apache:manual <\/code><br><code>docker load -i ub-git-apache.tar<\/code><\/li>\n\n\n\n<li><strong>Export\/Import container as image:<\/strong> <br><code>docker export ub-test &gt; ub-test.tar cat ub-test.tar <\/code><br><code>docker import - ub-git-apache:imported<\/code><\/li>\n\n\n\n<li><strong>Build image via Dockerfile:<\/strong>\n<ul class=\"wp-block-list\">\n<li>Create Dockerfile as shown above.<\/li>\n\n\n\n<li>Build: <code>docker build -t ub-git-apache:dockerfile .<\/code><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Tag, Inspect, Remove:<\/strong> <br><code>docker tag ub-git-apache:dockerfile myrepo\/ub-git-apache:prod <\/code><br><code>docker inspect myrepo\/ub-git-apache:prod <\/code><br><code>docker rmi myrepo\/ub-git-apache:prod<\/code><\/li>\n\n\n\n<li><strong>List Images, View History:<\/strong> <code>docker images docker history ub-git-apache:dockerfile<\/code><\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p>You now have hands-on experience in:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Building Docker images both from containers and Dockerfiles.<\/li>\n\n\n\n<li>Managing, saving, loading, and distributing Docker images.<\/li>\n\n\n\n<li>Using all essential Docker image management commands with practical Ubuntu+git+apache2 examples.<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Reference<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/www.devopsschool.com\/blog\/example-and-sample-programs-of-dockerfile\/\">https:\/\/www.devopsschool.com\/blog\/example-and-sample-programs-of-dockerfile\/<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.devopsschool.com\/blog\/understanding-dockerfiles-instructions-options-of-docker\/\">https:\/\/www.devopsschool.com\/blog\/understanding-dockerfiles-instructions-options-of-docker\/<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.devopsschool.com\/blog\/dockerfile-lab-exercise-1\/\">https:\/\/www.devopsschool.com\/blog\/dockerfile-lab-exercise-1\/<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.devopsschool.com\/blog\/how-to-create-a-image-using-dockerfile\/\">https:\/\/www.devopsschool.com\/blog\/how-to-create-a-image-using-dockerfile\/<\/a><\/li>\n<\/ul>\n\n\n\n<div class=\"epyt-gallery\" data-currpage=\"1\" id=\"epyt_gallery_88389\"><figure class=\"wp-block-embed wp-block-embed-youtube is-type-video is-provider-youtube epyt-figure\"><div class=\"wp-block-embed__wrapper\"><iframe loading=\"lazy\"  id=\"_ytid_25118\"  width=\"760\" height=\"427\"  data-origwidth=\"760\" data-origheight=\"427\" src=\"https:\/\/www.youtube.com\/embed\/?enablejsapi=1&autoplay=0&cc_load_policy=0&cc_lang_pref=&iv_load_policy=1&loop=0&rel=1&fs=1&playsinline=0&autohide=2&theme=dark&color=red&controls=1&disablekb=0&\" class=\"__youtube_prefs__  no-lazyload\" title=\"YouTube player\"  data-epytgalleryid=\"epyt_gallery_88389\"  allow=\"fullscreen; accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen data-no-lazy=\"1\" data-skipgform_ajax_framebjll=\"\"><\/iframe><\/div><\/figure><div class=\"epyt-gallery-list\"><div>Sorry, there was a YouTube error.<\/div><\/div><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Here\u2019s a detailed Tutorial and Lab Guide for the listed Docker commands, focused on practical usage, explanations, and step-by-step labs with Ubuntu + git + apache2 as the image base. The guide is split into two labs as you requested, plus explanations and examples for every command. Docker Image and Image Management: Tutorial &amp; Lab&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","_joinchat":[],"footnotes":""},"categories":[4862],"tags":[1194,567,5090,5035,5091,5036],"class_list":["post-5466","post","type-post","status-publish","format-standard","hentry","category-docker","tag-container","tag-docker","tag-dockerfile","tag-excercise","tag-image","tag-lab"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/5466","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=5466"}],"version-history":[{"count":8,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/5466\/revisions"}],"predecessor-version":[{"id":50119,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/5466\/revisions\/50119"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=5466"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=5466"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=5466"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}