This repository has been archived on 2025-06-11. You can view files and clone it, but cannot push or open issues or pull requests.
Files
demystifying-docker-previous/slides.md
Mike Conrad 2deec3e936 Updated
2025-05-14 13:16:25 -04:00

15 KiB

theme, background, title, info, class, drawings, transition, mdc
theme background title info class drawings transition mdc
seriph https://cover.sli.dev Welcome to Slidev ## Slidev Starter Template Presentation slides for developers. Learn more at [Sli.dev](https://sli.dev) text-center
persist
false
slide-left true

Demystifying Docker

A beginners guide to containerization and beyond

Press Space for next page

transition: fade-out

Who am I?

Mike Conrad: Software engineer with 10+ years experience. Started out in Networking and IT, transitioned into Development to solve real world problems. Experience with various frameworks, frontend/backend technologies. Cloud, Kubernetes, Docker, etc.

Started working with containers around 7 years ago.

2 Truths and a lie

- I have 4 cats, 4 chickens, 2 goats, 2 kids, a wife and a dog
- I work in a restaurant part time on the weekends
- I was in hardcore/punk bands in my early 20's
<style> h1 { background-color: #2B90B6; background-image: linear-gradient(45deg, #4EC5D4 10%, #146b8c 20%); background-size: 100%; -webkit-background-clip: text; -moz-background-clip: text; -webkit-text-fill-color: transparent; -moz-text-fill-color: transparent; } </style>

transition: slide-up layout: quote level: 2

What is a container?

> A method for packaging and securely running an application within an application virtualization environment. Also known as an application container or a server application container. [NIST](https://csrc.nist.gov/glossary/term/container)

> A container is a standard unit of software that packages up code and all its dependencies so the application runs quickly and reliably from one computing environment to another. A Docker container image is a lightweight, standalone, executable package of software that includes everything needed to run an application: code, runtime, system tools, system libraries and settings. [Docker](https://www.docker.com/resources/what-container/)

layout: two-cols layoutClass: gap-16

Problems?

  • 📝 It works on my machine?!?! - Code behaves differently in dev, testing, and production due to differences in environment (OS, dependencies, configurations).
  • 🎨 Dependency conflicts - Different applications require conflicting versions of the same dependency (e.g., Python 2 vs 3, different Node versions).
  • 🧑‍💻 Slow and error-prone deployments - Traditional deployments involve manual steps or configuration drift between environments.

::right::

Solutions

  • Containers package the application and its dependencies in a consistent, isolated environment, ensuring it behaves the same everywhere.
  • Containers isolate applications and their dependencies from each other and the host system, preventing conflicts.
  • Containers provide predictable, repeatable, and scriptable deployments through container images.

transition: slide-right layout: two-cols layoutClass: gap-16

Problems?

  • 📝 Inefficient resource usage in virtual machines (VMs) - VMs have high overhead due to running full operating systems, leading to inefficiency.
  • 🎨 Difficult scalability and orchestration - Scaling applications manually is hard and error-prone.
  • 🧑‍💻 Inconsistent development workflows - devs all have different setups, leading to inconsistent builds and bugs.

::right::

Solutions

  • Containers share the host OS kernel and are more lightweight, enabling faster startup and denser packing of applications.
  • Containers integrate well with orchestrators (like Kubernetes), enabling automated scaling, rolling updates, and fault tolerance.
  • Containers standardize development environments using tools like Docker Compose or dev containers.

transition: fade-out layout: two-cols-header title: Differences between VM and Container?

Differences between VM and Containers?

::left::

Virtual Machine

  • Virtualizes hardware
  • Runs a full guest OS (e.g., Linux or Windows)
  • Heavier: includes the OS, libraries, and application
  • Slow to start, uses more resources

Example: Running Ubuntu with Apache inside a VM on a Windows host

::right::

Container

  • Virtualizes at the OS level
  • Shares the host OS kernel
  • Isolates only the application and its dependencies
  • Lightweight: faster startup, lower resource use

Example: Running a Node.js app in a container using the host's Linux kernel


transition: fade-out

Containers vs VM


transition: fade-out

How do they work?

Containers are just processes

If you don't take anything else away from this talk, I hope you walk away with a better understanding of this fundamental. As far as the OS is concerned, a container is just another process/set of processes to the operating system.









transition: fade-out

Container runtimes vs. container engines

While a container runtime is responsible for running containers, a container engine is a broader system that manages even more of the life cycle of containers, including image distribution, container orchestration, and runtime management.

One common misconception is that Docker and container runtimes are the same. While Docker Engine includes a container runtime, it also offers a suite of tools for building, shipping, and running containerized applications, making it much more than just a runtime. source wiz.io


transition: fade-out

Docker: Runtime or engine?!?

Docker Engine uses containerd for managing the container lifecycle, which includes creating, starting, and stopping containers. By default, containerd uses runc as its container runtime.


Wait, aren't they all runtimes? If docker engine uses containerd and containerd uses runc, whats the deal?


**Chatgpt generated content below

🔧 High-Level Definitions

  • Runtime = Low-level component that actually creates and runs containers.

  • Engine = Higher-level component that manages the full container lifecycle (build, run, network, volume, etc.) and talks to the runtime.


transition: fade-out

Breakdown

Docker CLI & Docker API rely on Docker Engine under the hood -> Docker Engine is an engine (High level functionality like managing networking, images, registries, etc) -> Docker Engine relies on containerd runtime to manage lifecyle of containers -> containerd uses runc as the runtime to run containers

Super clear?!

The engine is the higher level component responsible for orchestration and lifecycle management.

The runtime is a component responsible for the low level process execution/isolation.

transition: fade-out

Popular Runtimes

- containerd: An industry-standard container runtime with an emphasis on simplicity, robustness and portability. CNCF Graduated Project. Default runtime used by Docker Engine. By default, containerd uses runc as its container runtime.

-cri-o: Lightweight container runtime for Kubernetes. CNCF Graduated Project

- runc: CLI tool for spawning and running containers on Linux according to the OCI specification. Open Container Initiative


transition: fade-out

What is Docker Desktop?

Docker Desktop is an integrated container development environment for Windows and macOS. It's a packaged product that includes several components:

Component Description
Docker Engine The actual engine that runs and manages containers.
containerd + runc The container runtime stack used by Docker Engine.
VM (e.g. docker-desktop) On macOS and Windows, Linux containers need to run inside a lightweight VM.
Docker CLI Command-line tool to interact with Docker Engine.
Docker Compose Tool for defining and running multi-container apps.
GUI Visual interface for managing containers, volumes, settings, etc.
Kubernetes (optional) Comes with optional single-node K8s cluster for testing.
Networking components Manages host-to-VM and container networking.

transition: fade-out

Alternatives to Docker

  • Podman
  • Firecracker - AWS
  • LXC/LXD - Canonical (Ubuntu)
  • Buildah - Redhat

transition: fade-out layout: two-cols-header

Let's get started

::left::

Windows/Mac

Install Docker Desktop from: https://docs.docker.com/desktop/

::right::

Linux

Find installation instructions for Docker Engine here: https://docs.docker.com/engine/install/ubuntu/


transition: fade-out

Running our first container

First run the container

We are running an nginx webserver container in daemon (background mode). We are forwarding connections from localhost:8088 to port 80 inside the container. This is the default port that nginx is running on.

```shell
$ docker run --rm -p 8088:80 --name nginx-container -d nginx:alpine
```
```shell
$ docker run --rm -p 8088:80 --name nginx-container -d nginx:alpine
cd4302edce965beb95fdb9ecb19ff7432758f1e505d792e368fd401ea9abab65
```
```shell
$ docker container ps
```
```shell
$ docker container ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                                     NAMES
cd4302edce96   nginx:alpine   "/docker-entrypoint.…"   15 seconds ago   Up 14 seconds   0.0.0.0:8088->80/tcp, [::]:8088->80/tcp   nginx-container
```

Now run docker container ps to list running containers


--- transition: fade-out ---

View the logs for our container


```shell
$ docker container logs --follow nginx-container 
```


```shell
$ docker container logs --follow nginx-container 
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Sourcing /docker-entrypoint.d/15-local-resolvers.envsh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2025/04/30 23:02:32 [notice] 1#1: using the "epoll" event method
2025/04/30 23:02:32 [notice] 1#1: nginx/1.27.5
2025/04/30 23:02:32 [notice] 1#1: built by gcc 14.2.0 (Alpine 14.2.0) 
2025/04/30 23:02:32 [notice] 1#1: OS: Linux 6.12.10-76061203-generic
2025/04/30 23:02:32 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1024:524288
2025/04/30 23:02:32 [notice] 1#1: start worker processes
2025/04/30 23:02:32 [notice] 1#1: start worker process 30
2025/04/30 23:02:32 [notice] 1#1: start worker process 31
2025/04/30 23:02:32 [notice] 1#1: start worker process 32
2025/04/30 23:02:32 [notice] 1#1: start worker process 33
2025/04/30 23:02:32 [notice] 1#1: start worker process 34
2025/04/30 23:02:32 [notice] 1#1: start worker process 35
2025/04/30 23:02:32 [notice] 1#1: start worker process 36
2025/04/30 23:02:32 [notice] 1#1: start worker process 37

```

transition: fade-out

Interacting with our container

Now let's try interacting with the Nginx server. By default it should serve a default page.


```shell
# Hitting Ctrl+Z on Linux will put our logs process into the background

$ ^Z
```
```shell
$ ^Z

[1]+  Stopped                 docker container logs --follow nginx-container
```
```shell
# Now send a curl request to localhost:8080.  This should be forwarded to port 80 in our container
$ curl localhost:8088
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
```

transition:fade-out

Topics

  • docker events
  • docker exec
  • docker logs
  • docker container logs --filter name=[regexmatch]
  • ENTRYPOINT vs CMD in Dockerfile
  • Multistage Dockerfile
  • Layer caching
  • Networking between containers and with host
  • Containers are just processes
    • Debugging containers by attaching to namespaces
  • Docker compose
  • Example of frontend/backend/database/proxy
  • EnvironmentPerPr
  • Docker swarm
  • Setting up logging properly
  • Tagging images
  • Security
  • Optimizing images
  • What are containers?
  • What is Docker (set of tooling to make things easier)
  • Difference between runtimes
  • git clone https://github.com/docker/getting-started-todo-app