Build a Twelve-Factor Node.js App with Docker

Brought by: egghead.io

Overview

In this course we will take a simple Node.js app that connects to a MongoDB database and uses an Express web server, and learn how to setup a full software development deployment process as well as how to properly “Dockerize” the app.
We’ll step through setting up proper version control techniques, managing configuring within the environment, setting up proper build/deploy/run processes, and all with abiding by Docker best practices. We’ll also make sure our deployment is setup for scale, and have consistent development practices in place for reliable app deployments.

Syllabus

  • Summary & Concepts of the Twelve-Factor App
  • Pin Down NPM Package Versions with Yarn.lock
  • Use Git Flow as a Reliable Version Control Model
  • Manage Configuration Values with Environment Variables
  • Proxy Requests for Local and Remote Service Parity
  • Build, Release and Run Containers with Docker Compose
  • Run Stateless Docker Containers
  • Export Services with Docker Port Binding
  • Scale Docker Horizontally with Nginx Load Balancing
  • Ensure Containers Run with High-Availability
  • Run Consistent Dev, Stage & Prod Docker Environments
  • Pipe Log Output to STDOUT with Docker
  • Run One-Off Docker Containers

Taught by

Mark Shust

Build a Twelve-Factor Node.js App with Docker
Go to course

Build a Twelve-Factor Node.js App with Docker

Brought by: egghead.io

  • egghead.io
  • Paid
  • English
  • Certificate Not Available
  • Available at any time
  • All
  • N/A
