0% found this document useful (0 votes)
38 views

Docker Tutorial Dec 2204

Uploaded by

johariqbal
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
38 views

Docker Tutorial Dec 2204

Uploaded by

johariqbal
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 82

Docker Tutorial

Dr. Muhammad Imran


Email: [email protected]

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

Lib, Dependencies, Lib, Dependencies,


Tools Tools

Docker Engine

Operating System

Hardware

21
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
Container Container Container

APP1 APP2 APP3

Lib, Dependencies, Lib, Dependencies, Lib, Dependencies,


Tools Tools Tools

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

It is a simple text file


Container
with instructions to
build an image.

DockerFile Image Container

Single File with all the


dep and lib to run the
Container
program

29
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
Docker Registry

• A Docker registry is a central repository for storing and distributing


Docker images.
• Official docker repo: https://hub.docker.com/

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

DockerFile Image 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

 Update source code (src/static/js/app.js)


 - <p className="text-center">No items yet! Add one above!</p>
 + <p className="text-center">You have no todo items yet! Add one above!</p>

 Build again
 docker build -t getting-started .

 Start new container


 docker run -dp 127.0.0.1:3000:3000 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>

 Now you can start container again.


 docker run -dp 127.0.0.1:3000:3000 getting-started

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

 Login from CLI to docker hub


 docker login -u YOUR-USER-NAME

 Push image to repository


 docker push YOUR-USER-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

 Manually pull image from repository


 docker pull 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

 Remove existing container and start new one [


with the volume
{
 docker run -dp 127.0.0.1:3000:3000 --
"CreatedAt": "2024-02-16T02:18:36Z",
mount type=volume,src=todo-
db,target=/etc/todos getting-started "Driver": "local",

 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",

 You should see previous data "Options": {},

"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

 Create any file in host path and see in the container.


 Delete from container and see from the hostpath should be deleted vice versa.
68
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP
Multi Container Apps

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

 Connect to mysql container


 docker exec -it <mysql-container-id> mysql -u root -p
 mysql> SHOW DATABASES;
 mysql> exit

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

 Connect to mysql container


 docker exec -it <mysql-container-id> mysql -u root –p
 mysql> SHOW DATABASES;
 mysql> exit

 Start new container


 docker run -it --network todo-app nicolaka/netshoot
 dig mysql

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"]

 Limit Container Resource Usage


 docker run --memory="512m" --cpus="1.0" myaapp

82
Workshop on Docker & Kubernetes, 9-13 December 2024, NCP

You might also like