Docker Tutorial Dec 2204
Docker Tutorial Dec 2204
1
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
Topics Overview
• What is Docker?
• Why do we need Docker?
• Images
• Containers
• Docker vs VMs
• Docker Registry
• Docker Commands
• How to Containerize an App?
• Persistence
• Volumes
• Networking
• Docker Compose
2
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
What is Docker?
• Docker is a containerization platform for developing,
packaging, shipping, and running applications.
• It provides the ability to run an application in an isolated
environment called a container.
• Makes deployment and development efficient.
3
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
Why do we need Docker?
4
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
Developer
5
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
6
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
Working Successfully
7
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
Let me test on my
Working Successfully machine
Tester
8
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
Developer
Tester
9
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
But it is
working on
Developer
my machine
Tester
10
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
What is the solution now?
11
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
No worries
We have
Docker
12
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
Developer
13
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
Packaging
Docker Image
Developer
14
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
Tester
Developer
15
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
Tester
Developer
16
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
How did it work?
17
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
Image
• Unit of packaging that contains everything required for the
application to run.
• A running container uses an isolated filesystem.
• This isolated filesystem is provided by an image, and the
image must contain everything needed to run an application
• all dependencies, configurations, scripts, binaries, etc.
• image also contains other configurations for the container, such as
environment variables, a default command to run, and other
metadata.
18
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
Container
• A container is a sandboxed process running on a host machine
that is isolated from all other processes running on that host
machine. To summarize, a container:
• Is a runnable instance of an image. You can create, start, stop, move,
or delete a container using the Docker API or CLI.
• Can be run on local machines, virtual machines, or deployed to the
cloud.
• Is portable (and can be run on any OS).
• Is isolated from other containers and runs its own software, binaries,
configurations, etc.
19
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
Container
APP1
Lib, Dependencies,
Tools
Docker Engine
Operating System
Hardware
20
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
Container Container
APP1 APP2
Docker Engine
Operating System
Hardware
21
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
Container Container Container
Docker Engine
Operating System
Hardware
22
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
App1 App2
V14 V16
23
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
App1
V14
App2
V16
HOST OS Virtualizatio
n
24
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
Container Container
APP1 APP2
V14 V16
Docker Engine
Operating System
Hardware
25
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
Docker vs VMs?
26
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
27
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
Main components of Docker
• Docker Image
• Docker Container
• DockerFile
• Docker Registry
28
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
Instance of an Image
29
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
Docker Registry
30
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
Docker Hub
Or Private Registry
MyAPP v1.0
DockerFile Image
31
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
Docker Hub
Or Private Registry
MyAPP v1.0
32
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
Docker commands
33
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
34
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
35
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
36
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
37
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
38
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
39
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
40
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
41
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
42
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
43
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
44
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
45
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
46
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
47
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
48
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
49
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
50
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
51
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
52
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
53
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
54
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
55
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
56
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
57
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
58
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
Containerize an app
Containerize a single App
Containerize the app/build
docker image build –t app:latest
Run the app
docker container run –d –name c1 –p 80:8080 app:latest
59
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
Example
Clone repository
git clone https://github.com/docker/getting-started-app.git
Contents of repo:
package.json
README.md
spec/
src/
yarn.lock
Create Dockerfile
touch Dockerfile
60
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
Example
Dockerfile
FROM node:18-alpine
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]
EXPOSE 3000
Build image
docker build -t getting-started .
Start app
docker run -dp 127.0.0.1:3000:3000 getting-started
-d is used for running in background and –p is used for port mapping
61
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
Example
After a few seconds, open your web browser to http://localhost:3000
Check running containers
docker ps
Build again
docker build -t getting-started .
Error
docker: Error response from daemon: driver failed programming external connectivity on endpoint
laughing_burnell
(bb242b2ca4d67eba76e79474fb36bb5125708ebdabd7f45c8eaf16caaabde9dd): Bind for 127.0.0.1:3000 failed:
port is already allocated.
62
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
Example
So the solution is to remove the existing container
docker rm -f <the-container-id>
63
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
Repository
Create profile in docker hub
Signup and then login
Create public repository with name getting-started
Delete existing images and then start from downloading from registry
docker run -dp 0.0.0.0:3000:3000 YOUR-USER-NAME/getting-started
64
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
Enable backup, transfer, and
restoration of Docker objects.
65
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
Persist the data
By default, data is not persisted. For example with container restart
everything is deleted from previous container.
How to persist data?
Solution is Container Volumes
Volumes provide the ability to connect specific filesystem paths of the container back to
the host machine.
If you mount a directory in the container, changes in that directory are also seen on the
host machine.
If you mount that same directory across container restarts, you'd see the same files.
66
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
Persistence Example
Create Volume Check volume
docker volume create todo-db docker volume inspect todo-db
Once the container starts up, open the app "Labels": {},
and add a few items to your todo list
"Mountpoint":
Stop and remove container and start a new "/var/lib/docker/volumes/todo-db/_data",
one. "Name": "todo-db",
"Scope": "local"
]
67
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
Bind Mounts
A bind mount is another type of mount, which lets you share a directory from
the host's filesystem into the container.
When working on an application, you can use a bind mount to mount source
code into the container.
The container sees the changes you make to the code immediately, as soon as
you save a file.
This means that you can run processes in the container that watch for
filesystem changes and respond to them.
Run a container with bind volume type.
docker run -it --mount type=bind,src="$(pwd)",target=/src ubuntu bash
69
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
Container Networking
Remember that containers, by default, run in isolation and don't know
anything about other processes or containers on the same machine.
So, how do you allow one container to talk to another? The answer is
networking.
If you place the two containers on the same network, they can talk to each
other.
There are two ways to put a container on a network:
Assign the network when starting the container.
Connect an already running container to a network.
Create network
docker network create todo-app
70
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
Container Networking
Start MySql database container
docker run -d \
--network todo-app --network-alias mysql \
-v todo-mysql-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=secret \
-e MYSQL_DATABASE=todos \
mysql:8.0
71
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
Container Networking
Start MySql database container
docker run -d --network todo-app --network-alias mysql -v
todo-mysql-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=secret -e MYSQL_DATABASE=todos mysql:8.0
72
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
Run App with MySql
The todo app supports the setting of Check log
a few environment variables to Docker logs -f <container_id>
specify MySQL connection settings.
Command Check mysql container to see
entries in database from the app
docker run -dp 127.0.0.1:3000:3000 \
docker exec -it <mysql-container-id>
-w /app -v "$(pwd):/app" \ mysql -p todos
mysql> select * from todo_items;
--network todo-app \
+--------------------------------------
-e MYSQL_HOST=mysql \ +--------------------+-----------+
-e MYSQL_USER=root \ | id | name
| completed |
-e MYSQL_PASSWORD=secret \
+--------------------------------------
-e MYSQL_DB=todos \ +--------------------+-----------+
node:18-alpine \ | c906ff08-60e6-44e6-8f49-
ed56a0853e85 | Do amazing things! |
sh -c "yarn install && yarn run dev“
73
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
Docker Compose
74
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
Docker Compose
Docker Compose is a tool that helps you define and share
multi-container applications.
With Compose, you can create a YAML file to define the
services and with a single command, you can spin everything
up or tear it all down.
Useful links:
Class example: https://docs.docker.com/compose/gettingstarted/
Version check:
https://docs.docker.com/compose/compose-file/compose-versioning
75
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
Features
Multiple isolated environments on a single host
Preserve volume data when containers are created
Only recreate containers that have changed
Variables and moving a composition between
environments
Multiple compose files
The big advantage of using Compose is you can define
your application stack in a file, keep it at the root of your
project repository (it's now version controlled), and easily
enable someone else to contribute to your project.
76
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
YAML File for previous docker command
services: for app
app: docker run -dp
image: node:18-alpine 127.0.0.1:3000:3000 \
command: sh -c "yarn install && yarn run dev" -w /app -v "$(pwd):/app" \
ports:
--network todo-app \
- 127.0.0.1:3000:3000
working_dir: /app -e MYSQL_HOST=mysql \
volumes: -e MYSQL_USER=root \
- ./:/app
-e MYSQL_PASSWORD=secret \
environment:
MYSQL_HOST: mysql -e MYSQL_DB=todos \
MYSQL_USER: root node:18-alpine \
MYSQL_PASSWORD: secret
sh -c "yarn install && yarn run
MYSQL_DB: todos dev"
77
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
YAML File for previous docker command
services: for mysql
app: docker run -d \
# The app service definition --network todo-app --network-alias
mysql: mysql \
image: mysql:8.0 -v todo-mysql-data:/var/lib/mysql \
volumes:
-e MYSQL_ROOT_PASSWORD=secret \
- todo-mysql-data:/var/lib/mysql
environment: -e MYSQL_DATABASE=todos \
MYSQL_ROOT_PASSWORD: secret mysql:8.0
MYSQL_DATABASE: todos
volumes:
todo-mysql-data:
78
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
(compose.yaml)
services:
app:
image: node:18-alpine
command: sh -c "yarn install && yarn run dev"
ports:
- 127.0.0.1:3000:3000
working_dir: /app
volumes:
- ./:/app
environment:
MYSQL_HOST: mysql
MYSQL_USER: root
MYSQL_PASSWORD: secret
MYSQL_DB: todos
mysql:
image: mysql:8.0
volumes:
- todo-mysql-data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: todos
volumes:
todo-mysql-data:
79
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
Docker compose commands
Make sure no other containers are running
Command
docker compose up -d
Output
Creating network "app_default" with the default driver
Creating volume "app_todo-mysql-data" with default driver
Creating app_app_1 ... done
Creating app_mysql_1 ... Done
Check logs
docker compose logs –f
Shutdown
docker compose down
80
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
Docker Images Best practices
Use lightweight base images (e.g., alpine).
Remove unnecessary files after installation (e.g., apt-get clean).
Combine commands in the Dockerfile to reduce layers.
– RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*
Avoid Running Containers as Root
– RUN useradd -m myuser
– USER myuser
Exclude unnecessary files during build
Tag Images Properly
81
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
Docker Images Best practices
Use multistage build
FROM golang:alpine AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp
FROM alpine
COPY --from=builder /app/myapp /myapp
ENTRYPOINT ["/myapp"]
82
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP