Docker & Kubernetes: The Practical Guide

Learn Docker, Docker Compose, Development Setups, Deployment and all about Kubernetes from the ground up!

Start
  1. Courses
  2. Docker & Kubernetes: The Practical Guide

Docker & 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

Section: Getting Started

1. Welcome to the Course (2:32) Preview
2. What Is Docker? (4:42) Preview
3. Why Docker & Containers? (5:59) Preview
4. Join Our Learning Community (1:00) Preview
5. Virtual Machines vs Docker Containers (8:55) Preview
6. Docker Setup - Overview (4:31) Preview
7. Docker Setup - macOS (3:33) Preview
8. Docker Setup - Windows (9:44) Preview
9. Docker Setup - Docker Toolbox for Older Systems (6:51) Preview
10. An Overview of the Docker Tools (3:04) Preview
11. Installing & Configuring an IDE (2:07) Preview
12. Getting Our Hands Dirty! (9:23) Preview
13. Course Outline (4:14) Preview
14. How To Get The Most Out Of This Course (3:24) Preview
15. Course Resources (1:00) Preview

Section: Docker Images & Containers: The Core Building Blocks

16. Module Introduction (1:16)
17. Images & Containers: What and Why? (2:29)
18. Using & Running External (Pre-Built) Images (8:28)
19. Our Goal: A NodeJS App (6:40)
20. Building our own Image with a Dockerfile (11:14)
21. Running a Container based on our own Image (7:58)
22. EXPOSE & A Little Utility Functionality (1:00)
23. Images are Read-Only! (5:51)
24. Understanding Image Layers (8:20)
25. A First Summary (3:18)
26. Quiz 1: Images & Containers (1:00)
27. Managing Images & Containers (2:01)
28. Stopping & Restarting Containers (4:31)
29. Understanding Attached & Detached Containers (7:50)
30. Attaching to an already-running Container (1:00)
31. Entering Interactive Mode (10:44)
32. Deleting Images & Containers (6:26)
33. Removing Stopped Containers Automatically (3:18)
34. A Look Behind the Scenes: Inspecting Images (4:00)
35. Copying Files Into & From A Container (4:57)
36. Naming & Tagging Containers and Images (9:28)
37. Time to Practice: Images & Containers - Problem (4:00)
38. Time to Practice: Images & Containers - Solution (21:26)
39. Sharing Images - Overview (6:37)
40. Pushing Images to DockerHub (10:44)
41. Pulling & Using Shared Images (4:50)
42. Quiz 2: Managing Images & Containers (1:00)
43. Module Summary (5:00)
44. Module Resources (1:00)

Section: Managing Data & Working with Volumes

45. Module Introduction (1:27)
46. Understanding Data Categories / Different Kinds of Data (7:20)
47. Analyzing a Real App (3:02)
48. Building & Understanding the Demo App (8:36)
49. Understanding the Problem (5:25)
50. Introducing Volumes (2:57)
51. A First, Unsuccessful Try (7:45)
52. Named Volumes To The Rescue! (8:35)
53. Removing Anonymous Volumes (1:00)
54. Getting Started With Bind Mounts (Code Sharing) (10:42)
55. Combining & Merging Different Volumes (7:52)
56. A NodeJS-specific Adjustment: Using Nodemon in a Container (7:16)
57. Volumes & Bind Mounts: Summary (5:54)
58. Quiz 3: Volumes & Bind Mounts (1:00)
59. A Look at Read-Only Volumes (5:40)
60. Managing Docker Volumes (7:39)
61. Using "COPY" vs Bind Mounts (3:26)
62. Don't COPY Everything: Using "dockerignore" Files (2:31)
63. Adding more to the .dockerignore File (1:00)
64. Working with Environment Variables & ".env" Files (8:47)
65. Using Build Arguments (ARG) (5:09)
66. Module Summary (5:15)
67. Module Resources (1:00)

Section: Networking: (Cross-)Container Communication

68. Module Introduction (1:16)
69. Case 1: Container to WWW Communication (3:49)
70. Case 2: Container to Local Host Machine Communication (2:13)
71. Case 3: Container to Container Communication (2:40)
72. Analyzing the Demo App (7:50)
73. Creating a Container & Communicating to the Web (WWW) (6:45)
74. Making Container to Host Communication Work (4:37)
75. Container to Container Communication: A Basic Solution (7:06)
76. Introducing Docker Networks: Elegant Container to Container Communication (10:00)
77. How Docker Resolves IP Addresses (2:22)
78. Quiz 4: Docker Container Communication & Networks (1:00)
79. Docker Network Drivers (2:22)
80. Module Summary (1:26)
81. Module Resources (1:00)

Section: Building Multi-Container Applications with Docker

