Docker & Kubernetes: The Practical Guide
Learn Docker, Docker Compose, Development Setups, Deployment and all about Kubernetes from the ground up!
Start courseDocker & Kubernetes are amongst the most in-demand topics you can learn these days.
Why?
Because they significantly simplify the development and deployment process of both simple and complex software projects. Especially in web development (though not limited to that), Docker can really take you to the next level!
With Docker, you can create and manage so-called "Containers" - basically packages of code and tools required to run that code. These containers allow you to run your programs in a predictable, environment-independent way - no matter where you need to run it.
For modern DevOps but also for local development - on your own or in a team - this is a winner feature since you will no longer have any "but it worked on my machine" discussions. It works inside of a container, hence it works everywhere!
This course will teach you both Docker & Kubernetes from the ground up by using a practice-oriented approach!
We'll explore all key concepts in detail and with practical examples and demos - from images and containers, over volumes and networking all the way up to deployment and Kubernetes Cluster: This course has it all!
In detail, this course includes the following topics:
- A thorough introduction to Docker, containers and why you might want to use it
- Detailed setup instructions for macOS and Windows
- A deep-dive into the core concepts you need to know: Containers & images
- Learn how to create custom images, use existing images and how to run containers based on such images
- Get a detailed overview of the core commands you need when working with Docker
- Learn how to work with data and how to persist data with volumes
- Explore container networking - with the outside world and between multiple containers
- Learn how to work with both single and multi-container projects
- In-depth deployment instructions: Manual deployment and deployment with managed services like AWS ECS
- Understand Kubernetes core concepts & architecture
- Learn how to create Kubernetes resources, deployments, services and how to run your containers with Kubernetes
- Dive deeply into working with data in Kubernetes projects - with different types of volumes
- Kubernetes networking and DNS service discovery
- Learn how to deploy your Kubernetes project (at the example of AWS EKS)
- And much more!
All these topics are taught in great detail with slides and theory but also, most importantly, with many examples and demo!
You'll find tons of demo projects throughout the course - using programming languages like NodeJS, Python or PHP (with Laravel). You don't need to know these languages to follow along though, no worries!
This course is for:
- Everyone who has NOT worked with Docker or Kubernetes at all
- Everyone who is struggling with understanding what exactly Docker is (and why you might want to use it)
- (Web) developers who are interested in advanced development topics
Course content
Section 1Getting Started
- Welcome to the Course2:32
- What Is Docker?4:42
- Why Docker & Containers?5:59
- Join Our Learning Community1:00
- Virtual Machines vs Docker Containers8:55
- Docker Setup - Overview4:31
- Docker Setup - macOS3:33
- Docker Setup - Windows9:44
- Docker Setup - Docker Toolbox for Older Systems6:51
- An Overview of the Docker Tools3:04
- Installing & Configuring an IDE2:07
- Getting Our Hands Dirty!9:23
- Course Outline4:14
- How To Get The Most Out Of This Course3:24
- Course Resources1:00
Section 2Docker Images & Containers: The Core Building Blocks
- Module IntroductionPremium1:16
- Images & Containers: What and Why?Premium2:29
- Using & Running External (Pre-Built) ImagesPremium8:28
- Our Goal: A NodeJS AppPremium6:40
- Building our own Image with a DockerfilePremium11:14
- Running a Container based on our own ImagePremium7:58
- EXPOSE & A Little Utility FunctionalityPremium1:00
- Images are Read-Only!Premium5:51
- Understanding Image LayersPremium8:20
- A First SummaryPremium3:18
- Quiz 1: Images & ContainersPremium1:00
- Managing Images & ContainersPremium2:01
- Stopping & Restarting ContainersPremium4:31
- Understanding Attached & Detached ContainersPremium7:50
- Attaching to an already-running ContainerPremium1:00
- Entering Interactive ModePremium10:44
- Deleting Images & ContainersPremium6:26
- Removing Stopped Containers AutomaticallyPremium3:18
- A Look Behind the Scenes: Inspecting ImagesPremium4:00
- Copying Files Into & From A ContainerPremium4:57
- Naming & Tagging Containers and ImagesPremium9:28
- Time to Practice: Images & Containers - ProblemPremium4:00
- Time to Practice: Images & Containers - SolutionPremium21:26
- Sharing Images - OverviewPremium6:37
- Pushing Images to DockerHubPremium10:44
- Pulling & Using Shared ImagesPremium4:50
- Quiz 2: Managing Images & ContainersPremium1:00
- Module SummaryPremium5:00
- Module ResourcesPremium1:00
Section 3Managing Data & Working with Volumes
- Module IntroductionPremium1:27
- Understanding Data Categories / Different Kinds of DataPremium7:20
- Analyzing a Real AppPremium3:02
- Building & Understanding the Demo AppPremium8:36
- Understanding the ProblemPremium5:25
- Introducing VolumesPremium2:57
- A First, Unsuccessful TryPremium7:45
- Named Volumes To The Rescue!Premium8:35
- Removing Anonymous VolumesPremium1:00
- Getting Started With Bind Mounts (Code Sharing)Premium10:42
- Combining & Merging Different VolumesPremium7:52
- A NodeJS-specific Adjustment: Using Nodemon in a ContainerPremium7:16
- Volumes & Bind Mounts: SummaryPremium5:54
- Quiz 3: Volumes & Bind MountsPremium1:00
- A Look at Read-Only VolumesPremium5:40
- Managing Docker VolumesPremium7:39
- Using "COPY" vs Bind MountsPremium3:26
- Don't COPY Everything: Using "dockerignore" FilesPremium2:31
- Adding more to the .dockerignore FilePremium1:00
- Working with Environment Variables & ".env" FilesPremium8:47
- Using Build Arguments (ARG)Premium5:09
- Module SummaryPremium5:15
- Module ResourcesPremium1:00
Section 4Networking: (Cross-)Container Communication
- Module IntroductionPremium1:16
- Case 1: Container to WWW CommunicationPremium3:49
- Case 2: Container to Local Host Machine CommunicationPremium2:13
- Case 3: Container to Container CommunicationPremium2:40
- Analyzing the Demo AppPremium7:50
- Creating a Container & Communicating to the Web (WWW)Premium6:45
- Making Container to Host Communication WorkPremium4:37
- Container to Container Communication: A Basic SolutionPremium7:06
- Introducing Docker Networks: Elegant Container to Container CommunicationPremium10:00
- How Docker Resolves IP AddressesPremium2:22
- Quiz 4: Docker Container Communication & NetworksPremium1:00
- Docker Network DriversPremium2:22
- Module SummaryPremium1:26
- Module ResourcesPremium1:00
Section 5Building Multi-Container Applications with Docker
- Module IntroductionPremium2:08
- Our Target App & SetupPremium10:48
- Dockerizing the MongoDB ServicePremium4:26
- Dockerizing the Node.jsPremium7:30
- Moving the React SPA into a ContainerPremium8:26
- Adding Docker Networks for Efficient Cross-Container CommunicationPremium11:50
- Adding Data Persistence to MongoDB with VolumesPremium8:16
- Volumes, Bind Mounts & Polishing for the NodeJS ContainerPremium15:02
- Live Source Code Updates for the React Container (with Bind Mounts)Premium6:50
- Module SummaryPremium4:43
- Module ResourcesPremium1:00
Section 6Docker Compose: Elegant Multi-Container Orchestration
- Module IntroductionPremium3:08
- Docker-Compose: What & Why?Premium4:33
- Creating a Compose FilePremium6:17
- Diving into the Compose File ConfigurationPremium11:20
- Docker Compose Up & DownPremium3:46
- Working with Multiple ContainersPremium14:51
- Adding Another ContainerPremium5:55
- Building Images & Understanding Container NamesPremium5:25
- Quiz 5: Docker ComposePremium1:00
- Module SummaryPremium2:29
- Module ResourcesPremium1:00
Section 7Working with "Utility Containers" & Executing Commands In Containers
- Module Introduction & What are "Utility Containers"?Premium2:39
- Utility Containers: Why would you use them?Premium3:02
- Different Ways of Running Commands in ContainersPremium5:56
- Building a First Utility ContainerPremium4:51
- Utilizing ENTRYPOINTPremium5:27
- Using Docker ComposePremium6:09
- Module SummaryPremium1:31
- Module ResourcesPremium1:00
Section 8A More Complex Setup: A Laravel & PHP Dockerized Project
- Module IntroductionPremium2:29
- The Target SetupPremium7:13
- Adding a Nginx (Web Server) ContainerPremium8:08
- Adding a PHP ContainerPremium10:43
- Adding a MySQL ContainerPremium3:21
- Adding a Composer Utility ContainerPremium3:59
- Creating a Laravel App via the Composer Utility ContainerPremium3:36
- Launching Only Some Docker Compose ServicesPremium11:54
- Adding More Utility ContainersPremium6:25
- Docker Compose with and without DockerfilesPremium4:08
- Bind Mounts and COPY: When To Use WhatPremium14:20
- Module ResourcesPremium1:00
Section 9Deploying Docker Containers
- Module IntroductionPremium3:40
- From Development To ProductionPremium7:12
- Deployment Process & ProvidersPremium6:26
- Getting Started With An ExamplePremium4:02
- Bind Mounts In ProductionPremium5:05
- Introducing AWS & EC2Premium2:36
- Connecting to an EC2 InstancePremium8:23
- Installing Docker on a Virtual MachinePremium1:56
- Installing Docker on Linux in GeneralPremium1:00
- Pushing our local Image to the CloudPremium5:34
- Running & Publishing the App (on EC2)Premium10:20
- Managing & Updating the Container / ImagePremium5:31
- Disadvantages of our Current ApproachPremium4:43
- From Manual Deployment to Managed ServicesPremium5:46
- Important: AWS, Pricing and ECSPremium1:00
- Deploying with AWS ECS: A Managed Docker Container ServicePremium13:59
- More on AWSPremium4:12
- Updating Managed ContainersPremium3:28
- Preparing a Multi-Container AppPremium10:56
- Configuring the NodeJS Backend ContainerPremium10:31
- Deploying a Second Container & A Load BalancerPremium9:12
- Using a Load Balancer for a Stable DomainPremium5:16
- Using EFS Volumes with ECSPremium17:53
- Our Current ArchitecturePremium1:55
- Databases & Containers: An Important ConsiderationPremium5:16
- Moving to MongoDB AtlasPremium13:45
- Using MongoDB Atlas in ProductionPremium7:33
- Our Updated & Target ArchitecturePremium2:25
- Understanding a Common ProblemPremium5:34
- Creating a "build-only" ContainerPremium4:47
- Introducing Multi-Stage BuildsPremium7:52
- Building a Multi-Stage ImagePremium6:09
- Deploying a Standalone Frontend AppPremium15:53
- Development vs Production: DifferencesPremium3:51
- Understanding Multi-Stage Build TargetsPremium2:32
- Beyond AWSPremium2:02
- Module SummaryPremium6:43
- Module ResourcesPremium1:00
Section 10Docker & Containers - A Summary
- Module IntroductionPremium1:57
- Images & ContainersPremium3:36
- Key CommandsPremium2:14
- Data, Volumes & NetworkingPremium3:13
- Docker ComposePremium1:11
- Local vs RemotePremium2:38
- DeploymentPremium4:27
- Module ResourcesPremium1:00
Section 11Getting Started with Kubernetes
- Module IntroductionPremium2:16
- More Problems with Manual DeploymentPremium7:41
- Why Kubernetes?Premium5:12
- What Is Kubernetes Exactly?Premium6:54
- Kubernetes: Architecture & Core ConceptsPremium7:37
- Kubernetes will NOT manage your Infrastructure!Premium3:49
- A Closer Look at the Worker NodesPremium4:21
- A Closer Look at the Master NodePremium2:48
- Important Terms & ConceptsPremium3:08
- Quiz 6: Kubernetes Core ConceptsPremium1:00
- Module ResourcesPremium1:00
Section 12Kubernetes in Action - Diving into the Core Concepts
- Module IntroductionPremium1:25
- Kubernetes does NOT manage your InfrastructurePremium8:41
- Kubernetes: Required Setup & Installation StepsPremium6:26
- macOS SetupPremium7:21
- Windows SetupPremium12:18
- Understanding Kubernetes Objects (Resources)Premium9:06
- The "Deployment" Object (Resource)Premium4:03
- A First Deployment - Using the Imperative ApproachPremium12:53
- kubectl: Behind The ScenesPremium2:14
- The "Service" Object (Resource)Premium2:49
- Exposing a Deployment with a ServicePremium6:10
- Restarting ContainersPremium2:38
- Scaling in ActionPremium2:42
- Updating DeploymentsPremium5:53
- Deployment Rollbacks & HistoryPremium5:40
- The Imperative vs The Declarative ApproachPremium4:11
- Creating a Deployment Configuration File (Declarative Approach)Premium6:24
- Adding Pod and Container SpecsPremium8:48
- Working with Labels & SelectorsPremium4:43
- Creating a Service DeclarativelyPremium9:28
- Updating & Deleting ResourcesPremium3:41
- Multiple vs Single Config FilesPremium3:43
- More on Labels & SelectorsPremium7:49
- Liveness ProbesPremium4:11
- A Closer Look at the Configuration OptionsPremium5:26
- SummaryPremium4:26
- Module ResourcesPremium1:00
Section 13Managing Data & Volumes with Kubernetes
- Module IntroductionPremium2:22
- Starting Project & What We Know AlreadyPremium4:41
- Kubernetes & Volumes - More Than Docker VolumesPremium3:35
- Kubernetes Volumes: Theory & Docker ComparisonPremium6:04
- Creating a New Deployment & ServicePremium9:32
- Getting Started with Kubernetes VolumesPremium3:30
- A First Volume: The "emptyDir" TypePremium10:04
- A Second Volume: The "hostPath" TypePremium7:34
- Understanding the "CSI" Volume TypePremium4:07
- From Volumes to Persistent VolumesPremium9:08
- Defining a Persistent VolumePremium9:04
- Creating a Persistent Volume ClaimPremium8:10
- Using a Claim in a PodPremium6:39
- Volumes vs Persistent VolumesPremium6:35
- Using Environment VariablesPremium4:48
- Environment Variables & ConfigMapsPremium6:08
- Module SummaryPremium2:59
- Module ResourcesPremium1:00
Section 14Kubernetes Networking
- Module IntroductionPremium1:21
- Starting Project & Our GoalPremium6:09
- Creating a First DeploymentPremium6:57
- Another Look at ServicesPremium9:38
- Multiple Containers in One PodPremium8:32
- Pod-internal CommunicationPremium4:29
- Creating Multiple DeploymentsPremium5:54
- Pod-to-Pod Communication with IP Addresses & Environment VariablesPremium7:27
- Using DNS for Pod-to-Pod CommunicationPremium5:21
- Which Approach Is Best? And a Challenge!Premium3:09
- Challenge SolutionPremium10:06
- Adding a Containerized FrontendPremium14:07
- Deploying the Frontend with KubernetesPremium7:52
- Using a Reverse Proxy for the FrontendPremium13:57
- Module SummaryPremium1:52
- Module ResourcesPremium1:00
Section 15Kubernetes - Deployment (AWS EKS)
- Module IntroductionPremium1:49
- Deployment Options & StepsPremium5:42
- AWS EKS vs AWS ECSPremium2:49
- Preparing the Starting ProjectPremium7:40
- A Note on AWS EKS PricingPremium1:00
- Diving Into AWSPremium3:05
- Creating & Configuring the Kubernetes Cluster with EKSPremium15:44
- Adding Worker NodesPremium8:48
- Applying Our Kubernetes ConfigPremium7:56
- Getting Started with VolumesPremium4:59
- Adding EFS as a Volume (with the CSI Volume Type)Premium4:33
- Creating a Persistent Volume for EFSPremium8:23
- Using the EFS VolumePremium8:08
- A Challenge!Premium3:24
- Challenge SolutionPremium14:47
- Module ResourcesPremium1:00
Section 16Roundup & Next Steps
- You Learned A Lot!Premium3:23
- Related Topics You Could ExplorePremium7:08
- Next Steps!Premium3:06
- Bonus!Premium1:00
Course instructor
Maximilian Schwarzmüller
As a self-taught professional I really know the hard parts and the difficult topics when learning new or improving on already-known languages. This background and experience enable me to focus on the most relevant key concepts and topics. My track record of many 5-star rated courses, more than 1,000,000 students worldwide as well as a successful YouTube channel is the best proof for that.
The most rewarding experience for me is to see how people find new, better jobs, build awesome web applications, work on amazing projects or simply enjoy their hobby with the help of my content. That's why, together with Manuel Lorenz, I founded Academind to offer the best possible learning experience and to share the pleasure of learning with our students.