8.1.2PHP Version273msRequest Duration2MBMemory UsageGET en/courses/{slug}Route
    • Booting (166ms)
    • Application (107ms)
    • 1 x Booting (60.55%)
      165.60ms
      1 x Application (39.21%)
      107.22ms
      14 templates were rendered
      • public.courses.show (resources/views/public/courses/show.blade.php)3bladefile
        Params
        0
        course
        1
        links
        2
        config
      • public.courses.partials.breadcrumbs (resources/views/public/courses/partials/breadcrumbs.blade.php)6bladefile
        Params
        0
        __env
        1
        app
        2
        errors
        3
        course
        4
        links
        5
        config
      • public.courses.partials.heading (resources/views/public/courses/partials/heading.blade.php)7bladefile
        Params
        0
        __env
        1
        app
        2
        errors
        3
        course
        4
        links
        5
        config
        6
        classes
      • public.courses.partials.details (resources/views/public/courses/partials/details.blade.php)6bladefile
        Params
        0
        __env
        1
        app
        2
        errors
        3
        course
        4
        links
        5
        config
      • public.courses.partials.breadcrumbs (resources/views/public/courses/partials/breadcrumbs.blade.php)6bladefile
        Params
        0
        __env
        1
        app
        2
        errors
        3
        course
        4
        links
        5
        config
      • public.courses.partials.heading (resources/views/public/courses/partials/heading.blade.php)7bladefile
        Params
        0
        __env
        1
        app
        2
        errors
        3
        course
        4
        links
        5
        config
        6
        classes
      • public.layouts.main (resources/views/public/layouts/main.blade.php)6bladefile
        Params
        0
        __env
        1
        app
        2
        errors
        3
        course
        4
        links
        5
        config
      • public.layouts.partials.meta (resources/views/public/layouts/partials/meta.blade.php)6bladefile
        Params
        0
        __env
        1
        app
        2
        errors
        3
        course
        4
        links
        5
        config
      • public.layouts.partials.navbar (resources/views/public/layouts/partials/navbar.blade.php)6bladefile
        Params
        0
        __env
        1
        app
        2
        errors
        3
        course
        4
        links
        5
        config
      • public.auth.profile.partials.links (resources/views/public/auth/profile/partials/links.blade.php)6bladefile
        Params
        0
        __env
        1
        app
        2
        errors
        3
        course
        4
        links
        5
        config
      • public.auth.profile.partials.link (resources/views/public/auth/profile/partials/link.blade.php)8bladefile
        Params
        0
        __env
        1
        app
        2
        errors
        3
        course
        4
        links
        5
        config
        6
        route
        7
        title
      • public.auth.profile.partials.link (resources/views/public/auth/profile/partials/link.blade.php)8bladefile
        Params
        0
        __env
        1
        app
        2
        errors
        3
        course
        4
        links
        5
        config
        6
        route
        7
        title
      • public.auth.profile.partials.link (resources/views/public/auth/profile/partials/link.blade.php)8bladefile
        Params
        0
        __env
        1
        app
        2
        errors
        3
        course
        4
        links
        5
        config
        6
        route
        7
        title
      • public.layouts.partials.flash-session (resources/views/public/layouts/partials/flash-session.blade.php)6bladefile
        Params
        0
        __env
        1
        app
        2
        errors
        3
        course
        4
        links
        5
        config
      uri
      GET en/courses/{slug}
      middleware
      web, localize:en
      controller
      App\Http\Controllers\CourseController@show
      as
      en.courses.show
      namespace
      prefix
      /en
      where
      file
      app/Http/Controllers/CourseController.php:17-35
      6 statements were executed8.44ms
      • select * from `courses` where `slug_en` = 'build-a-twelve-factor-node.js-app-with-docker' limit 1
        6.78ms/app/Http/Controllers/CourseController.php:20corspedia
        Metadata
        Bindings
        • 0. build-a-twelve-factor-node.js-app-with-docker
        Backtrace
        • 17. /app/Http/Controllers/CourseController.php:20
        • 18. /vendor/laravel/framework/src/Illuminate/Routing/Controller.php:54
        • 19. /vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php:43
        • 20. /vendor/laravel/framework/src/Illuminate/Routing/Route.php:260
        • 21. /vendor/laravel/framework/src/Illuminate/Routing/Route.php:205
      • update `courses` set `visitors` = `visitors` + 1, `courses`.`updated_at` = '2025-06-08 10:42:53' where `id` = 2115
        750μs/app/Http/Controllers/CourseController.php:21corspedia
        Metadata
        Bindings
        • 0. 2025-06-08 10:42:53
        • 1. 2115
        Backtrace
        • 17. /app/Http/Controllers/CourseController.php:21
        • 18. /vendor/laravel/framework/src/Illuminate/Routing/Controller.php:54
        • 19. /vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php:43
        • 20. /vendor/laravel/framework/src/Illuminate/Routing/Route.php:260
        • 21. /vendor/laravel/framework/src/Illuminate/Routing/Route.php:205
      • select `id`, `name_en`, `name_ar`, `topic_id`, `slug_en`, `slug_ar` from `subjects` where `subjects`.`id` in (99)
        200μs/app/Http/Controllers/CourseController.php:23corspedia
        Metadata
        Backtrace
        • 20. /app/Http/Controllers/CourseController.php:23
        • 21. /vendor/laravel/framework/src/Illuminate/Routing/Controller.php:54
        • 22. /vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php:43
        • 23. /vendor/laravel/framework/src/Illuminate/Routing/Route.php:260
        • 24. /vendor/laravel/framework/src/Illuminate/Routing/Route.php:205
      • select `id`, `name_en`, `name_ar`, `slug_en`, `slug_ar` from `topics` where `topics`.`id` in (1)
        150μs/app/Http/Controllers/CourseController.php:23corspedia
        Metadata
        Backtrace
        • 25. /app/Http/Controllers/CourseController.php:23
        • 26. /vendor/laravel/framework/src/Illuminate/Routing/Controller.php:54
        • 27. /vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php:43
        • 28. /vendor/laravel/framework/src/Illuminate/Routing/Route.php:260
        • 29. /vendor/laravel/framework/src/Illuminate/Routing/Route.php:205
      • select * from `providers` where `providers`.`id` in (29) and `providers`.`deleted_at` is null
        310μs/app/Http/Controllers/CourseController.php:23corspedia
        Metadata
        Backtrace
        • 20. /app/Http/Controllers/CourseController.php:23
        • 21. /vendor/laravel/framework/src/Illuminate/Routing/Controller.php:54
        • 22. /vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php:43
        • 23. /vendor/laravel/framework/src/Illuminate/Routing/Route.php:260
        • 24. /vendor/laravel/framework/src/Illuminate/Routing/Route.php:205
      • select * from `html_files` where `html_files`.`id` = 2106 limit 1
        250μs/app/Models/Course.php:84corspedia
        Metadata
        Bindings
        • 0. 2106
        Backtrace
        • 21. /app/Models/Course.php:84
        • 28. view::public.courses.show:29
        • 30. /vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php:125
        • 31. /vendor/laravel/framework/src/Illuminate/View/Engines/PhpEngine.php:58
        • 32. /vendor/laravel/framework/src/Illuminate/View/Engines/CompilerEngine.php:72
      App\Models\HtmlFile
      1
      App\Models\Provider
      1
      App\Models\Topic
      1
      App\Models\Subject
      1
      App\Models\Course
      1
        _token
        7wZj4eK1aVkiDlvSAktmk4isDZMVqp4RkFxLesS7
        locale
        en
        _previous
        array:1 [ "url" => "https://www.corspedia.com/en/courses/build-a-twelve-factor-node.js-app-with-do...
        _flash
        array:2 [ "old" => [] "new" => [] ]
        PHPDEBUGBAR_STACK_DATA
        []
        path_info
        /en/courses/build-a-twelve-factor-node.js-app-with-docker
        status_code
        200
        
        status_text
        OK
        format
        html
        content_type
        text/html; charset=UTF-8
        request_query
        []
        
        request_request
        []
        
        request_headers
        0 of 0
        array:24 [ "cf-ipcountry" => array:1 [ 0 => "US" ] "cf-connecting-ip" => array:1 [ 0 => "216.73.216.18" ] "cdn-loop" => array:1 [ 0 => "cloudflare; loops=1" ] "x-forwarded-proto" => array:1 [ 0 => "https" ] "x-forwarded-for" => array:1 [ 0 => "216.73.216.18" ] "sec-fetch-site" => array:1 [ 0 => "none" ] "accept" => array:1 [ 0 => "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7" ] "user-agent" => array:1 [ 0 => "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)" ] "upgrade-insecure-requests" => array:1 [ 0 => "1" ] "sec-ch-ua-platform" => array:1 [ 0 => ""Windows"" ] "sec-ch-ua-mobile" => array:1 [ 0 => "?0" ] "sec-ch-ua" => array:1 [ 0 => ""Chromium";v="130", "HeadlessChrome";v="130", "Not?A_Brand";v="99"" ] "cache-control" => array:1 [ 0 => "no-cache" ] "pragma" => array:1 [ 0 => "no-cache" ] "sec-fetch-dest" => array:1 [ 0 => "document" ] "cf-ray" => array:1 [ 0 => "94c7c8f89c0122e7-ORD" ] "accept-encoding" => array:1 [ 0 => "gzip, br" ] "priority" => array:1 [ 0 => "u=0, i" ] "sec-fetch-user" => array:1 [ 0 => "?1" ] "sec-fetch-mode" => array:1 [ 0 => "navigate" ] "cf-visitor" => array:1 [ 0 => "{"scheme":"https"}" ] "host" => array:1 [ 0 => "www.corspedia.com" ] "content-length" => array:1 [ 0 => "" ] "content-type" => array:1 [ 0 => "" ] ]
        request_server
        0 of 0
        array:50 [ "USER" => "www-data" "HOME" => "/var/www" "HTTP_CF_IPCOUNTRY" => "US" "HTTP_CF_CONNECTING_IP" => "216.73.216.18" "HTTP_CDN_LOOP" => "cloudflare; loops=1" "HTTP_X_FORWARDED_PROTO" => "https" "HTTP_X_FORWARDED_FOR" => "216.73.216.18" "HTTP_SEC_FETCH_SITE" => "none" "HTTP_ACCEPT" => "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7" "HTTP_USER_AGENT" => "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)" "HTTP_UPGRADE_INSECURE_REQUESTS" => "1" "HTTP_SEC_CH_UA_PLATFORM" => ""Windows"" "HTTP_SEC_CH_UA_MOBILE" => "?0" "HTTP_SEC_CH_UA" => ""Chromium";v="130", "HeadlessChrome";v="130", "Not?A_Brand";v="99"" "HTTP_CACHE_CONTROL" => "no-cache" "HTTP_PRAGMA" => "no-cache" "HTTP_SEC_FETCH_DEST" => "document" "HTTP_CF_RAY" => "94c7c8f89c0122e7-ORD" "HTTP_ACCEPT_ENCODING" => "gzip, br" "HTTP_PRIORITY" => "u=0, i" "HTTP_SEC_FETCH_USER" => "?1" "HTTP_SEC_FETCH_MODE" => "navigate" "HTTP_CF_VISITOR" => "{"scheme":"https"}" "HTTP_HOST" => "www.corspedia.com" "REDIRECT_STATUS" => "200" "SERVER_NAME" => "corspedia.com" "SERVER_PORT" => "443" "SERVER_ADDR" => "141.95.147.152" "REMOTE_USER" => "" "REMOTE_PORT" => "29244" "REMOTE_ADDR" => "172.71.255.81" "SERVER_SOFTWARE" => "nginx/1.18.0" "GATEWAY_INTERFACE" => "CGI/1.1" "HTTPS" => "on" "REQUEST_SCHEME" => "https" "SERVER_PROTOCOL" => "HTTP/2.0" "DOCUMENT_ROOT" => "/var/www/corspedia/public" "DOCUMENT_URI" => "/index.php" "REQUEST_URI" => "/en/courses/build-a-twelve-factor-node.js-app-with-docker" "SCRIPT_NAME" => "/index.php" "CONTENT_LENGTH" => "" "CONTENT_TYPE" => "" "REQUEST_METHOD" => "GET" "QUERY_STRING" => "" "SCRIPT_FILENAME" => "/var/www/corspedia/public/index.php" "PATH_INFO" => "" "FCGI_ROLE" => "RESPONDER" "PHP_SELF" => "/index.php" "REQUEST_TIME_FLOAT" => 1749379372.9529 "REQUEST_TIME" => 1749379372 ]
        request_cookies
        []
        
        response_headers
        0 of 0
        array:5 [ "content-type" => array:1 [ 0 => "text/html; charset=UTF-8" ] "cache-control" => array:1 [ 0 => "no-cache, private" ] "date" => array:1 [ 0 => "Sun, 08 Jun 2025 10:42:53 GMT" ] "set-cookie" => array:2 [ 0 => "XSRF-TOKEN=eyJpdiI6Im5CWGs5UWdYWW9YMGQ5MUkvM0hueGc9PSIsInZhbHVlIjoibnV4VkJtSWYyL3hkM0NDazVQZDY0dzhHd0dVT3hVRzRzclVud2xvYmNYTHJYMTdGamc5S29wNFdYS280YVVOaWtZbVMrVDdoUVV6RmoyZHZsa0lza1JXUXkrYlptR2Jzd1gzcVQrbTlRSnNqd2pIeVZIYXZicTdWamd0ZDhNTkciLCJtYWMiOiIxY2MwNjNlM2RlN2I2YzI1N2Q0NTcwZmUyYzAzOGMyMWI4Nzk2NzBjZmRmZDE4NDM5MTQ5NGFhYTAzNDY4NWIzIiwidGFnIjoiIn0%3D; expires=Sun, 08 Jun 2025 12:42:53 GMT; Max-Age=7200; path=/; samesite=laxXSRF-TOKEN=eyJpdiI6Im5CWGs5UWdYWW9YMGQ5MUkvM0hueGc9PSIsInZhbHVlIjoibnV4VkJtSWYyL3hkM0NDazVQZDY0dzhHd0dVT3hVRzRzclVud2xvYmNYTHJYMTdGamc5S29wNFdYS280YVVOaWtZbVMrV" 1 => "laravel_session=eyJpdiI6IldoVVdIWFhEdGViUUNXN2NwR1JhT2c9PSIsInZhbHVlIjoiTGtjZEUrQTdpWGtuTjE3RVkrVTdGa3V5SUNpYk5BdGNWREgzd25HcWtQTms0OXgwZTJ6MElkWk1DWTcyc3ZZeStJdk9NcGZBWlNqVnVWWkZqcEhZY01SM3lJYlRWV05pcGVNdnpDdFVhTi9lUzZXVm4yQ2V5M1JwSm9QTGdqUEUiLCJtYWMiOiJmODYwNDc4NDdhYWVhZGU4MTA4MDM1MGE2OTVkMDUzNDcyYWMzYWYzNTVkOTNlZDdmNDY4Mjg5ZjEwNjMzZTRiIiwidGFnIjoiIn0%3D; expires=Sun, 08 Jun 2025 12:42:53 GMT; Max-Age=7200; path=/; httponly; samesite=laxlaravel_session=eyJpdiI6IldoVVdIWFhEdGViUUNXN2NwR1JhT2c9PSIsInZhbHVlIjoiTGtjZEUrQTdpWGtuTjE3RVkrVTdGa3V5SUNpYk5BdGNWREgzd25HcWtQTms0OXgwZTJ6MElkWk1DWTcyc3ZZeStJ" ] "Set-Cookie" => array:2 [ 0 => "XSRF-TOKEN=eyJpdiI6Im5CWGs5UWdYWW9YMGQ5MUkvM0hueGc9PSIsInZhbHVlIjoibnV4VkJtSWYyL3hkM0NDazVQZDY0dzhHd0dVT3hVRzRzclVud2xvYmNYTHJYMTdGamc5S29wNFdYS280YVVOaWtZbVMrVDdoUVV6RmoyZHZsa0lza1JXUXkrYlptR2Jzd1gzcVQrbTlRSnNqd2pIeVZIYXZicTdWamd0ZDhNTkciLCJtYWMiOiIxY2MwNjNlM2RlN2I2YzI1N2Q0NTcwZmUyYzAzOGMyMWI4Nzk2NzBjZmRmZDE4NDM5MTQ5NGFhYTAzNDY4NWIzIiwidGFnIjoiIn0%3D; expires=Sun, 08-Jun-2025 12:42:53 GMT; path=/XSRF-TOKEN=eyJpdiI6Im5CWGs5UWdYWW9YMGQ5MUkvM0hueGc9PSIsInZhbHVlIjoibnV4VkJtSWYyL3hkM0NDazVQZDY0dzhHd0dVT3hVRzRzclVud2xvYmNYTHJYMTdGamc5S29wNFdYS280YVVOaWtZbVMrV" 1 => "laravel_session=eyJpdiI6IldoVVdIWFhEdGViUUNXN2NwR1JhT2c9PSIsInZhbHVlIjoiTGtjZEUrQTdpWGtuTjE3RVkrVTdGa3V5SUNpYk5BdGNWREgzd25HcWtQTms0OXgwZTJ6MElkWk1DWTcyc3ZZeStJdk9NcGZBWlNqVnVWWkZqcEhZY01SM3lJYlRWV05pcGVNdnpDdFVhTi9lUzZXVm4yQ2V5M1JwSm9QTGdqUEUiLCJtYWMiOiJmODYwNDc4NDdhYWVhZGU4MTA4MDM1MGE2OTVkMDUzNDcyYWMzYWYzNTVkOTNlZDdmNDY4Mjg5ZjEwNjMzZTRiIiwidGFnIjoiIn0%3D; expires=Sun, 08-Jun-2025 12:42:53 GMT; path=/; httponlylaravel_session=eyJpdiI6IldoVVdIWFhEdGViUUNXN2NwR1JhT2c9PSIsInZhbHVlIjoiTGtjZEUrQTdpWGtuTjE3RVkrVTdGa3V5SUNpYk5BdGNWREgzd25HcWtQTms0OXgwZTJ6MElkWk1DWTcyc3ZZeStJ" ] ]
        session_attributes
        0 of 0
        array:5 [ "_token" => "7wZj4eK1aVkiDlvSAktmk4isDZMVqp4RkFxLesS7" "locale" => "en" "_previous" => array:1 [ "url" => "https://www.corspedia.com/en/courses/build-a-twelve-factor-node.js-app-with-docker" ] "_flash" => array:2 [ "old" => [] "new" => [] ] "PHPDEBUGBAR_STACK_DATA" => [] ]