82. Module Introduction (2:08)
83. Our Target App & Setup (10:48)
84. Dockerizing the MongoDB Service (4:26)
85. Dockerizing the Node.js (7:30)
86. Moving the React SPA into a Container (8:26)
87. Adding Docker Networks for Efficient Cross-Container Communication (11:50)
88. Adding Data Persistence to MongoDB with Volumes (8:16)
89. Volumes, Bind Mounts & Polishing for the NodeJS Container (15:02)
90. Live Source Code Updates for the React Container (with Bind Mounts) (6:50)
91. Module Summary (4:43)
92. Module Resources (1:00)

Section: Docker Compose: Elegant Multi-Container Orchestration

93. Module Introduction (3:08)
94. Docker-Compose: What & Why? (4:33)
95. Creating a Compose File (6:17)
96. Diving into the Compose File Configuration (11:20)
97. Docker Compose Up & Down (3:46)
98. Working with Multiple Containers (14:51)
99. Adding Another Container (5:55)
100. Building Images & Understanding Container Names (5:25)
101. Quiz 5: Docker Compose (1:00)
102. Module Summary (2:29)
103. Module Resources (1:00)

Section: Working with "Utility Containers" & Executing Commands In Containers

104. Module Introduction & What are "Utility Containers"? (2:39)
105. Utility Containers: Why would you use them? (3:02)
106. Different Ways of Running Commands in Containers (5:56)
107. Building a First Utility Container (4:51)
108. Utilizing ENTRYPOINT (5:27)
109. Using Docker Compose (6:09)
110. Module Summary (1:31)
111. Module Resources (1:00)

Section: A More Complex Setup: A Laravel & PHP Dockerized Project

112. Module Introduction (2:29)
113. The Target Setup (7:13)
114. Adding a Nginx (Web Server) Container (8:08)
115. Adding a PHP Container (10:43)
116. Adding a MySQL Container (3:21)
117. Adding a Composer Utility Container (3:59)
118. Creating a Laravel App via the Composer Utility Container (3:36)
119. Launching Only Some Docker Compose Services (11:54)
120. Adding More Utility Containers (6:25)
121. Docker Compose with and without Dockerfiles (4:08)
122. Bind Mounts and COPY: When To Use What (14:20)
123. Module Resources (1:00)

Section: Deploying Docker Containers

124. Module Introduction (3:40)
125. From Development To Production (7:12)
126. Deployment Process & Providers (6:26)
127. Getting Started With An Example (4:02)
128. Bind Mounts In Production (5:05)
129. Introducing AWS & EC2 (2:36)
130. Connecting to an EC2 Instance (8:23)
131. Installing Docker on a Virtual Machine (1:56)
132. Installing Docker on Linux in General (1:00)
133. Pushing our local Image to the Cloud (5:34)
134. Running & Publishing the App (on EC2) (10:20)
135. Managing & Updating the Container / Image (5:31)
136. Disadvantages of our Current Approach (4:43)
137. From Manual Deployment to Managed Services (5:46)
138. Important: AWS, Pricing and ECS (1:00)
139. Deploying with AWS ECS: A Managed Docker Container Service (13:59)
140. More on AWS (4:12)
141. Updating Managed Containers (3:28)
142. Preparing a Multi-Container App (10:56)
143. Configuring the NodeJS Backend Container (10:31)
144. Deploying a Second Container & A Load Balancer (9:12)
145. Using a Load Balancer for a Stable Domain (5:16)
146. Using EFS Volumes with ECS (17:53)
147. Our Current Architecture (1:55)
148. Databases & Containers: An Important Consideration (5:16)
149. Moving to MongoDB Atlas (13:45)
150. Using MongoDB Atlas in Production (7:33)
151. Our Updated & Target Architecture (2:25)
152. Understanding a Common Problem (5:34)
153. Creating a "build-only" Container (4:47)
154. Introducing Multi-Stage Builds (7:52)
155. Building a Multi-Stage Image (6:09)
156. Deploying a Standalone Frontend App (15:53)
157. Development vs Production: Differences (3:51)
158. Understanding Multi-Stage Build Targets (2:32)
159. Beyond AWS (2:02)
160. Module Summary (6:43)
161. Module Resources (1:00)

Section: Docker & Containers - A Summary

162. Module Introduction (1:57)
163. Images & Containers (3:36)
164. Key Commands (2:14)
165. Data, Volumes & Networking (3:13)
166. Docker Compose (1:11)
167. Local vs Remote (2:38)
168. Deployment (4:27)
169. Module Resources (1:00)

Section: Getting Started with Kubernetes

