d o c k e r
images
What am I
containerizing?
How to create my own image?
Dockerfile
FROM Ubuntu 1. OS -
RUN apt-get update Ubuntu
RUN apt-get install python 2. Update apt repo
RUN pip install flask 3. Install dependencies using
RUN pip install flask-mysql apt
COPY . /opt/source-code
4. Install Python dependencies using pip
ENTRYPOINT FLASK_APP=/opt/source-code/app.py flask run 5. Copy source code to /opt folder
6. Run the web server using “flask” command
docker build Dockerfile –t mmumshad/my-custom-app
docker push mmumshad/my-custom-app Docker
Registr
Dockerfile
Dockerfile
INSTRUCTION ARGUMEN
T
Dockerfile
Start from a base OS
FROM Ubuntu or
another image
RUN apt-get update
RUN apt-get install python
Install all dependencies
RUN pip install flask
RUN pip install flask-mysql
COPY . /opt/source-code Copy source
code
ENTRYPOINT FLASK_APP=/opt/source-code/app.py flask run Specify Entrypoint
Layered architecture
Dockerfile docker build Dockerfile –t mmumshad/my-custom-app
FROM Ubuntu Layer 1. Base Ubuntu Layer 120
MB
RUN apt-get update && apt-get –y install python
Layer 2. Changes in apt packages 306 MB
RUN pip install flask flask-mysql
Layer 3. Changes in pip packages 6.3 MB
COPY . /opt/source-code
Layer 4. Source code 229 B
ENTRYPOINT FLASK_APP=/opt/source-code/app.py flask run
Layer 5. Update Entrypoint with “flask” command 0B
Docker build
output
failur
e docker build Dockerfile –t mmumshad/my-custom-app
Layer 1. Base Ubuntu Layer
Layer 2. Changes in apt packages
Layer 3. Changes in pip packages
Layer 4. Source code
Layer 5. Update Entrypoint with “flask” command
What can you containerize?
Containerize
Everything!!!
docker
CMD
vs
ENT RY POI N
T
docker run ubuntu
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
45aacca36850 ubuntu "/bin/bash" 43 seconds ago Exited (0) 41 seconds ago
docker run ubuntu [COMMAND]
docker run ubuntu sleep 5
4
3
2
1
5
FROM Ubuntu
CMD sleep 5
CMD command param1 CMD sleep 5
CMD [“command”, CMD [“sleep”, CMD [“sleep
“param1”] “5”] 5”]
docker build –t ubuntu-sleeper .
2
3
4
5
1
docker run ubuntu-sleeper
FROM Ubuntu
docker run ubuntu-sleeper sleep 10
CMD sleep 5
Command at Startup: sleep 10
FROM Ubuntu
docker run ubuntu-sleeper 1 0
sleep 10
ENTRYPOINT [“sleep”]
Command at Startup:
docker run ubuntu-sleeper
sleep: missing operand
Try 'sleep --help' for more information.
Command at Startup:
d o c k e r
networking
Default networks
Bridg non hos
e e t
docker run ubuntu docker run Ubuntu –-network=none docker run Ubuntu --network=host
5000 5000
Web Web
Web Web Container Container
Containe Container
r
172.17.0.
172.17.0.2 3
172.17.0.
1
Web
docker0 Container
172.17.0.4 172.17.0.
5
Web
Containe Web
r Container
Docker Docker Host
Docker Host
Host
User-defined networks
docker network create \
Web Web –-driver bridge \
Containe Container
r -–subnet 182.18.0.0/16
172.17.0.2
1782.178.0. custom-isolated-network
3
172.17.0. 182.18.0.
1 1
docker0 docker0
172.17.0.4 1782..178..0 docker network ls
..52
Web
Containe Web
r Container
Docker
Host
Inspect Network
docker inspect blissful_hopper
[
{
"Id": "35505f7810d17291261a43391d4b6c0846594d415ce4f4d0a6ffbf9cc5109048",
"Name": "/blissful_hopper",
"NetworkSettings": {
"Bridge": "",
"Gateway":
"172.17.0.1",
"IPAddress":
"172.17.0.6",
"MacAddress": "02:42:ac:11:00:06",
"bridge": {
"Networks": {
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.6",
"MacAddress": "02:42:ac:11:00:06",
}
}
}
]
Embedded DNS
Host IP
mysql.connect( mysql
172.17.0.3 ) web mysql web 172.17.0.2
Container Container
172.17.0.2 172.17.0.3
mysql 172.17.0.3
docker0
DNS
Server
127.0.0.11
Docker Host
d o c k e r
storage
File system
/var/lib/
docker aufs
containers
image
volumes
Layered architecture
Dockerfile Dockerfile2
FROM Ubuntu FROM Ubuntu
RUN apt-get update && apt-get –y install python RUN apt-get update && apt-get –y install python
RUN pip install flask flask-mysql RUN pip install flask flask-mysql
COPY . /opt/source-code COPY app2.py /opt/source-code
ENTRYPOINT FLASK_APP=/opt/source-code/app.py flask ENTRYPOINT FLASK_APP=/opt/source-code/app2.py flask
run run
docker build Dockerfile –t mmumshad/my-custom-app docker build Dockerfile2 –t mmumshad/my-custom-app-2
Layer 1. Base Ubuntu Layer 120 MB Layer 1. Base Ubuntu Layer 0 MB
Layer 2. Changes in apt packages 306 MB Layer 2. Changes in apt packages 0 MB
Layer 3. Changes in pip packages 6.3 MB Layer 3. Changes in pip packages 0 MB
Layer 4. Source code 229 B Layer 4. Source code 229 B
Layer 5. Update Entrypoint 0B Layer 5. Update Entrypoint 0B
Layered architecture
Read Write
Container Layer
Layer 6. Container Layer
docker run mmumshad/my-custom-app
Read Only
Layer 5. Update Entrypoint with “flask” command
Layer 4. Source code
Image Layers Layer 3. Changes in pip packages
Layer 2. Changes in apt packages
Layer 1. Base Ubuntu Layer
docker build Dockerfile –t mmumshad/my-custom-app
COPY-ON-WRITE
Read Write
Container Layer
temp.txt
Read Only
Image Layers app.p
app.py
y
volumes docker run –v data_volume:/var/lib/mysql mysql
docker volume create data_volume docker run –v data_volume2:/var/lib/mysql mysql
/var/lib/ docker run –v /data/mysql:/var/lib/mysql mysql
docker docker run \
–-mount type=bind,source=/data/mysql,target=/var/lib/mysql mysql
data_volume
volumes
Read Write Read Write
/var/lib/mysql /var/lib/mysql
mysql-container layer mysql-container layer
data_volum
e mysql
/var/lib/docker/volumes /data
Read Only
mysql – image layer
Docker Host
Storage drivers
• AUFS
• ZFS
• BTRFS
• Device Mapper
• Overlay
• Overlay2
d o c k e r
compos
e
Docker compose
Public Docker registry - dockerhub
docker run mmumshad/simple-webapp
docker run mongodb
docker run redis:alpine
docker run ansible
docker-compose.yml
services:
web:
i
m
a
g
e
:
“
m
m
u
m
s
h
a
docker-compose up
d
Sample application voting
– application
C
voting-app result-app
python NodeJS
C
CATS DOGS
in-memory DB db 1 0
PostgreSQL
0 0
worker
.NET
docker run
docker run -d --name=redis redis
voting-app result-app
docker run -d --name=db postgres
docker run -d --name=vote –p 5000:80 voting-app
docker run -d --name=result –p 5001:80 result-app in-memory DB db
docker run -d --name=worker worker
worker
docker run --links
docker run -d --name=redis redis
voting-app result-app
docker run -d --name=db postgres
docker run
docker run -d
-d --name=vote
--name=vote –p
–p 5000:80
5000:80 --link redis:redis voting-app
voting-app
docker run -d --name=result –p 5001:80 --link db:db result-app
result-app in-memory DB db
docker run
docker run -d
-d --name=worker
--name=worker --link
workerdb:db --link redis:redis worker
worker
docker compose docker-compose
redis:
docker run -d --name=redis redis image: redis
db:
docker run -d --name=db postgres image: postgres:9.4
vote:
docker run
docker run -d
-d --name=vote
--name=vote –p
–p 5000:80
5000:80 --link redis:redis voting-app
voting-app image: voting-app
ports:
docker run -d --name=result –p 5001:80 --link db:db result-app
result-app - 5000:80
links:
- redis
docker run
docker run -d --name=worker --link
-d --name=worker workerredis:redis --link db:db worker
result:
image: result-up
ports:
- 5001:80
links:
worker: - db
image: worker
links:
- db
- redis
Docker compose - build
docker-compose.yml docker-compose.yml
redis: redis:
image: redis image: redis
db: db:
image: postgres:9.4 image: postgres:9.4
vote: vote:
image: voting-app build: ./vote
ports: ports:
- 5000:80 - 5000:80
links: links:
- redis - redis
result: result:
image: result build: ./result
ports: ports:
- 5001:80 - 5001:80
links: links:
- db - db
worker: worker:
image: worker build: ./worker
links: links:
- db - db
- redis - redis
Docker compose - versions
docker-compose.yml docker-compose.yml docker-compose.yml
redis: version: 2 version: 3
services: services:
image: redis
redis:
db:
image: redis
image: postgres:9.4
db:
vote:
image: postgres:9.4
image: voting-
app vote:
ports: image: voting-
app
- 5000:80
ports:
links:
- 5000:80
--
rreeddiiss depends_on:
- redis
version: 1 version: 2 version: 3
Docker compose
docker-compose.yml
version: 2
services:
redi front-end
s:
i voting-app result-app
m
a - back-end
db: g
image:
e postgres:9.4
networks:
:
- back-end
vote:r
e
image: voting-app redis db
d
networks:
i back-end
s - front-end
- back-end
n
result:
e
image: result
t
networks:
w
o - front-end worker
r - back-end
k
networks: s
:
front-end:
back-end: