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 – 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&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’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&r=g' srcset='https://secure.gravatar.com/avatar/88c24c736b3c52a074c17707bbfecf386b282175d483ed2ee136db4569177e66?s=250&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’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’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 – 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 “</span><i><span style="font-weight: 400;">Dockerfile”</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> </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> </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 â.” 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”</span></i></li> 327</ul> 328<p> </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> </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’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’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> </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. “</span><i><span style="font-weight: 400;">@FOR /f “tokens=*” %i IN (‘docker-machine env’) DO @%i”</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> </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> </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”</span></i><span style="font-weight: 400;"> to our container using the –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”</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> </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> </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 “</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> </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’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&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> </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’s.</span></li> 447</ol> 448<p> </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> </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> </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> </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&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/'>←Previous post </a> 671 <a class="page-numbers prv" 672 href='https://lockmedown.com/securing-node-js-managing-sessions-express-js/'>Next post→</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. - 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’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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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.