170. Module Introduction (2:16)
171. More Problems with Manual Deployment (7:41)
172. Why Kubernetes? (5:12)
173. What Is Kubernetes Exactly? (6:54)
174. Kubernetes: Architecture & Core Concepts (7:37)
175. Kubernetes will NOT manage your Infrastructure! (3:49)
176. A Closer Look at the Worker Nodes (4:21)
177. A Closer Look at the Master Node (2:48)
178. Important Terms & Concepts (3:08)
179. Quiz 6: Kubernetes Core Concepts (1:00)
180. Module Resources (1:00)

Section: Kubernetes in Action - Diving into the Core Concepts

181. Module Introduction (1:25)
182. Kubernetes does NOT manage your Infrastructure (8:41)
183. Kubernetes: Required Setup & Installation Steps (6:26)
184. macOS Setup (7:21)
185. Windows Setup (12:18)
186. Understanding Kubernetes Objects (Resources) (9:06)
187. The "Deployment" Object (Resource) (4:03)
188. A First Deployment - Using the Imperative Approach (12:53)
189. kubectl: Behind The Scenes (2:14)
190. The "Service" Object (Resource) (2:49)
191. Exposing a Deployment with a Service (6:10)
192. Restarting Containers (2:38)
193. Scaling in Action (2:42)
194. Updating Deployments (5:53)
195. Deployment Rollbacks & History (5:40)
196. The Imperative vs The Declarative Approach (4:11)
197. Creating a Deployment Configuration File (Declarative Approach) (6:24)
198. Adding Pod and Container Specs (8:48)
199. Working with Labels & Selectors (4:43)
200. Creating a Service Declaratively (9:28)
201. Updating & Deleting Resources (3:41)
202. Multiple vs Single Config Files (3:43)
203. More on Labels & Selectors (7:49)
204. Liveness Probes (4:11)
205. A Closer Look at the Configuration Options (5:26)
206. Summary (4:26)
207. Module Resources (1:00)

Section: Managing Data & Volumes with Kubernetes

208. Module Introduction (2:22)
209. Starting Project & What We Know Already (4:41)
210. Kubernetes & Volumes - More Than Docker Volumes (3:35)
211. Kubernetes Volumes: Theory & Docker Comparison (6:04)
212. Creating a New Deployment & Service (9:32)
213. Getting Started with Kubernetes Volumes (3:30)
214. A First Volume: The "emptyDir" Type (10:04)
215. A Second Volume: The "hostPath" Type (7:34)
216. Understanding the "CSI" Volume Type (4:07)
217. From Volumes to Persistent Volumes (9:08)
218. Defining a Persistent Volume (9:04)
219. Creating a Persistent Volume Claim (8:10)
220. Using a Claim in a Pod (6:39)
221. Volumes vs Persistent Volumes (6:35)
222. Using Environment Variables (4:48)
223. Environment Variables & ConfigMaps (6:08)
224. Module Summary (2:59)
225. Module Resources (1:00)

Section: Kubernetes Networking

226. Module Introduction (1:21)
227. Starting Project & Our Goal (6:09)
228. Creating a First Deployment (6:57)
229. Another Look at Services (9:38)
230. Multiple Containers in One Pod (8:32)
231. Pod-internal Communication (4:29)
232. Creating Multiple Deployments (5:54)
233. Pod-to-Pod Communication with IP Addresses & Environment Variables (7:27)
234. Using DNS for Pod-to-Pod Communication (5:21)
235. Which Approach Is Best? And a Challenge! (3:09)
236. Challenge Solution (10:06)
237. Adding a Containerized Frontend (14:07)
238. Deploying the Frontend with Kubernetes (7:52)
239. Using a Reverse Proxy for the Frontend (13:57)
240. Module Summary (1:52)
241. Module Resources (1:00)

Section: Kubernetes - Deployment (AWS EKS)

242. Module Introduction (1:49)
243. Deployment Options & Steps (5:42)
244. AWS EKS vs AWS ECS (2:49)
245. Preparing the Starting Project (7:40)
246. A Note on AWS EKS Pricing (1:00)
247. Diving Into AWS (3:05)
248. Creating & Configuring the Kubernetes Cluster with EKS (15:44)
249. Adding Worker Nodes (8:48)
250. Applying Our Kubernetes Config (7:56)
251. Getting Started with Volumes (4:59)
252. Adding EFS as a Volume (with the CSI Volume Type) (4:33)
253. Creating a Persistent Volume for EFS (8:23)
254. Using the EFS Volume (8:08)
255. A Challenge! (3:24)
256. Challenge Solution (14:47)
257. Module Resources (1:00)

Section: Roundup & Next Steps

258. You Learned A Lot! (3:23)
259. Related Topics You Could Explore (7:08)
260. Next Steps! (3:06)
261. Bonus! (1:00)

Course Instructor

Image

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.