PageSourceSearch

https://lockmedown.com/docker-4-devs-containerizing-app/

html lockmedown.com collected 2026-10-02 04:13:06 UTC 104,978 bytes, 1,025 lines download raw bytes

1
2	
3				
4		<!DOCTYPE html>
5<html lang="en-US">
6<head>
7		<!--[if lt IE 9]>
8	
8<script src="https://lockmedown.com/wp-content/themes/performag/js/html5/dist/html5shiv.js"></script>
8
9	
9<script src="//css3-mediaqueries-js.googlecode.com/svn/trunk/css3-mediaqueries.js"></script>
9
10	<![endif]-->
11	<!--[if IE 8]>
12	<link rel="stylesheet" type="text/css" href="https://lockmedown.com/wp-content/themes/performag/css/ie8.css"/>
13	<![endif]-->
14	<!--[if IE 7]>
15	<link rel="stylesheet" type="text/css" href="https://lockmedown.com/wp-content/themes/performag/css/ie7.css"/>
16	<![endif]-->
17	<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
18	<meta charset="UTF-8">
19	
20			
20<script>
vendor: 343 bytes, lines 20-26
20
21  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
22  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
23  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
24})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
25
26  ga('create', '
26UA-51513827-1
vendor: 52 bytes, lines 26-28
26', 'lockmedown.com');
27  ga('send', 'pageview');
28
29</script>
29	
30		<title>Docker for Devs Part 1: Containerizing Your Application &#8211; Lock Me Down</title>
31<meta name='robots' content='max-image-preview:large' />
32<link rel='dns-prefetch' href='//accounts.google.com' />
33<link rel='dns-prefetch' href='//apis.google.com' />
34<link rel='preconnect' href='//c0.wp.com' />
35<link rel="alternate" title="oEmbed (JSON)" type="application/json+oembed" href="https://lockmedown.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Flockmedown.com%2Fdocker-4-devs-containerizing-app%2F" />
36<link rel="alternate" title="oEmbed (XML)" type="text/xml+oembed" href="https://lockmedown.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Flockmedown.com%2Fdocker-4-devs-containerizing-app%2F&#038;format=xml" />
37<style id="wp-img-auto-sizes-contain-inline-css">
38img:is([sizes=auto i],[sizes^="auto," i]){contain-intrinsic-size:3000px 1500px}
39/*# sourceURL=wp-img-auto-sizes-contain-inline-css */
40</style>
41<style id="wp-emoji-styles-inline-css">
42
43	img.wp-smiley, img.emoji {
44		display: inline !important;
45		border: none !important;
46		box-shadow: none !important;
47		height: 1em !important;
48		width: 1em !important;
49		margin: 0 0.07em !important;
50		vertical-align: -0.1em !important;
51		background: none !important;
52		padding: 0 !important;
53	}
54/*# sourceURL=wp-emoji-styles-inline-css */
55</style>
56<style id="wp-block-library-inline-css">
57:root{--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:var(--wp-block-synced-color);--wp-editor-canvas-background:#ddd;--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,160.5;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.wp-element-button{cursor:pointer}:root .has-very-light-gray-background-color{background-color:#eee}:root .has-very-dark-gray-background-color{background-color:#313131}:root .has-very-light-gray-color{color:#eee}:root .has-very-dark-gray-color{color:#313131}:root .has-vivid-green-cyan-to-vivid-cyan-blue-gradient-background{background:linear-gradient(135deg,#00d084,#0693e3)}:root .has-purple-crush-gradient-background{background:linear-gradient(135deg,#34e2e4,#4721fb 50%,#ab1dfe)}:root .has-hazy-dawn-gradient-background{background:linear-gradient(135deg,#faaca8,#dad0ec)}:root .has-subdued-olive-gradient-background{background:linear-gradient(135deg,#fafae1,#67a671)}:root .has-atomic-cream-gradient-background{background:linear-gradient(135deg,#fdd79a,#004a59)}:root .has-nightshade-gradient-background{background:linear-gradient(135deg,#330968,#31cdcf)}:root .has-midnight-gradient-background{background:linear-gradient(135deg,#020381,#2874fc)}:root{--wp--preset--font-size--normal:16px;
57--wp--preset--font-size--huge:42px}.has-regular-font-size{font-size:1em}.has-larger-font-size{font-size:2.625em}.has-normal-font-size{font-size:var(--wp--preset--font-size--normal)}.has-huge-font-size{font-size:var(--wp--preset--font-size--huge)}:root .has-text-align-center{text-align:center}:root .has-text-align-left{text-align:left}:root .has-text-align-right{text-align:right}.has-fit-text{white-space:nowrap!important}#end-resizable-editor-section{display:none}.aligncenter{clear:both}.items-justified-left{justify-content:flex-start}.items-justified-center{justify-content:center}.items-justified-right{justify-content:flex-end}.items-justified-space-between{justify-content:space-between}.screen-reader-text{word-wrap:normal!important;border:0;clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-break:normal!important}.screen-reader-text:focus{background-color:#ddd;clip-path:none;color:#444;display:block;font-size:1em;height:auto;left:5px;line-height:normal;padding:15px 23px 14px;text-decoration:none;top:5px;width:auto;z-index:100000}html :where(.has-border-color){border-style:solid}html :where([style^=border-color],[style*=";border-color"],[style*="; border-color"]){border-style:solid}html :where([style^=border-top-color],[style*=";border-top-color"],[style*="; border-top-color"]){border-top-style:solid}html :where([style^=border-right-color],[style*=";border-right-color"],[style*="; border-right-color"]){border-right-style:solid}html :where([style^=border-bottom-color],[style*=";border-bottom-color"],[style*="; border-bottom-color"]){border-bottom-style:solid}html :where([style^=border-left-color],[style*=";border-left-color"],[style*="; border-left-color"]){border-left-style:solid}html :where([style^=border-width],[style*=";border-width"],[style*="; border-width"]){border-style:solid}html :where([style^=border-top-width],[style*=";border-top-width"],[style*="; border-top-width"]){border-top-style:solid}html :where([style^=border-right-width],[style*=";border-right-width"],[style*="; border-right-width"]){border-right-style:solid}html :where([style^=border-bottom-width],[style*=";border-bottom-width"],[style*="; border-bottom-width"]){border-bottom-style:solid}html :where([style^=border-left-width],[style*=";border-left-width"],[style*="; border-left-width"]){border-left-style:solid}html :where(img[class*=wp-image-]){height:auto;max-width:100%}:where(figure){margin:0 0 1em}html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:var(--wp-admin--admin-bar--height,0px)}@media screen and (max-width:600px){html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:0px}}
58
59/*# sourceURL=/wp-includes/css/dist/block-library/common.min.css */
60</style>
61<style id="classic-theme-styles-inline-css">
62/*! This file is auto-generated */
63.wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none}
64/*# sourceURL=/wp-includes/css/classic-themes.min.css */
65</style>
66
67<style id="global-styles-inline-css">
68:root{--wp--preset--aspect-ratio--square: 1;--wp--preset--aspect-ratio--4-3: 4/3;--wp--preset--aspect-ratio--3-4: 3/4;--wp--preset--aspect-ratio--3-2: 3/2;--wp--preset--aspect-ratio--2-3: 2/3;--wp--preset--aspect-ratio--16-9: 16/9;--wp--preset--aspect-ratio--9-16: 9/16;--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #ffffff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgb(6,147,227) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgb(252,185,
680) 0%,rgb(255,105,0) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgb(255,105,0) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgb(255, 255, 255), 6px 6px rgb(0, 0, 0);--wp--preset--shadow--crisp: 6px 6px 0px rgb(0, 0, 0);}.wp-block-button{--wp--preset--dimension--25: 25%;--wp--preset--dimension--50: 50%;--wp--preset--dimension--75: 75%;--wp--preset--dimension--100: 100%;}:where(body) { margin: 0; }:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}body .is-layout-flex{display: flex;}.is-layout-flex{flex-wrap: wrap;align-items: center;}.is-layout-flex > :is(*, div){margin: 0;}body .is-layout-grid{display: grid;}.is-layout-grid > :is(*, div){margin: 0;}body{padding-top: 0px;padding-right: 0px;padding-bottom: 0px;padding-left: 0px;}:root :where(.wp-element-button, .wp-block-button__link){background-color: #32373c;border-width: 0;color: #fff;font-family: inherit;font-size: inherit;font-style: inherit;font-weight: inherit;letter-spacing: inherit;line-height: inherit;padding-top: calc(0.667em + 2px);padding-right: calc(1.333em + 2px);padding-bottom: calc(0.667em + 2px);padding-left: calc(1.333em + 2px);text-decoration: none;text-transform: inherit;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}
68.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;}
69/*# sourceURL=global-styles-inline-css */
70</style>
71
72<link rel='stylesheet' id='contact-form-7-css' href='https://lockmedown.com/wp-content/plugins/contact-form-7/includes/css/styles.css?ver=5.5.6' media='all' />
73<link rel='stylesheet' id='tve_style_family_tve_flt-css' href='https://lockmedown.com/wp-content/plugins/thrive-visual-editor/editor/css/thrive_flat.css?ver=10.8.9.1' media='all' />
74<link rel='stylesheet' id='performag-style-css' href='https://lockmedown.com/wp-content/themes/performag/style.css?ver=7.1.2' media='all' />
75<link rel='stylesheet' id='thrive-reset-css' href='https://lockmedown.com/wp-content/themes/performag/css/reset.css?ver=20120208' media='all' />
76<link rel='stylesheet' id='thrive-main-style-css' href='https://lockmedown.com/wp-content/themes/performag/css/main_orange_light.css?ver=5566' media='all' />
77<script id="jquery-core-js" src="https://c0.wp.com/c/7.1.2/wp-includes/js/jquery/jquery.min.js"></script>
vendor: 1 bytes, line 77
77
78<script id="jquery-migrate-js" src="https://c0.wp.com/c/7.1.2/wp-includes/js/jquery/jquery-migrate.min.js"></script>
vendor: 1 bytes, line 78
78
79<script id="jquery-ui-core-js-before">
80jQuery.uiBackCompat = true;
81//# sourceURL=jquery-ui-core-js-before
82</script>
vendor: 1 bytes, line 82
82
83<script id="jquery-ui-core-js" src="https://c0.wp.com/c/7.1.2/wp-includes/js/jquery/ui/core.min.js"></script>
vendor: 1 bytes, line 83
83
84<script id="jquery-ui-menu-js" src="https://c0.wp.com/c/7.1.2/wp-includes/js/jquery/ui/menu.min.js"></script>
vendor: 1 bytes, line 84
84
85<script id="wp-dom-ready-js" src="https://c0.wp.com/c/7.1.2/wp-includes/js/dist/dom-ready.min.js"></script>
vendor: 1 bytes, line 85
85
86<script id="wp-hooks-js" src="https://c0.wp.com/c/7.1.2/wp-includes/js/dist/hooks.min.js"></script>
vendor: 1 bytes, line 86
86
87<script id="wp-i18n-js" src="https://c0.wp.com/c/7.1.2/wp-includes/js/dist/i18n.min.js"></script>
vendor: 1 bytes, line 87
87
88<script id="wp-i18n-js-after">
89wp.i18n.setLocaleData( { 'text direction\u0004ltr': [ 'ltr' ] } );
90//# sourceURL=wp-i18n-js-after
91</script>
vendor: 1 bytes, line 91
91
92<script id="wp-a11y-js" src="https://c0.wp.com/c/7.1.2/wp-includes/js/dist/a11y.min.js"></script>
vendor: 1 bytes, line 92
92
93<script id="jquery-ui-autocomplete-js" src="https://c0.wp.com/c/7.1.2/wp-includes/js/jquery/ui/autocomplete.min.js"></script>
vendor: 1 bytes, line 93
93
94<script id="imagesloaded-js" src="https://c0.wp.com/c/7.1.2/wp-includes/js/imagesloaded.min.js"></script>
vendor: 1 bytes, line 94
94
95<script id="masonry-js" src="https://c0.wp.com/c/7.1.2/wp-includes/js/masonry.min.js"></script>
vendor: 1 bytes, line 95
95
96<script id="jquery-masonry-js" src="https://c0.wp.com/c/7.1.2/wp-includes/js/jquery/jquery.masonry.min.js"></script>
vendor: 1 bytes, line 96
96
97<script id="tve_frontend-js-extra">
98var tve_frontend_options = {"ajaxurl":"https://lockmedown.com/wp-admin/admin-ajax.php","is_editor_page":"","page_events":[],"is_single":"1","social_fb_app_id":"","dash_url":"https://lockmedown.com/wp-content/plugins/thrive-visual-editor/thrive-dashboard","queried_object":{"ID":1785,"post_author":"1"},"query_vars":{"page":"","name":"docker-4-devs-containerizing-app"},"$_POST":[],"site_locale":"en-us","date_format":"F j, Y","translations":{"Copy":"Copy","empty_username":"ERROR: The username field is empty.","empty_password":"ERROR: The password field is empty.","empty_login":"ERROR: Enter a username or email address.","min_chars":"At least %s characters are needed","no_headings":"No headings found","registration_err":{"required_field":"\u003Cstrong\u003EError\u003C/strong\u003E: This field is required","required_email":"\u003Cstrong\u003EError\u003C/strong\u003E: Please type your email address","invalid_email":"\u003Cstrong\u003EError\u003C/strong\u003E: The email address isn&#8217;t correct","passwordmismatch":"\u003Cstrong\u003EError\u003C/strong\u003E: Password mismatch"}},"routes":{"posts":"https://lockmedown.com/wp-json/tcb/v1/posts","video_reporting":"https://lockmedown.com/wp-json/tcb/v1/video-reporting"},"nonce":"2da7279e78","allow_video_src":"","google_client_id":null,"facebook_app_id":null,"lead_generation_custom_tag_apis":["activecampaign","aweber","convertkit","drip","klicktipp","mailchimp","sendlane","zapier"],"post_request_data":[],"user_profile_nonce":"2ddb5ab1cc","ip":"181.215.65.65","current_user":[],"post_id":"1785","post_title":"Docker for Devs Part 1: Containerizing Your Application","post_type":"post","post_url":"https://lockmedown.com/docker-4-devs-containerizing-app/","is_lp":"","conditional_display":{"is_tooltip_dismissed":false}};
99//# sourceURL=tve_frontend-js-extra
100</script>
vendor: 1 bytes, line 100
100
101<script id="tve_frontend-js" src="https://lockmedown.com/wp-content/plugins/thrive-visual-editor/editor/js/dist/modules/general.min.js?ver=10.8.9.1"></script>
vendor: 1 bytes, line 101
101
102<script id="moxiejs-js" src="https://c0.wp.com/c/7.1.2/wp-includes/js/plupload/moxie.min.js"></script>
102
103<link rel="https://api.w.org/" href="https://lockmedown.com/wp-json/" /><link rel="alternate" title="JSON" type="application/json" href="https://lockmedown.com/wp-json/wp/v2/posts/1785" /><link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://lockmedown.com/xmlrpc.php?rsd" />
104<meta name="generator" content="WordPress 7.1.2" />
105<link rel="canonical" href="https://lockmedown.com/docker-4-devs-containerizing-app/" />
106<link rel='shortlink' href='https://lockmedown.com/?p=1785' />
107<script type="text/javascript"><!--
108function powerpress_pinw(pinw_url){window.open(pinw_url, 'PowerPressPlayer','toolbar=0,status=0,resizable=1,width=460,height=320');	return false;}
109//-->
110</script>
110
111<style type="text/css" id="tve_global_variables">:root{--tcb-background-author-image:url(https://secure.gravatar.com/avatar/88c24c736b3c52a074c17707bbfecf386b282175d483ed2ee136db4569177e66?s=256&r=g);--tcb-background-user-image:url();--tcb-background-featured-image-thumbnail:url(https://lockmedown.com/wp-content/uploads/2017/01/docker-feature.png);}</style>		<style type="text/css">.wp-video-shortcode {
112				max-width: 100% !important;
113			}body { background:#; }.twr { background:#; }.cnt .sAs .twr { background:#; }.cnt article h1.entry-title a { color:#000000; }.cnt article h2.entry-title a { color:#000000; }.bSe h1, .bt .entry-title { color:#000000; }.bSe h2 { color:#000000; }.bSe h3 { color:#000000; }.bSe h4 { color:#000000; }.bSe h5 { color:#000000; }.bSe h6 { color:#000000; }.cnt p { color:#333; }.lhgh { line-height:2em; }.dhgh { line-height:2em; }.lhgh { line-height:2em; }.dhgh { line-height:2em; }.cnt .bSe article { color:#333; }.cnt article h1 a, .tve-woocommerce .bSe .awr .entry-title, .tve-woocommerce .bSe .awr .page-title{font-family:Lato,sans-serif;}.bSe h1, .bt  .entry-title{font-family:Lato,sans-serif;}.bSe h2,.tve-woocommerce .bSe h2{font-family:Lato,sans-serif;}.bSe h3,.tve-woocommerce .bSe h3{font-family:Lato,sans-serif;}.bSe h4{font-family:Lato,sans-serif;}.bSe h5{font-family:Lato,sans-serif;}.bSe h6{font-family:Lato,sans-serif;}.bp-c h2{font-family:Lato,sans-serif;}#text_logo{font-family:Lato,sans-serif;}.cnt, .bp-t, .tve-woocommerce .product p, .tve-woocommerce .products p{font-family:Lato,sans-serif;font-weight:400;}article strong {font-weight: bold;}.bSe h1, .bt .entry-title, .ind .entry-title { font-size:50px; }.cnt { font-size:16px; }.thrivecb { font-size:16px; }.out { font-size:16px; }.aut p { font-size:16px; }.cnt p { line-height:2em; }.thrivecb { line-height:2em; }.cnt .cmt, .cnt .acm { background-color:#cc9900; }.str { border-color: transparent #cc9900 transparent transparent; }.bSe a { color:#cc9900; }.bSe .faq h4{font-family:Lato,sans-serif;font-weight:400;}article strong {font-weight: bold;}header ul.menu > li > a { color:#333; }header ul.menu > li > a:hover { color:#; }header a#logo > img { max-width:200px; }</style>
114		<style type="text/css" id="thrive-default-styles"></style><link rel="icon" href="https://lockmedown.com/wp-content/uploads/2013/10/lnl_fav.png" sizes="32x32" />
115<link rel="icon" href="https://lockmedown.com/wp-content/uploads/2013/10/lnl_fav.png" sizes="192x192" />
116<link rel="apple-touch-icon" href="https://lockmedown.com/wp-content/uploads/2013/10/lnl_fav.png" />
117<meta name="msapplication-TileImage" content="https://lockmedown.com/wp-content/uploads/2013/10/lnl_fav.png" />
118		</head>
119<body data-rsssl=1 class="wp-singular post-template-default single single-post postid-1785 single-format-standard custom-background wp-theme-performag">
120
121<div class="flex-cnt">
122	<header class="center " style="">
123				<div class="h-i">
124			<div class="th">
125				<div class="wrp clearfix">
126					
127																					<a class="" href="https://lockmedown.com/" id="logo">
128									<img src="https://lockmedown.com/wp-content/uploads/2017/01/Lock-me-down-500-153.png"
129									     alt="Lock Me Down">
130								</a>
131																									<div class="ha">
132													</div>
133
134					
135				</div>
136			</div>
137			<div class="bh clearfix" 			     >
138				<div class="wrp clearfix">
139					<div class="hsm"></div>
140
141					
142					<div class="nav_c">
143													<!-- Cart Dropdown -->
144							<nav class="menu-custom-main-container"><ul id="menu-custom-main" class="menu"><li  id="menu-item-1820" class="c_def menu-item menu-item-type-post_type menu-item-object-page menu-item-home toplvl "><a href="https://lockmedown.com/">Home</a></li>
145<li  id="menu-item-918" class="c_def menu-item menu-item-type-taxonomy menu-item-object-category toplvl "><a href="https://lockmedown.com/category/cloud/">Cloud</a></li>
146<li  id="menu-item-924" class="c_def menu-item menu-item-type-taxonomy menu-item-object-category toplvl "><a href="https://lockmedown.com/category/video/">Videos</a></li>
147<li  id="menu-item-921" class="c_def menu-item menu-item-type-post_type menu-item-object-page toplvl "><a href="https://lockmedown.com/about/">About</a></li>
148<li  id="menu-item-1551" class="c_def menu-item menu-item-type-taxonomy menu-item-object-category toplvl "><a href="https://lockmedown.com/category/podcast/">Podcast</a></li>
149</ul></nav>											</div>
150
151											<div class="hi">
152							<form action="https://lockmedown.com/" method="get" class="hf left">
153								<input type="text" placeholder="Search" name="s"/>
154								<button></button>
155							</form>
156							<div class="hs right">
157								<ul>
158																			<li><a class="fb" href="https://www.facebook.com/lockmedown"
159										       target="_blank"></a></li>
160																												<li><a class="twitter" href="https://twitter.com/maxrmccarty"
161										       target="_blank"></a></li>
162																												<li><a class="g_plus" href="https://plus.google.com/103033301529621082503"
163										       target="_blank"></a></li>
164																																					<li><a class="linkedin" href="https://www.linkedin.com/in/maxmccarty"
165										       target="_blank"></a></li>
166																												<li><a class="youtube" href="https://www.youtube.com/channel/UC39gxztwuvXZe7rIRTQPYaA"
167										       target="_blank"></a></li>
168																	</ul>
169							</div>
170						</div>
171					
172				</div>
173			</div>
174		</div>
175	</header>
176
177	
178
179					<div class="bt dp">
180				<div class="wrp">
181																		<h1 class="entry-title">Docker for Devs Part 1: Containerizing Your Application</h1>
182																</div>
183			</div>
184		
185		<div class="wrp cnt p-s">
186			
187						<div class="bSeCont">
188				<section
189					class="bSe left">
190
191					<article>
192						<div class="awr">
193																								<div class="met">
194										<div class="meta left">
195																							<div class="left ma">
196													<img alt='' src='https://secure.gravatar.com/avatar/88c24c736b3c52a074c17707bbfecf386b282175d483ed2ee136db4569177e66?s=125&#038;r=g' srcset='https://secure.gravatar.com/avatar/88c24c736b3c52a074c17707bbfecf386b282175d483ed2ee136db4569177e66?s=250&#038;r=g 2x' class='avatar avatar-125 photo' height='125' width='125' decoding='async'/>												</div>
197																						<div class="left mc">
198																								<span>
199                                                    	                                                    By	                                                    <a href="https://lockmedown.com/author/max-r-mccartygmail-com/">
200		                                                    Max McCarty	                                                    </a>
201                                                    													/																																										January 16, 2017																											
202                                                </span>
203
204											</div>
205											<div class="clear"></div>
206										</div>
207										<div class="mets right tt-share" data-url="https://lockmedown.com/docker-4-devs-containerizing-app/"
208     data-id="1785"><!--max 3 -->
209	<div class="bps">
210					<div class="ss">
211				<a class="fb" href="//www.facebook.com/sharer/sharer.php?u=https://lockmedown.com/docker-4-devs-containerizing-app/"
212				   onclick="return ThriveApp.open_share_popup(this.href, 545, 433);">
213                    <span>
214                        Share                    </span>
215									</a>
216			</div>
217							<div class="ss">
218				<a class="twitter"
219				   href="https://twitter.com/share?text=Docker for Devs Part 1: Containerizing Your Application:&url=https://lockmedown.com/docker-4-devs-containerizing-app/"
220				   onclick="return ThriveApp.open_share_popup(this.href, 545, 433);">
221					<span>Tweet</span>
222				</a>
223			</div>
224									<div class="ss">
225				<a class="g_plus" href="https://plus.google.com/share?url=https://lockmedown.com/docker-4-devs-containerizing-app/"
226				   onclick="return ThriveApp.open_share_popup(this.href, 545, 433);">
227                    <span>
228                        Share                    </span>
229									</a>
230			</div>
231							<div class="ss">
232				<a class="linkedin" href="https://www.linkedin.com/cws/share?url=https://lockmedown.com/docker-4-devs-containerizing-app/"
233				   onclick="return ThriveApp.open_share_popup(this.href, 545, 433);">
234					<span>Share</span>
235									</a>
236			</div>
237			</div>
238</div>										<div class="clear"></div>
239									</div>
240
241															
242														
243															<div class="fwit">
244									<img
245										src="https://lockmedown.com/wp-content/uploads/2017/01/docker-feature.png"
246										alt="Docker for Developers"
247										title="docker-feature"/>
248								</div>
249							
250							
251							
252							
253							<div id="tve_flt" class="tve_flt tcb-style-wrap"><div id="tve_editor" class="tve_shortcode_editor tar-main-content" data-post-id="1785"><div class="thrv_paste_content thrv_wrapper tve_empty_dropzone"></div><div class="thrv_paste_content thrv_wrapper tve_empty_dropzone"></div><div class="thrv_paste_content thrv_wrapper"></div><div class="thrv_paste_content thrv_wrapper tve_empty_dropzone"></div></div></div><ul>
254<li><em><b>Part 1: Containerize your Application Environment (this post)</b></em></li>
255<li><a href="https://lockmedown.com/docker-for-developers-create-dev-image/"><span style="font-weight: 400;">Part 2: Creating a Developer Image</span></a></li>
256<li><a href="https://lockmedown.com/docker-tutorial-development-image/"><span style="font-weight: 400;">Part 3: Hot Module Reloading and Code Updates in Containers</span></a></li>
257<li><a href="https://lockmedown.com/docker-devs-multiple-containers-docker-compose/"><span style="font-weight: 400;">Part 4: Composing Multi-container Networks</span></a></li>
258<li><a href="https://lockmedown.com/docker-devs-sharing-images-using-docker-hub/"><span style="font-weight: 400;">Part 5: Sharing Images with Your Team Using Docker Hub</span></a></li>
259<li><a href="https://lockmedown.com/debug-docker-containers-using-webstorm/">Bonus: Debug Docker Containers with WebStorm</a></li>
260</ul>
261<p><span style="font-weight: 400;">As developers, we’re always looking for a shortcut, or an easier way to hit the ground running, right? If you’re a team lead, getting your team on the same page, setup and operating with minimal effort and pain is important. Docker 
261can help.</span></p>
262<p><span style="font-weight: 400;">In the realm of software development, there has always been a growing emphasis on modularization, from general principles such as </span><i><span style="font-weight: 400;">single-responsibility</span></i><span style="font-weight: 400;"> to more concrete implementations such modularizing javascript functionality into stateless components. Here, I’ll show you how we can use Docker to modularize our development environment for a number of similar benefits, including helping  us hit the ground running.</span></p>
263<h2>Docker 4 Developers</h2>
264<p><span style="font-weight: 400;">As you know, to get ramped up on a project, you have a checklist of to-dos:</span></p>
265<ul>
266<li style="font-weight: 400;"><span style="font-weight: 400;">Pull the code base from repository</span></li>
267<li style="font-weight: 400;"><span style="font-weight: 400;">Install external tools such as database(s), caching store, additional tools and services</span></li>
268<li style="font-weight: 400;"><span style="font-weight: 400;">Patch and update said external tools</span></li>
269<li style="font-weight: 400;"><span style="font-weight: 400;">Configure databases and services for cross-application communication</span></li>
270<li style="font-weight: 400;"><span style="font-weight: 400;">Cross fingers and pray (times may vary)</span></li>
271<li style="font-weight: 400;"><span style="font-weight: 400;">Debug (reboot at least 3x)</span></li>
272</ul>
273<p>Imagine if after pulling your application’s code base out of repository, you only had to run a few command lines (possibly as few as one) to get your entire application’s environment ready to go. Sounds cool, right?</p>
274<p>That’s exactly what we&#8217;re out to accomplish. Instead of an encyclopedic approach to laying out all the features and commands of using Docker, I’ll cover the main features as we go through using Docker to containerize a developer’s environment.</p>
275<p>This post is the first in a series on leveraging the power of containerization using Docker to easily build an applications development environment that can be shared and up and running in no time.</p>
276<h3>Docker Toolbox vs. Docker for X</h3>
277<p><span style="font-weight: 400;">Docker Toolbox was the </span><span style="font-weight: 400;">original collection</span><span style="font-weight: 400;"> of tools available for working with a number of Docker resources and will vary depending on your OS of choice. But since then, they have released new Windows and Mac native applications.  So in addition to the Linux, OS X and Windows Docker Toolbox variations, you will also see “Docker for Mac” and “Docker for Windows”.</span></p>
278<p><span style="font-weight: 400;">To understand and decide which tool you should use, I wanted to outline the premise for the new native applications.  The original Docker Toolbox would set up a number of tools along with the use of</span><a href="https://www.virtualbox.org/"> <span style="font-weight: 400;">VirtualBox</span></a><span style="font-weight: 400;">. It would also provision a virtual machine running on the Linux Hypervisor for either Windows or Mac.</span></p>
279<h3>VirtualBox, Hyper-V and hyperkit, O&#8217;My</h3>
280<p><span style="font-weight: 400;">The native applications, such as in the case of Docker for Mac, install an actual native OS X application.  It also no longer uses VirtualBox but the OS X hypervisor </span><b>hyperkit</b><span style="font-weight: 400;">. Furthermore, shared interfaces and network is managed much simpler.  There are also some user experience updates to the tooling used to work with Docker as well.  These same changes are also apparent in the Docker for Windows native application, utilizing the Hyper-V hypervisor instead, along with the host of other similar network and tooling updates.</span></p>
281<p>In the end, the experience is suppose to be a more positive, efficient experience as well as less error-prone.  However, you will find a vast majority of external documentation related to the Toolbox &#8211; so it could be to your advantage to know about Toolbox.</p>
282<h3>Getting Started</h3>
283<p><span style="font-weight: 400;">This initial tutorial will simply use an out-of-the-box express.js application. When we get to live editing of source code and communicating between containers, I’ll move onto a more involved, universal React.js application running Webpack’s dev-server with hot module reloading, a MongoDB database and more.</span></p>
284<h3>Step 1: Installation</h3>
285<p><span style="font-weight: 400;">In an effort to get to the goodies of using Docker and containerizing a developer environment along with a slew of various OS versions, I’ll leave it to you to download whichever Docker version (Toolbox or native) and OS you want to use:</span></p>
286<p style="padding-left: 30px;"><span style="font-weight: 400;"><strong>Toolbox</strong>: </span><a href="https://www.docker.com/products/docker-toolbox"><span style="font-weight: 400;">https://www.docker.com/products/docker-toolbox</span></a><span style="font-weight: 400;"> (OS X and Windows)</span></p>
287<p style="padding-left: 30px;"><span style="font-weight: 400;"><strong>Docker for Windows</strong>: </span><a href="https://www.docker.com/products/docker#/windows"><span style="font-weight: 400;">https://www.docker.com/products/docker#/windows</span></a></p>
288<p style="padding-left: 30px;"><span style="font-weight: 400;"><strong>Docker for Mac</strong>: </span><a href="https://www.docker.com/products/docker#/mac"><span style="font-weight: 400;">https://www.docker.com/products/docker#/mac</span></a></p>
289<div style="background-color: #f7931d; padding: 10px;"><b>TOOLBOX USERS:</b><span style="font-weight: 400;"> Docker Toolbox comes with a “Docker Quickstart Terminal” and is linked to the Docker environment when ran.  However, it’s common to run a terminal separately OR within your IDE of choice.  In order to interact with Docker from another terminal/prompt, you’ll need to initialize the Docker env by running “docker-machine env”.  At the end of the displayed text is a command you will need to copy/paste from within that same terminal/prompt to initialize the Docker environment.</span></div>
290<h3>Step 2: Source Code / Environment</h3>
291<p><span style="font-weight: 400;">The next step is to have obtain the source code of the development application you want to containerize.  </span></p>
292<p><span style="font-weight: 400;">For now, you can grab this </span><a href="https://github.com/hyndsite/docker-4-devs.git"><span style="font-weight: 400;">project</span></a><span style="font-weight: 400;"> from Github that I’m using in this part of the tutorial to save a few steps.</span></p>
293<h3>Step 3: Creating a Docker Image File</h3>
294<p><span style="font-weight: 400;">Remember, the primary goal is to run our application in an isolated and modularized environment. In order to have Docker 
294create that environment, we have to tell it how to create it. We do that with a set of instructions using a</span><a href="https://docs.docker.com/engine/reference/builder/"> <span style="font-weight: 400;">Docker Image File</span></a><span style="font-weight: 400;">.  </span></p>
295<ol>
296<li style="font-weight: 400;"><span style="font-weight: 400;">Using your IDE of choice, add a file and name it &#8220;</span><i><span style="font-weight: 400;">Dockerfile&#8221;</span></i><span style="font-weight: 400;"> to the project root:</span></li>
297<li style="font-weight: 400;"><span style="font-weight: 400;">Copy in the below file contents</span></li>
298</ol>
299<div style="background-color: #f7931d; padding: 10px;"><b>IMPORTANT: </b><span style="font-weight: 400;">This Docker image file will allow us to create an image which will represent that containerized environment we’ve been talking about, and eventually create </span><i><span style="font-weight: 400;">running</span></i><span style="font-weight: 400;"> instances of that image called containers. But we’re jumping ahead, more on this in Step 5.</span></div>
300<p>&nbsp;</p>
301<h5><strong>Dockerfile</strong></h5>
302<pre class="lang:css decode:true" title="Dockerfile">FROM mhart/alpine-node:6.9.2
303
304WORKDIR /var/app
305
306COPY . /var/app
307
308RUN npm install --production
309
310EXPOSE 3000
311
312ENV NODE_ENV=production
313
314CMD ["node", "bin/www"]
315</pre>
316<p>&nbsp;</p>
317<h5><em>What did we do?</em></h5>
318<p><span style="font-weight: 400;">Dockerfile is the default name that Docker looks for in an image file, but it can be any name, which we’ll see in a later step. These instructions inform Docker that we want to create an image:</span></p>
319<ul>
320<li style="font-weight: 400;"><a href="https://docs.docker.com/engine/reference/builder/#from"><i><span style="font-weight: 400;">FROM</span></i></a><span style="font-weight: 400;"> a base image</span><a href="https://hub.docker.com/r/mhart/alpine-node/"> <span style="font-weight: 400;">mhart/alpine-node</span></a><span style="font-weight: 400;"> with the tag of 6.9.2.</span></li>
321<li style="font-weight: 400;"><span style="font-weight: 400;">Setting the working directory</span><a href="https://docs.docker.com/engine/reference/builder/#/workdir"> <i><span style="font-weight: 400;">WORKDIR</span></i></a><span style="font-weight: 400;"> that the application will run from </span></li>
322<li style="font-weight: 400;"><a href="https://docs.docker.com/engine/reference/builder/#/copy"><i><span style="font-weight: 400;">COPY</span></i></a> <span style="font-weight: 400;">the contents of the current local directory “.&#8221; to the specified location</span></li>
323<li style="font-weight: 400;"><span style="font-weight: 400;">Then</span><a href="https://docs.docker.com/engine/reference/builder/#run"> <i><span style="font-weight: 400;">RUN</span></i></a> <span style="font-weight: 400;">the command “</span><i><span style="font-weight: 400;">npm install —production”</span></i><span style="font-weight: 400;"> from the WORKDIR</span></li>
324<li style="font-weight: 400;"><span style="font-weight: 400;">We’ll also</span><a href="https://docs.docker.com/engine/reference/builder/#expose"> <i><span style="font-weight: 400;">EXPOSE</span></i></a><span style="font-weight: 400;"> the port of 3000 from the container when it is created from the image</span></li>
325<li style="font-weight: 400;"><span style="font-weight: 400;">In addition, we wanted to create a container local</span><a href="https://docs.docker.com/engine/reference/builder/#env"> <i><span style="font-weight: 400;">ENV</span></i></a><span style="font-weight: 400;"> variable of NODE_ENV set to “</span><i><span style="font-weight: 400;">production</span></i><span style="font-weight: 400;">”</span></li>
326<li style="font-weight: 400;"><span style="font-weight: 400;">Finally, we want to start our express.js server, which resides in the “</span><i><span style="font-weight: 400;">www”</span></i><span style="font-weight: 400;"> file in the “bin” directory execute the command “</span><i><span style="font-weight: 400;">node bin/www&#8221;</span></i></li>
327</ul>
328<p>&nbsp;</p>
329<div style="background-color: #f7931d; padding: 10px;"><b>TIP</b><span style="font-weight: 400;">: Docker always requires a base image, keeping our images with as small of a footprint as possible is key.  The alpine-node image is built on the extremely small (49.65mb) that includes both Node.js and NPM. </span></div>
330<p>&nbsp;</p>
331<h3>Step 4: Building an Image</h3>
332<p><span style="font-weight: 400;">Now that we have an Docker image file, which specifies details about how to create an image, let&#8217;s stop and talk about what an Image is:</span><a href="https://lockmedown.com/wp-content/uploads/2017/01/Image-File-Layer-e1484233589455.png"><img decoding="async" class="aligncenter wp-image-1843 size-full" src="https://lockmedown.com/wp-content/uploads/2017/01/Image-File-Layer-e1484233589455.png" width="1000" height="542" /></a></p>
333<p><span style="font-weight: 400;">An image is a read-only layered file system.  It makes up the base file system of the environment we keep eluding to. The image file we made in the previous step will instruct Docker on how to create each of these layers for the image we are going to create from that </span><i><span style="font-weight: 400;">
333Dockerfile</span></i><span style="font-weight: 400;"> now</span><i><span style="font-weight: 400;">.</span></i></p>
334<p><span style="font-weight: 400;">But if it is a “read-only” file system, how are we going to write to it, (for instance, performing code changes to our application&#8217;s code-base during development)?  Good question, I’ll answer that in an upcoming step.</span></p>
335<h4>Step 4a: Build Production Image</h4>
336<ol>
337<li style="font-weight: 400;"><span style="font-weight: 400;">From a terminal/prompt navigate to the root of our project directory.</span></li>
338<li style="font-weight: 400;"><span style="font-weight: 400;">Run the command (</span><i><span style="font-weight: 400;">including the period at the end) </span></i><span style="font-weight: 400;">:</span><span style="font-weight: 400;"><br />
339</span><span style="font-weight: 400;"><br />
340</span></p>
341<pre class="lang:ps decode:true " title="Docker Build Command">docker build -t express-prod-i .</pre>
342<p>&nbsp;</li>
343</ol>
344<p><a href="https://lockmedown.com/wp-content/uploads/2017/01/image-build.gif"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-1845" src="https://lockmedown.com/wp-content/uploads/2017/01/image-build.gif" alt="" width="640" height="380" /></a></p>
345<div style="background-color: #f7931d; padding: 10px;"><b>TIP</b><span style="font-weight: 400;">: For Docker Toolbox, running Docker commands from anywhere but the Docker Quickstart Terminal will result in an error (varies based on OS). In order to run commands from any random terminal/prompt, you’ll need to link up the terminal/prompt to the docker environment.  Run </span><i><span style="font-weight: 400;">docker-machine env,</span></i> <span style="font-weight: 400;">and run the command that it prompts such as e.g. &#8220;</span><i><span style="font-weight: 400;">@FOR /f &#8220;tokens=*&#8221; %i IN (&#8216;docker-machine env&#8217;) DO @%i&#8221;</span></i></div>
346<h5> <b><i>What did we do?</i></b></h5>
347<ol>
348<li style="font-weight: 400;"><span style="font-weight: 400;">We ran the</span><a href="https://docs.docker.com/engine/reference/commandline/build/"> <i><span style="font-weight: 400;">build</span></i></a> command <span style="font-weight: 400;">to create an image from the Docker image file we create in Step 3.</span></li>
349<li style="font-weight: 400;"><span style="font-weight: 400;">Using the</span><a href="https://docs.docker.com/engine/reference/commandline/build/#/tag-image--t"> <i><span style="font-weight: 400;">tag</span></i></a><span style="font-weight: 400;"> switch -t we gave the image a name that we can use for referring to it without having to refer to the Docker generated ID (e.g. 50e8dde7e180)</span></li>
350<li style="font-weight: 400;"><span style="font-weight: 400;">We specified the path of the image which was the current local directory which was specified with the “.”</span></li>
351</ol>
352<p>&nbsp;</p>
353<h4><b>Step 4b: Verify Image</b></h4>
354<p><span style="font-weight: 400;">If all went as planned we should see (as in the .gif) a “successful build ….” message.  We can now run a command you’ll come to memorize for showing your images:</span></p>
355<ol>
356<li style="font-weight: 400;"><i><span style="font-weight: 400;">docker images</span></i></li>
357</ol>
358<p><a href="https://lockmedown.com/wp-content/uploads/2017/01/docker-images-list.png"><img decoding="async" class="aligncenter size-full wp-image-1849" src="https://lockmedown.com/wp-content/uploads/2017/01/docker-images-list.png" alt="Lists of docker images using the docker images command" /></a></p>
359<p>In this case, our combined image is 61.26 MB in size which is a combined of the base alpine-node image and our express application layer.</p>
360<h4>Step 4c: Review Image File Layers</h4>
361<p><span style="font-weight: 400;">If we want to see the file layers created for our image we can run the command:</span></p>
362<pre class="lang:ps decode:true " title="Show layered file system of Image using Docker history command">docker history express-prod-i</pre>
363<p><a href="https://lockmedown.com/wp-content/uploads/2017/01/image-layer-history.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-1851" src="https://lockmedown.com/wp-content/uploads/2017/01/image-layer-history.png" alt="List of image file layers using Docker history command" width="1204" height="284" srcset="https://lockmedown.com/wp-content/uploads/2017/01/image-layer-history.png 1204w, https://lockmedown.com/wp-content/uploads/2017/01/image-layer-history-70x17.png 70w, https://lockmedown.com/wp-content/uploads/2017/01/image-layer-history-300x71.png 300w, https://lockmedown.com/wp-content/uploads/2017/01/image-layer-history-768x181.png 768w, https://lockmedown.com/wp-content/uploads/2017/01/image-layer-history-1024x242.png 1024w, https://lockmedown.com/wp-content/uploads/2017/01/image-layer-history-254x60.png 254w, https://lockmedown.com/wp-content/uploads/2017/01/image-layer-history-64x15.png 64w, https://lockmedown.com/wp-content/uploads/2017/01/image-layer-history-220x52.png 220w, https://lockmedown.com/wp-content/uploads/2017/01/image-layer-history-250x59.png 250w, https://lockmedown.com/wp-content/uploads/2017/01/image-layer-history-550x130.png 550w, https://lockmedown.com/wp-content/uploads/2017/01/image-layer-history-400x94.png 400w, https://lockmedown.com/wp-content/uploads/2017/01/image-layer-history-350x83.png 350w, https://lockmedown.com/wp-content/uploads/2017/01/image-layer-history-680x160.png 680w, https://lockmedown.com/wp-content/uploads/2017/01/image-layer-history-848x200.png 848w, https://lockmedown.com/wp-content/uploads/2017/01/image-layer-history-1020x241.png 1020w" sizes="auto, (max-width: 1204px) 100vw, 1204px" /></a></p>
364<p>&nbsp;</p>
365<h3>Step 5: Running an Instance of our Image</h3>
366<p><span style="font-weight: 400;">Now that we have created an image, we are ready to create an isolated, modularized environment of our application. As I have alluded to a number of times, that environment is a Docker container.  A docker 
366container is actually a running instance of an image.</span></p>
367<p><span style="font-weight: 400;">In concept alone, an image and container is very similar to how we would think of a Javascript Prototype or a OOP Class.  </span><span style="font-weight: 400;">So, let’s run an instance of the image we created</span></p>
368<h4><b>Step 5a: Generate and Run an Instance of the Image</b></h4>
369<ol>
370<li style="font-weight: 400;"><span style="font-weight: 400;">Run the command:</span><span style="font-weight: 400;"><br />
371</span></p>
372<pre class="lang:ps decode:true" title="Docker Run command">docker run -d --name express-prod-app -p 7000:3000 express-prod-i</pre>
373</li>
374<li><i><span style="font-weight: 400;">Launch browser to</span></i><a href="http://localhost:7000"> <i><span style="font-weight: 400;">http://localhost:7000<br />
375</span></i></a><i><a href="https://lockmedown.com/wp-content/uploads/2017/01/running-express-app.png"><br />
376</a><a href="https://lockmedown.com/wp-content/uploads/2017/01/running-express-app.png"><img loading="lazy" decoding="async" class="aligncenter size-large wp-image-1852" src="https://lockmedown.com/wp-content/uploads/2017/01/running-express-app-1024x369.png" alt="Browser running Express.js Site" width="1024" height="369" srcset="https://lockmedown.com/wp-content/uploads/2017/01/running-express-app-1024x369.png 1024w, https://lockmedown.com/wp-content/uploads/2017/01/running-express-app-70x25.png 70w, https://lockmedown.com/wp-content/uploads/2017/01/running-express-app-300x108.png 300w, https://lockmedown.com/wp-content/uploads/2017/01/running-express-app-768x277.png 768w, https://lockmedown.com/wp-content/uploads/2017/01/running-express-app-254x92.png 254w, https://lockmedown.com/wp-content/uploads/2017/01/running-express-app-64x23.png 64w, https://lockmedown.com/wp-content/uploads/2017/01/running-express-app-220x79.png 220w, https://lockmedown.com/wp-content/uploads/2017/01/running-express-app-250x90.png 250w, https://lockmedown.com/wp-content/uploads/2017/01/running-express-app-550x198.png 550w, https://lockmedown.com/wp-content/uploads/2017/01/running-express-app-400x144.png 400w, https://lockmedown.com/wp-content/uploads/2017/01/running-express-app-350x126.png 350w, https://lockmedown.com/wp-content/uploads/2017/01/running-express-app-680x245.png 680w, https://lockmedown.com/wp-content/uploads/2017/01/running-express-app-848x306.png 848w, https://lockmedown.com/wp-content/uploads/2017/01/running-express-app-1020x368.png 1020w, https://lockmedown.com/wp-content/uploads/2017/01/running-express-app.png 1376w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a><br />
377</i></li>
378</ol>
379<h5><strong><i>What did we do?</i></strong></h5>
380<p><span style="font-weight: 400;">We created and ran an instance of our express-prod-i image known as a container by:</span></p>
381<ul>
382<li style="font-weight: 400;"><span style="font-weight: 400;">Using the</span><a href="https://docs.docker.com/engine/reference/run/"> <i><span style="font-weight: 400;">RUN</span></i></a> <span style="font-weight: 400;">command </span></li>
383<li style="font-weight: 400;"><span style="font-weight: 400;">Specifying the detached mode -d flag (so we don’t tie up the current terminal/prompt)</span></li>
384<li style="font-weight: 400;"><span style="font-weight: 400;">and gave a name of “</span><i><span style="font-weight: 400;">express-prod-app&#8221;</span></i><span style="font-weight: 400;"> to our container using the &#8211;name flag</span></li>
385<li style="font-weight: 400;"><span style="font-weight: 400;">along with mapping a local port on our host machine of 7000 to the internal container port that we exposed of 3000 using the -p flag</span></li>
386<li style="font-weight: 400;"><span style="font-weight: 400;">Finally, specifying the “</span><i><span style="font-weight: 400;">express-prod-i&#8221;</span></i><span style="font-weight: 400;"> image we want to generate and run our instance</span></li>
387</ul>
388<p><span style="font-weight: 400;"><strong>NOTE</strong>: I used a different local port of 7000 to show you that you can map whatever unused port on the host machine to the internal port being exposed in the container.</sp
388an></p>
389<div style="background-color: #f7931d; padding: 10px;"><b>TIP</b><span style="font-weight: 400;">: Without the -d we would have started the running container in an attached mode. This means it would feedall output from the container directly into the terminal/prompt we executed the command in.  By starting the container in a detached mode, we can continue to work from the terminal/prompt that we ran the container in.</span></div>
390<h4></h4>
391<h5><b>Epiphany #1</b></h5>
392<p><span style="font-weight: 400;">Did you catch that?  We didn’t have to install Node.js or NPM locally.  We didn’t have to run </span><i><span style="font-weight: 400;">npm install</span></i><span style="font-weight: 400;"> to prime the application locally, and we didn’t run the application from our host machine.  All these things are happening within the host machine, and this is a simple express.js demo site.</span></p>
393<h4><b>Step 5b: Verify Running Containers</b></h4>
394<ol>
395<li><span style="font-weight: 400;"><span style="font-weight: 400;"><span style="font-weight: 400;"><span style="font-weight: 400;">We can see running containers using the command:</span></span></span></span>
396<pre class="lang:ps decode:true " title="Docker ps command to list running containers">docker ps
397</pre>
398<p><a href="https://lockmedown.com/wp-content/uploads/2017/01/container-list.png"><img loading="lazy" decoding="async" class="aligncenter size-large wp-image-1854" src="https://lockmedown.com/wp-content/uploads/2017/01/container-list-1024x115.png" alt="List of all docker containers using the docker ps -a command" width="1024" height="115" srcset="https://lockmedown.com/wp-content/uploads/2017/01/container-list-1024x115.png 1024w, https://lockmedown.com/wp-content/uploads/2017/01/container-list-70x8.png 70w, https://lockmedown.com/wp-content/uploads/2017/01/container-list-300x34.png 300w, https://lockmedown.com/wp-content/uploads/2017/01/container-list-768x86.png 768w, https://lockmedown.com/wp-content/uploads/2017/01/container-list-254x29.png 254w, https://lockmedown.com/wp-content/uploads/2017/01/container-list-64x7.png 64w, https://lockmedown.com/wp-content/uploads/2017/01/container-list-220x25.png 220w, https://lockmedown.com/wp-content/uploads/2017/01/container-list-250x28.png 250w, https://lockmedown.com/wp-content/uploads/2017/01/container-list-550x62.png 550w, https://lockmedown.com/wp-content/uploads/2017/01/container-list-400x45.png 400w, https://lockmedown.com/wp-content/uploads/2017/01/container-list-350x39.png 350w, https://lockmedown.com/wp-content/uploads/2017/01/container-list-680x76.png 680w, https://lockmedown.com/wp-content/uploads/2017/01/container-list-848x95.png 848w, https://lockmedown.com/wp-content/uploads/2017/01/container-list-1020x115.png 1020w, https://lockmedown.com/wp-content/uploads/2017/01/container-list.png 1753w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></li>
399<li><span style="font-weight: 400;"><span style="font-weight: 400;">This will show us running containers.  We can also specify the -a flag to see ALL containers. It can be useful when things go wrong and we want to see if a supposedly running container has exited unexpectedly:</span></span>
400<pre class="lang:ps decode:true " title="Docker ps command with -a flag to show all containers">docker ps -a</pre>
401<p>&nbsp;</p>
402<p><a href="https://lockmedown.com/wp-content/uploads/2017/01/docker-all-containers-list.png"><img loading="lazy" decoding="async" class="aligncenter size-large wp-image-1855" src="https://lockmedown.com/wp-content/uploads/2017/01/docker-all-containers-list-1024x103.png" alt="" width="1024" height="103" srcset="https://lockmedown.com/wp-content/uploads/2017/01/docker-all-containers-list-1024x103.png 1024w, https://lockmedown.com/wp-content/uploads/2017/01/docker-all-containers-list-70x7.png 70w, https://lockmedown.com/wp-content/uploads/2017/01/docker-all-containers-list-300x30.png 300w, https://lockmedown.com/wp-content/uploads/2017/01/docker-all-containers-list-768x77.png 768w, https://lockmedown.com/wp-content/uploads/2017/01/docker-all-containers-list-254x26.png 254w, https://lockmedown.com/wp-content/uploads/2017/01/docker-all-containers-list-64x6.png 64w, https://lockmedown.com/wp-content/uploads/2017/01/docker-all-containers-list-220x22.png 220w, https://lockmedown.com/wp-content/uploads/2017/01/docker-all-containers-list-250x25.png 250w, https://lockmedown.com/wp-content/uploads/2017/01/docker-all-containers-list-550x55.png 550w, https://lockmedown.com/wp-content/uploads/2017/01/docker-all-containers-list-400x40.png 400w, https://lockmedown.com/wp-content/uploads/2017/01/docker-all-containers-list-350x35.png 350w, https://lockmedown.com/wp-content/uploads/2017/01/docker-all-containers-list-680x68.png 680w, https://lockmedown.com/wp-content/uploads/2017/01/docker-all-containers-list-848x85.png 848w, https://lockmedown.com/wp-content/uploads/2017/01/docker-all-containers-list-1020x103.png 1020w, https://lockmedown.com/wp-content/uploads/2017/01/docker-all-containers-list.png 1946w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></li>
403</ol>
404<p>&nbsp;</p>
405<h3><b>Step 6: Stopping and Starting Containers</b></h3>
406<p><span style="font-weight: 400;">Stopping a running container is easy as running the…you guessed it:<br />
407</span></p>
408<pre class="lang:ps decode:true" title="Docker stop command">docker stop express-prod-app</pre>
409<p>And starting:</p>
410<pre class="lang:ps decode:true " title="Docker start command">docker start express-prod-app</pre>
411<h3><b>Step 7: Deleting Images and Containers</b></h3>
412<p><span style="font-weight: 400;">As we go through these tutorials, it could come in hand to drop an image or container and start over. Below are the steps to do so.  In addition, further down under the </span><b>Bonus</b><span style="font-weight: 400;"> section, there are a few helpful shortcuts:</span></p>
413<h4><b>Step 7a: Deleting Containers</b></h4>
414<p><span style="font-weight: 400;">To delete a container, we use the remove container &#8220;</span><i><span style="font-weight: 400;">rm</span></i><span style="font-weight: 400;">” command:  </span></p>
415<pre class="lang:ps decode:true " title="Docker rm command to remove a container">docker rm express-prod-app</pre>
416<p>To get the container back, we can use the command we issued before:</p>
417<pre class="lang:c# decode:true" title="Docker Run command">docker run -d --name express-prod-app -p 7000:3000 express-prod-i</pre>
418<h4><b>Step 7b: Deleting Images</b></h4>
419<p><span style="font-weight: 400;">To delete an image, we will use the remove image “</span><i><span style="font-weight: 400;">rmi”</span></i><span style="font-weight: 400;"> command:  </span></p>
420<pre class="lang:ps decode:true" title="Docker rmi command to remove an image">docker rmi express-prod-i</pre>
421<p><span style="font-weight: 400;">To get the image back, we can use the command we issued before:</span></p>
422<pre class="lang:c# decode:true" title="Docker build command ">docker build -t express-prod-i .</pre>
423<div style="background-color: #f7931d; padding: 10px;"><b>TIP</b><span style="font-weight: 400;">: The remove image and container commands can take the image or container ID and even just the first few characters of the ID.  So you have the option to specify either.  (You’ll also see that we do so in the </span><b>Bonus</b><span style="font-weight: 400;"> section.)</span></div>
424<p>&nbsp;</p>
425<h3>BONUS</h3>
426<p><span style="font-weight: 400;">In addition to the steps to delete images and containers, you can also utilize a few helpful shortcuts that have come in handy for me.</span></p>
427<p><strong>Windows Users: </strong>In order for the following commands to be recognized, you&#8217;ll need to execute them in Powershell.</p>
428<h4><b>Delete All Containers</b></h4>
429<p><span style="font-weight: 400;">To delete all the containers, run the following remove “rm” command, but execute the command to return all of the containers within that command:</span></p>
430<pre class="lang:ps decode:true">docker rm $(docker ps -a -q)</pre>
431<p><b>Windows Users:</b> You will need a bash shell to run the following commands.  Mainly because of the GNU make variable references $( ) we use.  You can install something like “<a href="https://msdn.microsoft.com/en-us
431/commandline/wsl/install_guide?f=255&amp;MSPPError=-2147217396">Bash on Ubuntu on Windows</a>” or even GIT bash.  Just remember that a you will need to link up your terminal by running <i>docker-machine env</i> and running the <i>eval</i> command that is listed at the end.</p>
432<h5><b><i>What did we do?</i></b></h5>
433<ol>
434<li style="font-weight: 400;"><span style="font-weight: 400;">We issued the container remove command “</span><i><span style="font-weight: 400;">rm</span></i><span style="font-weight: 400;">” </span></li>
435<li style="font-weight: 400;"><span style="font-weight: 400;">But instead of providing the tag or container ID we provided a list of the containers ID by</span></li>
436<li style="font-weight: 400;"><span style="font-weight: 400;">Providing the ALL (-a) flag along with the QUIET (-q) which only returns numeric container ID’s.</span></li>
437</ol>
438<p>&nbsp;</p>
439<h4><b>Delete All Images</b></h4>
440<p><span style="font-weight: 400;">To delete all the images we can do something similar and use the remove images command “</span><i><span style="font-weight: 400;">rmi”.</span></i></p>
441<pre class="lang:ps decode:true">docker rmi $(docker images -q)</pre>
442<h5><strong><i>What did we do?</i></strong></h5>
443<ol>
444<li style="font-weight: 400;"><span style="font-weight: 400;">Here we used the remove image command but instead gave it a list of docker image ID’s</span></li>
445<li style="font-weight: 400;"><span style="font-weight: 400;">by using the list docker images command</span></li>
446<li style="font-weight: 400;"><span style="font-weight: 400;">and specifying the QUIET (-q) flag which only returns numeric Docker ID&#8217;s.</span></li>
447</ol>
448<p>&nbsp;</p>
449<h4><strong>Docker Cleanup</strong></h4>
450<p>In addition to these specific commands, a more recent command (credit to herrphon) is the prune command that will remove</p>
451<ul>
452<li>Stopped containers</li>
453<li>Images without any containers</li>
454<li>all orphaned volumes</li>
455</ul>
456<ol>
457<li>Run the command:<i>docker system prune</i></li>
458</ol>
459<p>&nbsp;</p>
460<h4><b>Production? I Thought We Were Building a Container for Application Development?</b></h4>
461<p><span style="font-weight: 400;">It doesn’t take a genius to notice that the image we just created we were notifying Express.js and Node.js that we want to run in production.  So what’s the deal?  </span></p>
462<p><span style="font-weight: 400;">Remember how we need to have a base image for any image?  And who wants to have to ‘rebuild’ an image every time we make a change in development to our application?  So we are going to use our production image as a base image for our development image and isolate the development changes to the layered image specified for development.</span></p>
463<p>&nbsp;</p>
464<h3><b>Conclusion</b></h3>
465<p><span style="font-weight: 400;">So, I’ve already dropped a bunch of knowledge about docker.  Creating an image file, building an image and generating a running container of that image.  But we have a lot to go.  </span></p>
466<p><span style="font-weight: 400;">So in the next <a href="https://lockmedown.com/docker-for-developers-create-dev-image/">Docker for Developers post</a> in this series, I’ll tackle creating an image that will be our development version or our application, but based off our production image.  We’ll also look at how we can leverage scripts in our container to help set up the local environment for making changes to our source code.</span></p>
467<p>&nbsp;</p>
468<p>Docker for Devs: Containerizing Your Application has also been published at <a href="http://www.summa.com/blog/docker-for-devs-creating-an-application-development-image">Summa.com</a>.</p>
469
470																				</div>
471					</article>
472
473					<div class="clear"></div>
474
475					
476					<div class="clear"></div>
477
478					<div class="scbg">
479	<h5>Related Posts</h5>
480
481	<div>
482		
483			<div class="scc left">
484									<a class="rmich" href="https://lockmedown.com/debug-docker-containers-using-webstorm/">
485																				<div class="rimc" style="background-image: url('https://lockmedown.com/wp-content/uploads/2017/02/docker-feature-300x105.png')"></div>
486											</a>
487								<div class="scbt">
488					<h5>
489						<a href="https://lockmedown.com/debug-docker-containers-using-webstorm/">
490							Docker for Devs: Debug Docker Containers with WebStorm						</a>
491					</h5>
492                    <span class="scd">
493                        	                        Feb 09, 2017                        	                    		                    /
494	                    	                    		                    By		                    <a href="https://lockmedown.com/author/max-r-mccartygmail-com/">
495			                    Max McCarty		                    </a>
496	                                        </span>
497				</div>
498			</div>
499		
500			<div class="scc left">
501									<a class="rmich" href="https://lockmedown.com/3-powerful-rules-identify-untrusted-data/">
502																				<div class="rimc" style="background-image: url('https://lockmedown.com/wp-content/uploads/2017/02/mask-unvieling-280x160.png')"></div>
503											</a>
504								<div class="scbt">
505					<h5>
506						<a href="https://lockmedown.com/3-powerful-rules-identify-untrusted-data/">
507							3 Simple but Powerful Rules to Identify Your Applications Untrusted Data						</a>
508					</h5>
509                    <span class="scd">
510                        	                        Feb 07, 2017                        	                    		                    /
511	                    	                    		                    By		                    <a href="https://lockmedown.com/author/max-r-mccartygmail-com/">
512			                    Max McCarty		                    </a>
513	                                        </span>
514				</div>
515			</div>
516		
517			<div class="scc left">
518									<a class="rmich" href="https://lockmedown.com/docker-devs-sharing-images-using-docker-hub/">
519																				<div class="rimc" style="background-image: url('https://lockmedown.com/wp-content/uploads/2017/01/docker-feature-3.png')"></div>
520											</a>
521								<div class="scbt">
522					<h5>
523						<a href="https://lockmedown.com/docker-devs-sharing-images-using-docker-hub/">
524							Docker for Devs Part 5: Sharing Images with Your Team Using Docker Hub						</a>
525					</h5>
526                    <span class="scd">
527                        	                        Jan 25, 2017                        	                    		                    /
528	                    	                    		                    By		                    <a href="https://lockmedown.com/author/max-r-mccartygmail-com/">
529			                    Max McCarty		                    </a>
530	                                        </span>
531				</div>
532			</div>
533		
534			<div class="scc left">
535									<a class="rmich" href="https://lockmedown.com/show-9-ddos-history-cyber-weapon-part-1/">
536																				<div class="rimc" style="background-image: url('https://lockmedown.com/wp-content/uploads/2017/01/history-ddos-feature-300x138.png')"></div>
537											</a>
538								<div class="scbt">
539					<h5>
540						<a href="https://lockmedown.com/show-9-ddos-history-cyber-weapon-part-1/">
541							Show 9: DDoS History as a Cyber Weapon Part 1						</a>
542					</h5>
543                    <span class="scd">
544                        	                        Jan 24, 2017                        	                    		                    /
545	                    	                    		                    By		                    <a href="https://lockmedown.com/author/max-r-mccartygmail-com/">
546			                    Max McCarty		                    </a>
547	                                        </span>
548				</div>
549			</div>
550		
551			<div class="scc left">
552									<a class="rmich" href="https://lockmedown.com/docker-devs-multiple-containers-docker-compose/">
553																				<div class="rimc" style="background-image: url('https://lockmedown.com/wp-content/uploads/2017/01/docker-feature-2.png')"></div>
554											</a>
555								<div class="scbt">
556					<h5>
557						<a href="https://lockmedown.com/docker-devs-multiple-containers-docker-compose/">
558							Docker for Devs Part 4: Composing Multi-container Networks with Docker Compose						</a>
559					</h5>
560                    <span class="scd">
561                        	                        Jan 23, 2017                        	                    		                    /
562	                    	                    		                    By		                    <a href="https://lockmedown.com/author/max-r-mccartygmail-com/">
563			                    Max McCarty		                    </a>
564	                                        </span>
565				</div>
566			</div>
567		
568			<div class="scc left">
569									<a class="rmich" href="https://lockmedown.com/docker-tutorial-development-image/">
570																				<div class="rimc" style="background-image: url('https://lockmedown.com/wp-content/uploads/2017/01/docker-feature-1-300x105.png')"></div>
571											</a>
572								<div class="scbt">
573					<h5>
574						<a href="https://lockmedown.com/docker-tutorial-development-image/">
575							Docker for Devs Part 3: Hot Module Reloading and Live Editing in Containers						</a>
576					</h5>
577                    <span class="scd">
578                        	                        Jan 19, 2017                        	                    		                    /
579	                    	                    		                    By		                    <a href="https://lockmedown.com/author/max-r-mccartygmail-com/">
580			                    Max McCarty		                    </a>
581	                                        </span>
582				</div>
583			</div>
584		
585			<div class="scc left">
586									<a class="rmich" href="https://lockmedown.com/docker-for-developers-create-dev-image/">
587																				<div class="rimc" style="background-image: url('https://lockmedown.com/wp-content/uploads/2017/01/d4d-p2-docker-feature-.png')"></div>
588											</a>
589								<div class="scbt">
590					<h5>
591						<a href="https://lockmedown.com/docker-for-developers-create-dev-image/">
592							Docker for Developers Part 2: Creating a Developer Image						</a>
593					</h5>
594                    <span class="scd">
595                        	                        Jan 18, 2017                        	                    		                    /
596	                    	                    		                    By		                    <a href="https://lockmedown.com/author/max-r-mccartygmail-com/">
597			                    Max McCarty		                    </a>
598	                                        </span>
599				</div>
600			</div>
601		
602			<div class="scc left">
603									<a class="rmich" href="https://lockmedown.com/5-steps-handling-untrusted-node-js-data/">
604																				<div class="rimc" style="background-image: url('https://lockmedown.com/wp-content/uploads/2017/02/feature-image-2-300x158.png')"></div>
605											</a>
606								<div class="scbt">
607					<h5>
608						<a href="https://lockmedown.com/5-steps-handling-untrusted-node-js-data/">
609							5 Steps to Handling Untrusted Node.js Data						</a>
610					</h5>
611                    <span class="scd">
612                        	                        Feb 15, 2017                        	                    		                    /
613	                    	                    		                    By		                    <a href="https://lockmedown.com/author/max-r-mccartygmail-com/">
614			                    Max McCarty		                    </a>
615	                                        </span>
616				</div>
617			</div>
618		
619			<div class="scc left">
620									<a class="rmich" href="https://lockmedown.com/securing-node-js-mongodb-security-injection-attacks/">
621																				<div class="rimc" style="background-image: url('https://lockmedown.com/wp-content/uploads/2017/02/feature-image-1-300x158.png')"></div>
622											</a>
623								<div class="scbt">
624					<h5>
625						<a href="https://lockmedown.com/securing-node-js-mongodb-security-injection-attacks/">
626							Securing Node.js: MongoDB Security from Injection Attacks						</a>
627					</h5>
628                    <span class="scd">
629                        	                        Feb 01, 2017                        	                    		                    /
630	                    	                    		                    By		                    <a href="https://lockmedown.com/author/max-r-mccartygmail-com/">
631			                    Max McCarty		                    </a>
632	                                        </span>
633				</div>
634			</div>
635					</div>
636</div>
637
638
639					<div class="clear"></div>
640					
641											<div class="aut">
642	<div class="ha">
643		<span class="left">About the author</span>
644		<ul class="right">
645					</ul>
646		<div class="clear"></div>
647	</div>
648	<div class="ta">
649		<div class="left tai">
650			<div class="auti"
651			     style="background-image: url('https://secure.gravatar.com/avatar/88c24c736b3c52a074c17707bbfecf386b282175d483ed2ee136db4569177e66?s=125&#038;r=g')"></div>
652		</div>
653		<div class="left tat">
654			<h4>Max McCarty</h4>
655
656			<p>
657				Max McCarty is a software developer with a passion for breathing life into big ideas. He is the founder and owner of LockMeDown.com and host of the popular Lock Me Down podcast.			</p>
658		</div>
659		<div class="clear"></div>
660	</div>
661</div>
662					
663											
664<div id="disqus_thread"></div>
665					
666											<div>
667							<div class="spr"></div>
668							<div class="awr ctr pgn">
669																									<a class="page-numbers nxt"
670									   href='https://lockmedown.com/docker-for-developers-create-dev-image/'>&larr;Previous post </a>
671																																	<a class="page-numbers prv"
672									   href='https://lockmedown.com/securing-node-js-managing-sessions-express-js/'>Next post&rarr;</a>
673								
674								<div class="clear"></div>
675							</div>
676						</div>
677									</section>
678				</div>								<div class="sAsCont">
679				<aside class="sAs right">
680							<section id="text-4"><div class="awr scn">			<div class="textwidget"><div style="background-color: #f7931d;padding: 10px;">
681<div style="color: white;">My Pluralsight Course</div>
682<a style="margin:50px 5px 5px 10px" href="https://www.pluralsight.com/authors/max-mccarty"><img class="size-full wp-image-266 alignright" alt="Hardcare Developer Training with Pluralsight" src="https://lockmedown.com/wp-content/uploads/2016/01/pluralsight-banner.png" width="250" height="54"></a>
683
684<br />
685
686<div>
687<a style="color: white;" href="https://app.pluralsight.com/library/courses/securing-node-js-web-app">Securing Your Node.js Web Application</a>
688</div>
689<br />
690<div>
691<a style="color: white;" href="https://www.pluralsight.com/courses/microsoft-azure-access-signatures-getting-started">Getting Started with Microsoft Azure Shared Access Signatures</a>
692</div>
693
694</div></div>
695		</div></section><section id="search-2"><div class="awr scn"><section class="widget search_widget clear">
696	<form action="https://lockmedown.com/" method="get" class="srh">
697		<input type="text" id="search-field" class="search-field"
698		       placeholder="What Are You looking For?" name="s"/>
699		<button type="submit" id="search-button" class="search-button"></button>
700	</form>
701</section>
702</div></section><section id="archives-2"><div class="awr scn"><div class="twr"><p class="ttl">Archives</p></div>
703			<ul>
704					<li><a href='https://lockmedown.com/2017/02/'>February 2017</a></li>
705	<li><a href='https://lockmedown.com/2017/01/'>January 2017</a></li>
706	<li><a href='https://lockmedown.com/2016/12/'>December 2016</a></li>
707	<li><a href='https://lockmedown.com/2016/03/'>March 2016</a></li>
708	<li><a href='https://lockmedown.com/2016/02/'>February 2016</a></li>
709	<li><a href='https://lockmedown.com/2016/01/'>January 2016</a></li>
710	<li><a href='https://lockmedown.com/2015/12/'>December 2015</a></li>
711	<li><a href='https://lockmedown.com/2015/10/'>October 2015</a></li>
712	<li><a href='https://lockmedown.com/2015/09/'>September 2015</a></li>
713	<li><a href='https://lockmedown.com/2015/04/'>April 2015</a></li>
714	<li><a href='https://lockmedown.com/2015/03/'>March 2015</a></li>
715	<li><a href='https://lockmedown.com/2015/02/'>February 2015</a></li>
716	<li><a href='https://lockmedown.com/2015/01/'>January 2015</a></li>
717	<li><a href='https://lockmedown.com/2014/12/'>December 2014</a></li>
718	<li><a href='https://lockmedown.com/2014/11/'>November 2014</a></li>
719	<li><a href='https://lockmedown.com/2014/10/'>October 2014</a></li>
720	<li><a href='https://lockmedown.com/2014/09/'>September 2014</a></li>
721	<li><a href='https://lockmedown.com/2014/06/'>June 2014</a></li>
722	<li><a href='https://lockmedown.com/2014/05/'>May 2014</a></li>
723	<li><a href='https://lockmedown.com/2014/04/'>April 2014</a></li>
724	<li><a href='https://lockmedown.com/2013/10/'>October 2013</a></li>
725			</ul>
726
727			</div></section>						<div class="clear"></div>
728		</aside>
729			</div>
730			
731			<div class="clear"></div>
732			<hr>
733					</div>
734						</div>
735<div class="clear"></div>
736<footer>
737	
738		<div class="ftw">
739						<div class="wrp">
740									<div class="colm twc ">
741						<section id="nav_menu-2"><div class="scn"><div class="twr"><p class="ttl">Links</p></div><div class="menu-custom-main-container"><ul id="menu-custom-main-1" class="menu"><li id="menu-item-1820" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-home menu-item-1820"><a href="https://lockmedown.com/">Home</a></li>
742<li id="menu-item-918" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-918"><a href="https://lockmedown.com/category/cloud/">Cloud</a></li>
743<li id="menu-item-924" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-924"><a href="https://lockmedown.com/category/video/">Videos</a></li>
744<li id="menu-item-921" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-921"><a href="https://lockmedown.com/about/">About</a></li>
745<li id="menu-item-1551" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-1551"><a href="https://lockmedown.com/category/podcast/">Podcast</a></li>
746</ul></div></div></section>					</div>
747									<div class="colm twc lst">
748						
749		<section class="follow_me" id="widget_thrive_follow-2">
750			<div class="scn">
751
752				<div class="twr">
753									</div>
754				<div class="side_body ">
755					<ul>
756						
757							<li class="sm_icons">
758																	<div class="bubb">
759										<div class="bubble">
760																<div id="container-follow-facebook5542">
761						
761<script type="text/javascript">
762							jQuery( document ).ready( function () {
763								jQuery( "#container-follow-facebook5542" ).append( "<iframe style='height:70px !important;' src='//www.facebook.com/plugins/likebox.php?href=https%3A%2F%2Fwww.facebook.com%2Flockmedown&width=292&height=32&colorscheme=light&show_faces=false&header=false&stream=false&show_border=false' id='follow_me_content_fb'></iframe>" );
764							} );
765						</script>
765
766					</div>
767															</div>
768									</div>
769																<a 								   class="sm fb sm-1col"
770								   rel="facebook">
771									<span></span>
772								</a>
773							</li>
774
775						
776							<li class="sm_icons">
777																	<div class="bubb">
778										<div class="bubble">
779																<div id="container-follow-twitter">
780						<a href="http://twitter.com/maxrmccarty"
781						   class="twitter-follow-button" data-show-count="false">Follow
782							@maxrmccarty</a>
783					</div>
784					
784<script>jQuery( window ).on( 'load', function () {
785							ThriveApp.load_script( "twitter" );
786						} );</script>
786
787															</div>
788									</div>
789																<a 								   class="sm twitter sm-1col"
790								   rel="twitter">
791									<span></span>
792								</a>
793							</li>
794
795						
796							<li class="sm_icons">
797																	<div class="bubb">
798										<div class="bubble">
799																<div id="container-follow-gpage">
800						<div class='g-follow' data-width="273" data-href="https://plus.google.com/103033301529621082503"
801						     data-layout="landscape" data-rel="author" id="follow_me_content_gprofile"></div>
802					</div>
803
804															</div>
805									</div>
806																<a 								   class="sm g_plus sm-1col"
807								   rel="gpage">
808									<span></span>
809								</a>
810							</li>
811
812						
813							<li class="sm_icons">
814																	<div class="bubb">
815										<div class="bubble">
816																<div id="container-follow-linkedin">
817						
817<script>
818							jQuery( window ).on( 'load', function () {
819								ThriveApp.load_script( "linkedin" );
820							} );
821						</script>
821
822						
822<script type='IN/MemberProfile' data-format='inline' data-id='https://www.linkedin.com/in/maxmccarty'></script>
822					</div>
823															</div>
824									</div>
825																<a 								   class="sm linkedin sm-1col"
826								   rel="linkedin">
827									<span></span>
828								</a>
829							</li>
830
831						
832							<li class="sm_icons">
833																	<div class="bubb">
834										<div class="bubble">
835																<div id="container-follow-youtube">
836						<div class="g-ytsubscribe"
837						     data-channel="UC39gxztwuvXZe7rIRTQPYaA"
838						     data-channelid="UC39gxztwuvXZe7rIRTQPYaA"
839						     data-layout="full"></div>
840						
840<script>
841							jQuery( window ).on( 'load', function () {
842								ThriveApp.load_script( "youtube" );
843							} );
844						</script>
844
845					</div>
846															</div>
847									</div>
848																<a 								   class="sm youtube sm-2col"
849								   rel="youtube">
850									<span></span>
851								</a>
852							</li>
853
854											</ul>
855					<div class="clear"></div>
856				</div>
857			</div>
858
859							
859<script>jQuery( window ).on( 'load', function () {
860						ThriveApp.load_script( "google" );
861					} );</script>
861
862			
863		</section>
864							</div>
865								<div class="clear"></div>
866			</div>
867		</div>
868
869		<div class="ftm ">
870		<div class="wrp">
871			<p>
872									Copyright text 2017 by Lock Me Down | Security for the Everyday Developer. 													&nbsp;&nbsp;-&nbsp;&nbsp;Designed by					<a href="https://www.thrivethemes.com" target="_blank" style="text-decoration: underline;">Thrive
873						Themes</a>
874					| Powered by <a style="text-decoration: underline;" href="//www.wordpress.org" target="_blank">WordPress</a>
875							</p>
876							<ul id="menu-footer" class="right"><li id="menu-item-1823" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-home menu-item-1823"><a href="https://lockmedown.com/">Home</a></li>
877<li id="menu-item-1824" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-1824"><a href="https://lockmedown.com/about/">Hi, I&#8217;m Max</a></li>
878</ul>						<div class="clear"></div>
879		</div>
880	</div>
881</footer>
882	<div class="iqs">
883		<ul>
884							<li class="fk"
885				    onclick="return ThriveApp.open_share_popup('//www.facebook.com/sharer/sharer.php?u=https://lockmedown.com/docker-4-devs-containerizing-app/', 545, 433);">
886					<a href=""></a></li>
887										<li class="gg"
888				    onclick="return ThriveApp.open_share_popup('https://plus.google.com/share?url=https://lockmedown.com/docker-4-devs-containerizing-app/', 545, 433);">
889					<a href=""></a></li>
890										<li class="lk"
891				    onclick="return ThriveApp.open_share_popup('https://www.linkedin.com/cws/share?url=https://lockmedown.com/docker-4-devs-containerizing-app/', 545, 433);">
892					<a href=""></a></li>
893													<li class="tw"
894				    onclick="return ThriveApp.open_share_popup('https://twitter.com/share?text=Docker for Devs Part 1: Containerizing Your Application:&url=https://lockmedown.com/docker-4-devs-containerizing-app/', 545, 433);">
895					<a href=""></a></li>
896					</ul>
897	</div>
898
899
900<script type="speculationrules">
901{"prefetch":[{"source":"document","where":{"and":[{"href_matches":"/*"},{"not":{"href_matches":["/wp-*.php","/wp-admin/*","/wp-content/uploads/*","/wp-content/*","/wp-content/plugins/*","/wp-content/themes/performag/*","/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]}
902</script>
vendor: 1 bytes, line 902
902
903<script type='text/javascript'>( $ => {
904	/**
905	 * Displays toast message from storage, it is used when the user is redirected after login
906	 */
907	if ( window.sessionStorage ) {
908		$( window ).on( 'tcb_after_dom_ready', () => {
909			const message = sessionStorage.getItem( 'tcb_toast_message' );
910
911			if ( message ) {
912				tcbToast( sessionStorage.getItem( 'tcb_toast_message' ), false );
913				sessionStorage.removeItem( 'tcb_toast_message' );
914			}
915		} );
916	}
917
918	/**
919	 * Displays toast message
920	 *
921	 * @param {string}   message  - message to display
922	 * @param {Boolean}  error    - whether the message is an error or not
923	 * @param {Function} callback - callback function to be called after the message is closed
924	 */
925	function tcbToast( message, error, callback ) {
926		/* Also allow "message" objects */
927		if ( typeof message !== 'string' ) {
928			message = message.message || message.error || message.success;
929		}
930		if ( ! error ) {
931			error = false;
932		}
933		TCB_Front.notificationElement.toggle( message, error ? 'error' : 'success', callback );
934	}
935} )( typeof ThriveGlobal === 'undefined' ? jQuery : ThriveGlobal.$j );
936</script>
936<style type="text/css" id="tve_notification_styles"></style>
937<div class="tvd-toast tve-fe-message" style="display: none">
938	<div class="tve-toast-message tve-success-message">
939		<div class="tve-toast-icon-container">
940			<span class="tve_tick thrv-svg-icon"></span>
941		</div>
942		<div class="tve-toast-message-container"></div>
943	</div>
944</div>
944<script type="text/javascript">var tcb_current_post_lists=JSON.parse('[]'); var tcb_post_lists=tcb_post_lists?[...tcb_post_lists,...tcb_current_post_lists]:tcb_current_post_lists;</script>
944<script id="wp-polyfill-js" src="https://c0.wp.com/c/7.1.2/wp-includes/js/dist/vendor/wp-polyfill.min.js"></script>
vendor: 1 bytes, line 944
944
945<script id="contact-form-7-js-extra">
946var wpcf7 = {"api":{"root":"https://lockmedown.com/wp-json/","namespace":"contact-form-7/v1"}};
947//# sourceURL=contact-form-7-js-extra
948</script>
vendor: 1 bytes, line 948
948
949<script id="contact-form-7-js" src="https://lockmedown.com/wp-content/plugins/contact-form-7/includes/js/index.js?ver=5.5.6"></script>
vendor: 1 bytes, line 949
949
950<script id="disqus_count-js-extra">
951var countVars = {"disqusShortname":"loadingnextlevel"};
952//# sourceURL=disqus_count-js-extra
953</script>
vendor: 1 bytes, line 953
953
954<script id="disqus_count-js" src="https://lockmedown.com/wp-content/plugins/disqus-comment-system/public/js/comment_count.js?ver=3.1.5"></script>
vendor: 1 bytes, line 954
954
955<script id="disqus_embed-js-extra">
956var embedVars = {"disqusConfig":{"integration":"wordpress 3.1.5 7.1.2"},"disqusIdentifier":"1785 https://lockmedown.com/?p=1785","disqusShortname":"loadingnextlevel","disqusTitle":"Docker for Devs Part 1: Containerizing Your Application","disqusUrl":"https://lockmedown.com/docker-4-devs-containerizing-app/","postId":"1785"};
957//# sourceURL=disqus_embed-js-extra
958</script>
vendor: 1 bytes, line 958
958
959<script id="disqus_embed-js" src="https://lockmedown.com/wp-content/plugins/disqus-comment-system/public/js/comment_embed.js?ver=3.1.5"></script>
vendor: 1 bytes, line 959
959
960<script id="tve_frontend_acf-dynamic-elements-js" src="https://lockmedown.com/wp-content/plugins/thrive-visual-editor/editor/js/dist/modules/acf-dynamic-elements.min.js?v=10.8.9.1&#038;ver=10.8.9.1"></script>
vendor: 1 bytes, line 960
960
961<script id="tve_frontend_audio-js" src="https://lockmedown.com/wp-content/plugins/thrive-visual-editor/editor/js/dist/modules/audio.min.js?v=10.8.9.1&#038;ver=10.8.9.1"></script>
vendor: 1 bytes, line 961
961
962<script id="carousel-libs-js" src="https://lockmedown.com/wp-content/plugins/thrive-visual-editor/editor/js/dist/carousel-libs.min.js?ver=10.8.9.1"></script>
vendor: 1 bytes, line 962
962
963<script id="tve_frontend_carousel-js" src="https://lockmedown.com/wp-content/plugins/thrive-visual-editor/editor/js/dist/modules/carousel.min.js?v=10.8.9.1&#038;ver=10.8.9.1"></script>
vendor: 1 bytes, line 963
963
964<script id="tve_frontend_contact-form-compat-js" src="https://lockmedown.com/wp-content/plugins/thrive-visual-editor/editor/js/dist/modules/contact-form-compat.min.js?v=10.8.9.1&#038;ver=10.8.9.1"></script>
vendor: 1 bytes, line 964
964
965<script id="tve_frontend_content-reveal-js" src="https://lockmedown.com/wp-content/plugins/thrive-visual-editor/editor/js/dist/modules/content-reveal.min.js?v=10.8.9.1&#038;ver=10.8.9.1"></script>
vendor: 1 bytes, line 965
965
966<script id="tve_frontend_countdown-js" src="https://lockmedown.com/wp-content/plugins/thrive-visual-editor/editor/js/dist/modules/countdown.min.js?v=10.8.9.1&#038;ver=10.8.9.1"></script>
vendor: 1 bytes, line 966
966
967<script id="tve_frontend_conditional-display-js" src="https://lockmedown.com/wp-content/plugins/thrive-visual-editor/editor/js/dist/modules/conditional-display.min.js?v=10.8.9.1&#038;ver=10.8.9.1"></script>
vendor: 1 bytes, line 967
967
968<script id="tve_frontend_search-form-js" src="https://lockmedown.com/wp-content/plugins/thrive-visual-editor/editor/js/dist/modules/search-form.min.js?v=10.8.9.1&#038;ver=10.8.9.1"></script>
vendor: 1 bytes, line 968
968
969<script id="tve_frontend_dropdown-js" src="https://lockmedown.com/wp-content/plugins/thrive-visual-editor/editor/js/dist/modules/dropdown.min.js?v=10.8.9.1&#038;ver=10.8.9.1"></script>
vendor: 1 bytes, line 969
969
970<script id="tve_frontend_country-js" src="https://lockmedown.com/wp-content/plugins/thrive-visual-editor/editor/js/dist/modules/country.min.js?v=10.8.9.1&#038;ver=10.8.9.1"></script>
vendor: 1 bytes, line 970
970
971<script id="tve_frontend_state-js" src="https://lockmedown.com/wp-content/plugins/thrive-visual-editor/editor/js/dist/modules/state.min.js?v=10.8.9.1&#038;ver=10.8.9.1"></script>
vendor: 1 bytes, line 971
971
972<script id="date-picker-js" src="https://lockmedown.com/wp-content/plugins/thrive-visual-editor/editor/js/dist/date-picker.min.js?ver=10.8.9.1"></script>
vendor: 1 bytes, line 972
972
973<script id="tve_frontend_datepicker-js" src="https://lockmedown.com/wp-content/plugins/thrive-visual-editor/editor/js/dist/modules/datepicker.min.js?v=10.8.9.1&#038;ver=10.8.9.1"></script>
vendor: 1 bytes, line 973
973
974<script id="tve_frontend_divider-js" src="https://lockmedown.com/wp-content/plugins/thrive-visual-editor/editor/js/dist/modules/divider.min.js?v=10.8.9.1&#038;ver=10.8.9.1"></script>
vendor: 1 bytes, line 974
974
975<script id="plupload-js" src="https://c0.wp.com/c/7.1.2/wp-includes/js/plupload/plupload.min.js"></script>
vendor: 1 bytes, line 975
975
976<script id="tve_frontend_file-upload-js" src="https://lockmedown.com/wp-content/plugins/thrive-visual-editor/editor/js/dist/modules/file-upload.min.js?v=10.8.9.1&#038;ver=10.8.9.1"></script>
vendor: 1 bytes, line 976
976
977<script id="google-client-js" src="https://accounts.google.com/gsi/client?ver=10.8.9.1"></script>
vendor: 1 bytes, line 977
977
978<script id="google-api-js" src="https://apis.google.com/js/api.js?ver=10.8.9.1"></script>
vendor: 1 bytes, line 978
978
979<script id="tve_frontend_avatar-picker-js" src="https://lockmedown.com/wp-content/plugins/thrive-visual-editor/editor/js/dist/modules/avatar-picker.min.js?v=10.8.9.1&#038;ver=10.8.9.1"></script>
vendor: 1 bytes, line 979
979
980<script id="tve_frontend_fill-counter-js" src="https://lockmedown.com/wp-content/plugins/thrive-visual-editor/editor/js/dist/modules/fill-counter.min.js?v=10.8.9.1&#038;ver=10.8.9.1"></script>
vendor: 1 bytes, line 980
980
981<script id="tve_frontend_number-counter-js" src="https://lockmedown.com/wp-content/plugins/thrive-visual-editor/editor/js/dist/modules/number-counter.min.js?v=10.8.9.1&#038;ver=10.8.9.1"></script>
vendor: 1 bytes, line 981
981
982<script id="image-gallery-libs-js" src="https://lockmedown.com/wp-content/plugins/thrive-visual-editor/editor/js/dist/image-gallery-libs.min.js?ver=10.8.9.1"></script>
vendor: 1 bytes, line 982
982
983<script id="tve_frontend_image-gallery-js" src="https://lockmedown.com/wp-content/plugins/thrive-visual-editor/editor/js/dist/modules/image-gallery.min.js?v=10.8.9.1&#038;ver=10.8.9.1"></script>
vendor: 1 bytes, line 983
983
984<script id="tve_frontend_lead-generation-js" src="https://lockmedown.com/wp-content/plugins/thrive-visual-editor/editor/js/dist/modules/lead-generation.min.js?v=10.8.9.1&#038;ver=10.8.9.1"></script>
vendor: 1 bytes, line 984
984
985<script id="tve_frontend_login-js" src="https://lockmedown.com/wp-content/plugins/thrive-visual-editor/editor/js/dist/modules/login.min.js?v=10.8.9.1&#038;ver=10.8.9.1"></script>
vendor: 1 bytes, line 985
985
986<script id="tve_frontend_menu-js" src="https://lockmedown.com/wp-content/plugins/thrive-visual-editor/editor/js/dist/modules/menu.min.js?v=10.8.9.1&#038;ver=10.8.9.1"></script>
vendor: 1 bytes, line 986
986
987<script id="tve_frontend_number-counter-compat-js" src="https://lockmedown.com/wp-content/plugins/thrive-visual-editor/editor/js/dist/modules/number-counter-compat.min.js?v=10.8.9.1&#038;ver=10.8.9.1"></script>
vendor: 1 bytes, line 987
987
988<script id="tve_frontend_post-grid-compat-js" src="https://lockmedown.com/wp-content/plugins/thrive-visual-editor/editor/js/dist/modules/post-grid-compat.min.js?v=10.8.9.1&#038;ver=10.8.9.1"></script>
vendor: 1 bytes, line 988
988
989<script id="tve_frontend_pagination-js" src="https://lockmedown.com/wp-content/plugins/thrive-visual-editor/editor/js/dist/modules/pagination.min.js?v=10.8.9.1&#038;ver=10.8.9.1"></script>
vendor: 1 bytes, line 989
989
990<script id="tve_frontend_post-list-js" src="https://lockmedown.com/wp-content/plugins/thrive-visual-editor/editor/js/dist/modules/post-list.min.js?v=10.8.9.1&#038;ver=10.8.9.1"></script>
vendor: 1 bytes, line 990
990
991<script id="tve_frontend_post-list-filter-js" src="https://lockmedown.com/wp-content/plugins/thrive-visual-editor/editor/js/dist/modules/post-list-filter.min.js?v=10.8.9.1&#038;ver=10.8.9.1"></script>
vendor: 1 bytes, line 991
991
992<script id="tve_frontend_pricing-table-js" src="https://lockmedown.com/wp-content/plugins/thrive-visual-editor/editor/js/dist/modules/pricing-table.min.js?v=10.8.9.1&#038;ver=10.8.9.1"></script>
vendor: 1 bytes, line 992
992
993<script id="tve_frontend_progress-bar-js" src="https://lockmedown.com/wp-content/plugins/thrive-visual-editor/editor/js/dist/modules/progress-bar.min.js?v=10.8.9.1&#038;ver=10.8.9.1"></script>
vendor: 1 bytes, line 993
993
994<script id="tve_frontend_social-share-js" src="https://lockmedown.com/wp-content/plugins/thrive-visual-editor/editor/js/dist/modules/social-share.min.js?v=10.8.9.1&#038;ver=10.8.9.1"></script>
vendor: 1 bytes, line 994
994
995<script id="tve_frontend_table-js" src="https://lockmedown.com/wp-content/plugins/thrive-visual-editor/editor/js/dist/modules/table.min.js?v=10.8.9.1&#038;ver=10.8.9.1"></script>
vendor: 1 bytes, line 995
995
996<script id="tve_frontend_tabs-js" src="https://lockmedown.com/wp-content/plugins/thrive-visual-editor/editor/js/dist/modules/tabs.min.js?v=10.8.9.1&#038;ver=10.8.9.1"></script>
vendor: 1 bytes, line 996
996
997<script id="tve_frontend_timer-js" src="https://lockmedown.com/wp-content/plugins/thrive-visual-editor/editor/js/dist/modules/timer.min.js?v=10.8.9.1&#038;ver=10.8.9.1"></script>
vendor: 1 bytes, line 997
997
998<script id="tve_frontend_toc-js" src="https://lockmedown.com/wp-content/plugins/thrive-visual-editor/editor/js/dist/modules/toc.min.js?v=10.8.9.1&#038;ver=10.8.9.1"></script>
vendor: 1 bytes, line 998
998
999<script id="tve_frontend_toggle-js" src="https://lockmedown.com/wp-content/plugins/thrive-visual-editor/editor/js/dist/modules/toggle.min.js?v=10.8.9.1&#038;ver=10.8.9.1"></script>
vendor: 1 bytes, line 999
999
1000<script id="tve_frontend_twitter-js" src="https://lockmedown.com/wp-content/plugins/thrive-visual-editor/editor/js/dist/modules/twitter.min.js?v=10.8.9.1&#038;ver=10.8.9.1"></script>
vendor: 1 bytes, line 1000
1000
1001<script id="tve_frontend_user-profile-js" src="https://lockmedown.com/wp-content/plugins/thrive-visual-editor/editor/js/dist/modules/user-profile.min.js?v=10.8.9.1&#038;ver=10.8.9.1"></script>
vendor: 1 bytes, line 1001
1001
1002<script id="tve_frontend_video-js" src="https://lockmedown.com/wp-content/plugins/thrive-visual-editor/editor/js/dist/modules/video.min.js?v=10.8.9.1&#038;ver=10.8.9.1"></script>
vendor: 1 bytes, line 1002
1002
1003<script id="tve_frontend_google-api-js" src="https://lockmedown.com/wp-content/plugins/thrive-visual-editor/editor/js/dist/modules/google-api.min.js?v=10.8.9.1&#038;ver=10.8.9.1"></script>
vendor: 1 bytes, line 1003
1003
1004<script id="tve_frontend_facebook-api-js" src="https://lockmedown.com/wp-content/plugins/thrive-visual-editor/editor/js/dist/modules/facebook-api.min.js?v=10.8.9.1&#038;ver=10.8.9.1"></script>
vendor: 1 bytes, line 1004
1004
1005<script id="tve_frontend_modal-js" src="https://lockmedown.com/wp-content/plugins/thrive-visual-editor/editor/js/dist/modules/modal.min.js?v=10.8.9.1&#038;ver=10.8.9.1"></script>
vendor: 1 bytes, line 1005
1005
1006<script id="thrive-main-script-js-extra">
1007var ThriveApp = {"ajax_url":"https://lockmedown.com/wp-admin/admin-ajax.php","lazy_load_comments":"1","comments_loaded":"0","theme_uri":"https://lockmedown.com/wp-content/themes/performag","infinite_scroll":"0","is_singular":"1","load_posts_url":"https://lockmedown.com/wp-admin/admin-ajax.php?action=thrive_load_more_posts","load_related_posts_url":"https://lockmedown.com/wp-admin/admin-ajax.php?action=thrive_load_more_related_posts","load_latest_posts_url":"https://lockmedown.com/wp-admin/admin-ajax.php?action=thrive_load_more_latest_posts","current_page":"1","currentPostId":"1785","doShareCountAjax":"","translations":{"ProductDetails":"Product Details"}};
1008//# sourceURL=thrive-main-script-js-extra
1009</script>
vendor: 1 bytes, line 1009
1009
1010<script id="thrive-main-script-js" src="https://lockmedown.com/wp-content/themes/performag/js/script.min.js?ver=7.1.2"></script>
vendor: 1 bytes, line 1010
1010
1011<script id="tve-dash-frontend-js-extra">
1012var tve_dash_front = {"ajaxurl":"https://lockmedown.com/wp-admin/admin-ajax.php","force_ajax_send":"1","is_crawler":"","recaptcha":[],"turnstile":[],"post_id":"1785"};
1013//# sourceURL=tve-dash-frontend-js-extra
1014</script>
vendor: 1 bytes, line 1014
1014
1015<script id="tve-dash-frontend-js" src="https://lockmedown.com/wp-content/plugins/thrive-visual-editor/thrive-dashboard/js/dist/frontend.min.js?ver=10.8.9.1"></script>
vendor: 1 bytes, line 1015
1015
1016<script id="wp-emoji-settings" type="application/json">
1017{"baseUrl":"https://s.w.org/images/core/emoji/17.0.2/72x72/","ext":".png","svgUrl":"https://s.w.org/images/core/emoji/17.0.2/svg/","svgExt":".svg","source":{"concatemoji":"https://lockmedown.com/wp-includes/js/wp-emoji-release.min.js?ver=7.1.2"}}
1018</script>
vendor: 1 bytes, line 1018
1018
1019<script type="module">
1020/*! This file is auto-generated */
1021var e="script#wp-emoji-settings",t=document.querySelector(e);if(!(t instanceof HTMLScriptElement))throw new Error("Element missing: "+e);const r=JSON.parse(t.text),s=(window._wpemojiSettings=r,"wpEmojiSettingsSupports"),o=["flag","emoji"];function i(e){try{var t={supportTests:e,timestamp:(new Date).valueOf()};sessionStorage.setItem(s,JSON.stringify(t))}catch(e){}}function c(e,t,n){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);t=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(n,0,0);const r=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);return t.every((e,t)=>e===r[t])}function p(e,t){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);var n=e.getImageData(16,16,1,1);for(let e=0;e<n.data.length;e++)if(0!==n.data[e])return!1;return!0}function u(e,t,n,r){switch(t){case"flag":return n(e,"\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f","\ud83c\udff3\ufe0f\u200b\u26a7\ufe0f")?!1:!n(e,"\ud83c\udde8\ud83c\uddf6","\ud83c\udde8\u200b\ud83c\uddf6")&&!n(e,"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f","\ud83c\udff4\u200b\udb40\udc67\u200b\udb40\udc62\u200b\udb40\udc65\u200b\udb40\udc6e\u200b\udb40\udc67\u200b\udb40\udc7f");case"emoji":return!r(e,"\ud83e\u1fac8")}return!1}function f(e,t,n,r){let a;const s=(a="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?new OffscreenCanvas(300,150):document.createElement("canvas")).getContext("2d",{willReadFrequently:!0}),o=(s.textBaseline="top",s.font="600 32px Arial",{});return e.forEach(e=>{o[e]=t(s,e,n,r)}),o}function a(e){var t=document.createElement("script");t.src=e,t.defer=!0,document.head.appendChild(t)}r.supports={everything:!0,everythingExceptFlag:!0},new Promise(t=>{let n=function(){try{var e=JSON.parse(sessionStorage.getItem(s));if("object"==typeof e&&"number"==typeof e.timestamp&&(new Date).valueOf()<e.timestamp+604800&&"object"==typeof e.supportTests)return e.supportTests}catch(e){}return null}();if(!n){if("undefined"!=typeof Worker&&"undefined"!=typeof OffscreenCanvas&&"undefined"!=typeof URL&&URL.createObjectURL&&"undefined"!=typeof Blob)try{var e="postMessage("+f.toString()+"("+[JSON.stringify(o),u.toString(),c.toString(),p.toString()].join(",")+"));",r=new Blob([e],{type:"text/javascript"});const a=new Worker(URL.createObjectURL(r),{name:"wpTestEmojiSupports"});return void(a.onmessage=e=>{i(n=e.data),a.terminate(),t(n)})}catch(e){}i(n=f(o,u,c,p))}t(n)}).then(e=>{for(const n in e)r.supports[n]=e[n],r.supports.everything=r.supports.everything&&r.supports[n],"flag"!==n&&(r.supports.everythingExceptFlag=r.supports.everythingExceptFlag&&r.supports[n]);var t;r.supports.everythingExceptFlag=r.supports.everythingExceptFlag&&!r.supports.flag,r.supports.everything||((t=r.source||{}).concatemoji?a(t.concatemoji):t.wpemoji&&t.twemoji&&(a(t.twemoji),a(t.wpemoji)))});
1022//# sourceURL=https://lockmedown.com/wp-includes/js/wp-emoji-loader.min.js
1023</script>
vendor: 1 bytes, line 1023
1023
1024<script type="text/javascript">/*<![CDATA[*/if ( !window.TL_Const ) {var TL_Const={"security":"9b6b4bb651","ajax_url":"https:\/\/lockmedown.com\/wp-admin\/admin-ajax.php","action_conversion":"tve_leads_ajax_conversion","action_impression":"tve_leads_ajax_impression","trigger_based_form_types":["lightbox","screen_filler","slide_in","ribbon"],"custom_post_data":[],"current_screen":{"screen_type":4,"screen_id":1785},"ignored_fields":["email","_captcha_size","_captcha_theme","_captcha_type","_submit_option","_use_captcha","g-recaptcha-response","__tcb_lg_fc","__tcb_lg_msg","_state","_form_type","_error_message_option","_back_url","_submit_option","url","_asset_group","_asset_option","mailchimp_optin","tcb_token","tve_labels","tve_mapping","_api_custom_fields","_sendParams","_autofill"],"ajax_load":0};} else { window.TL_Front && TL_Front.extendConst && TL_Front.extendConst({"security":"9b6b4bb651","ajax_url":"https:\/\/lockmedown.com\/wp-admin\/admin-ajax.php","action_conversion":"tve_leads_ajax_conversion","action_impression":"tve_leads_ajax_impression","trigger_based_form_types":["lightbox","screen_filler","slide_in","ribbon"],"custom_post_data":[],"current_screen":{"screen_type":4,"screen_id":1785},"ignored_fields":["email","_captcha_size","_captcha_theme","_captcha_type","_submit_option","_use_captcha","g-recaptcha-response","__tcb_lg_fc","__tcb_lg_msg","_state","_form_type","_error_message_option","_back_url","_submit_option","url","_asset_group","_asset_option","mailchimp_optin","tcb_token","tve_labels","tve_mapping","_api_custom_fields","_sendParams","_autofill"],"ajax_load":0})} /*]]> */</script>
1024</body>
1025</html>	

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.