Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
Lorem Ipsum Dolor
Docker by Example
Ganesh & Hari
ganesh@codeops.tech
hari@codeops.tech
What is Docker?
Source: https://en.wikipedia.org/wiki/Docker_(software)
Docker is an open-source project
that automates the deployment of
applications inside software
containers.
“an open platform for developers and
sysadmins to build, ship, and run
distributed applications”
VMs vs. Docker
Docker accesses virtualisation features of Linux
Docker architecture
Getting Started
Where do I go to get Docker to install it?
Install it from “https://www.docker.com/products/overview"
Where do I get official Docker images?
From “https://hub.docker.com/explore/"
How to find my Docker version?
How to find my Docker version?
$ docker -v
Docker version 1.12.0-rc4, build e4a0dbc, experimental
How to find details of my Docker installation?
Can I install Docker from commandline?
Yes! from get.docker.com
# This script is meant for quick & easy install via:
# 'curl -sSL https://get.docker.com/ | sh'
# or:
# 'wget -qO- https://get.docker.com/ | sh'
How to do “hello world” in Docker?
$ docker run docker/whalesay cowsay Hello world
How to do “hello world” in Docker?
$ docker run docker/whalesay cowsay "Hello world"
Runs a command
in a new container
Base image for
creating the container
Command name to
run within the container
Argument to the
“cowsay” command
How to do “hello world” in Docker?
$ docker run -it hello-world
$ docker run -it hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker Hub account:
https://hub.docker.com
For more examples and ideas, visit:
https://docs.docker.com/engine/userguide/
The term “Docker” can be confusing: the
client and the daemon both are called
Docker!
How to get help on commands to use?
Use “docker -h” command, as in:
$ docker -h
Usage: docker [OPTIONS] COMMAND [arg...]
docker [ --help | -v | --version ]
A self-sufficient runtime for containers.
Options:
--config=~/.docker Location of client config files
-D, --debug Enable debug mode
-H, --host=[] Daemon socket(s) to connect to
-h, --help Print usage
-l, --log-level=info Set the logging level
…
Commands:
attach Attach to a running container
Docker commands look like Linux
commands - so familiarity with Linux
commands can really help to get up to
speed quickly with Docker.
Docker Images
How to get list of images?
How to search for an image?
How to get an image?
Use “docker pull <image_name>” command
In my case debian image was
already pulled. If it were not there,
Docker would have pulled it afresh
How to get details of an image?
Use “docker inspect <image_name>” command
docker inspect debian
[
{
"Id": "sha256:1b088884749bd93867ddb48ff404d4bbff09a17af8d95bc863efa5d133f87b78",
"RepoTags": [
"debian:latest"
],
"RepoDigests": [
"debian@sha256:8b1fc3a7a55c42e3445155b2f8f40c55de5f8bc8012992b26b570530c4bded9e"
],
"Parent": "",
"Comment": "",
"Created": "2016-06-09T21:28:43.776404816Z",
"Container": "2f3dcd897cf758418389d50784c73b43b1fd7db09a80826329496f05eef7b377",
"ContainerConfig": {
"Hostname": "6250540837a8",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
// ...
How to see “layers” in an image?
Use “docker history <image_name>” command
Each of these lines are layers and the
size column shows the exact size of
each layer in the image
How can I load and store images?
Use “docker save” and “docker load” commands
How do I delete an image?
Use “docker rmi <image-tag>”
$ docker images alpine
REPOSITORY TAG IMAGE ID CREATED SIZE
alpine latest 4e38e38c8ce0 4 weeks ago 4.799 MB
$ docker rmi alpine
Untagged: alpine:latest
Untagged: alpine@sha256:3dcdb92d7432d56604d4545cbd324b14e647b313626d99b889d0626de158f73a
$ docker images alpine
REPOSITORY TAG IMAGE ID CREATED SIZE
How to delete all docker images?
Use “$docker rmi $(docker images -q)”
docker images -q
lists all image ids
How to find “dangling images”?
Use “docker images -f "dangling=true"”
$ docker images -f "dangling=true"
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 777f9424d24d 7 minutes ago 125.2 MB
<none> <none> 3d02168f00fc 12 days ago 34.22 MB
<none> <none> 0f192147631d 3 weeks ago 132.8 MB
How to remove “dangling images”?
Use “docker rmi $(docker images -f "dangling=true" -q)”
How can I create my own Docker image?
Create “Dockerfile” - its like Makefile for Docker
$ cat myimage/Dockerfile
FROM ubuntu
RUN echo "my first image" > /tmp/first.txt
$ docker build myimage
Sending build context to Docker daemon 2.048 kB
Step 1 : FROM ubuntu
---> ac526a356ca4
Step 2 : RUN echo "my first image" > /tmp/first.txt
---> Running in 18f62f47d2c8
---> 777f9424d24d
Removing intermediate container 18f62f47d2c8
Successfully built 777f9424d24d
$ docker images | grep 777f9424d24d
<none> <none> 777f9424d24d 4 minutes ago 125.2 MB
$ docker run -it 777f9424d24d
root@2dcd9d0caf6f:/# ls
bin boot core dev etc home lib lib64 media mnt opt proc root run sbin srv
sys tmp usr var
root@2dcd9d0caf6f:/# cat /tmp/first.txt
my first image
root@2dcd9d0caf6f:/# exit
exit
$
How to name/tag an image when building?
Use “docker build <<dirname>> -t"imagename:tag"” command
$ docker build myimage -t"myfirstimage:latest"
Sending build context to Docker daemon 2.048 kB
Step 1 : FROM ubuntu
---> ac526a356ca4
Step 2 : RUN echo "my first image" > /tmp/first.txt
---> Using cache
---> 777f9424d24d
Successfully built 777f9424d24d
$ docker images myfirstimage
REPOSITORY TAG IMAGE ID CREATED SIZE
myfirstimage latest 777f9424d24d 58 minutes ago 125.2 MB
$
Docker Containers
How to get list of containers?
How to run a container?
Use “docker run OPTIONS <<image-tag>> CMD ARGS”
docker run fedora /bin/echo 'Hello world'
Command name
Image name
Command
argument
$ docker run fedora /bin/echo 'Hello world'
Hello world
$
How to run a container interactively?
$ docker run -t -i fedora /bin/bash
[root@00eef5289c91 /]# pwd
/
[root@00eef5289c91 /]# whoami
root
[root@00eef5289c91 /]# ls
bin boot dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv
sys tmp usr var
[root@00eef5289c91 /]# cc
bash: cc: command not found
[root@00eef5289c91 /]# gcc
bash: gcc: command not found
[root@00eef5289c91 /]# java
bash: java: command not found
[root@00eef5289c91 /]# tar
bash: tar: command not found
[root@00eef5289c91 /]# exit
exit
$
docker run -t -i fedora /bin/bash
Create a terminal
to interact with
short for “—interactive"
How to run a container in the background?
$ docker run -d ubuntu /bin/sh -c "while true; do echo current date and time is: $(date); sleep
10; done"
9128bf57e03c3b32f0bf784a92332953996236d7e358a77c62c10bdec95fd5b9
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS
PORTS NAMES
9128bf57e03c ubuntu "/bin/sh -c 'while tr" About a minute ago Up About a
minute lonely_einstein
$ docker logs 9128bf57e03c3b32f0bf784a92332953996236d7e358a77c62c10bdec95fd5b9
current date and time is: Fri Jul 22 15:42:49 IST 2016
current date and time is: Fri Jul 22 15:42:49 IST 2016
current date and time is: Fri Jul 22 15:42:49 IST 2016
current date and time is: Fri Jul 22 15:42:49 IST 2016
// output elided
short for “—detach” and it runs
container in the background
How to attach to a running container?
$ docker run -d ubuntu /bin/sh -c "while true; do echo current date and time is: $
(date); sleep 10; done"
acc349675098a0133366076f2082db6171ee4a0cd2e1e45ada9a485684ea4c01
$ docker attach acc349675098a0133366076f2082db6171ee4a0cd2e1e45ada9a485684ea4c01
current date and time is: Mon Aug 1 10:30:13 IST 2016
current date and time is: Mon Aug 1 10:30:13 IST 2016
short for “—detach” and it runs
container in the background
The “attach” command attaches
to a running container
How do I create an image from a running container?
Use “docker commit” command
$ docker run -d alpine echo "hello world"
9884347880f62f7c5d43702c3d701e3b87a49f9bdde5843380af1479f4dc0755
$ docker logs 9884347880f62f7c5d43702c3d701e3b87a49f9bdde5843380af1479f4dc0755
hello world
$ docker commit -m "my first image from container"
9884347880f62f7c5d43702c3d701e3b87a49f9bdde5843380af1479f4dc0755 myalpine:latest
sha256:b707ef35394c365bece70240213942e43da7f882107d30482ad6bec6b4bacfb7
$ docker images
REPOSITORY TAG IMAGE ID CREATED
SIZE
myalpine latest b707ef35394c 18 hours ago
4.799 MB
$ docker run -it b707ef35394c365bece70240213942e43da7f882107d30482ad6bec6b4bacfb7
hello world
$
How to get list of containers?
Use “docker ps” command
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3651758ff308 wordpress:latest "/entrypoint.sh apach" 2 days ago Up 2 days 0.0.0.0:8000->80/tcp mywordpress_wordpress_1
b95388054539 mysql:5.7 "docker-entrypoint.sh" 2 days ago Up 2 days 3306/tcp mywordpress_db_1
How do I see all the containers?
Use “docker ps -a” command
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2c378c6b84b1 fedora "/bin/echo 'Hello wor" 4 minutes ago Exited (0) 4 minutes ago grave_thompson
c4b2db95f268 hello-world "/hello" 5 minutes ago Exited (0) 5 minutes ago amazing_jones
2dcd9d0caf6f 777f9424d24d "/bin/bash" 42 minutes ago Exited (0) 42 minutes ago prickly_khorana
3651758ff308 wordpress:latest "/entrypoint.sh apach" 2 days ago Up 2 days 0.0.0.0:8000->80/tcp mywordpress_wordpress_1
b95388054539 mysql:5.7 "docker-entrypoint.sh" 2 days ago Up 2 days 3306/tcp mywordpress_db_1
4b984664f9aa golang:latest "go run myapp.go" 2 days ago Exited (1) 2 days ago mydocker_app_1
63cd7661a8ad hello-world "/hello" 2 days ago Exited (0) 2 days ago adoring_sammet
c191fbeae884 ubuntu "/bin/bash" 2 days ago Exited (0) 2 days ago clever_mcclintock
08e173332d46 docker/whalesay "cowsay Hello world" 2 days ago Exited (0) 2 days ago tender_joliot
6322b8204a5d 0f192147631d "/bin/bash" 9 days ago Exited (0) 9 days ago desperate_aryabhata
...
How do I remove a container?
Use “docker rm” command
$ docker stop mywordpress_db_1
mywordpress_db_1
$ docker rm mywordpress_db_1
mywordpress_db_1
You have to first stop a
container before trying
to remove it
How do I remove all the containers?
Use “docker stop $(docker ps -a -q)” and
“docker rm $(docker ps -a -q)” commands
$ docker stop $(docker ps -a -q)
00eef5289c91
8553eebfab94
696a04db91db
// rest of the output elided
$ docker rm $(docker ps -a -q)
00eef5289c91
8553eebfab94
696a04db91db
// rest of the output elided
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS
PORTS NAMES
Note how the output
shows no containers
Using nginx
$ docker run --name mynginx -P -d nginx
561e15ac1848cf481f89bb161c23dd644f176b8f142fe617947e06f095e0953f
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED
STATUS PORTS NAMES
561e15ac1848 nginx "nginx -g 'daemon off" 18 hours ago
Up About a minute 0.0.0.0:32771->80/tcp, 0.0.0.0:32770->443/tcp mynginx
$ curl localhost:32771
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
// rest of the output elided ...
Nginx exposes ports 80 and 443; -P maps them
randomly in the ports range 49153 and 65535
Using nginx
$ cat Dockerfile
FROM nginx:latest
MAINTAINER Ganesh Samarthyam
ADD ./index.html /usr/share/nginx/html/index.html
EXPOSE 80
$ cat index.html
<h1> welcome to Dockerizing apps! <h1>
$ docker build .
Sending build context to Docker daemon 3.072 kB
// output elided ...
Removing intermediate container b043a75a4e1c
Successfully built 1aae04309f8b
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 1aae04309f8b 6 seconds ago 182.8 MB
$ docker run -p 80:80 -d 1aae04309f8b
984c179231188445289e70d854250e4e981b77a899208360db4466e73930be42
$ curl localhost:80
<h1> welcome to Dockerizing apps! <h1>
$
Type “localhost:80” in
the browser address bar
How do I run a C program?
$ docker pull gcc
Using default tag: latest
latest: Pulling from library/gcc
5c90d4a2d1a8: Already exists
ab30c63719b1: Already exists
c6072700a242: Already exists
abb742d515b4: Already exists
d32a4c04e369: Pull complete
276c31cf0a4c: Pull complete
a455d29f9189: Pull complete
dcfe5869552b: Pull complete
Digest: sha256:35256b5f4e4d5643c9631c92e3505154cd2ea666d2f83812b418cfdb1d5866e8
Status: Downloaded newer image for gcc:latest
$
How do I run a C program?
$ docker pull ubuntu:latest
latest: Pulling from library/ubuntu
43db9dbdcb30: Pull complete
85a9cd1fcca2: Pull complete
c23af8496102: Pull complete
e88c36ca55d8: Pull complete
Digest: sha256:7ce82491d6e35d3aa7458a56e470a821baecee651fba76957111402591d20fc1
Status: Downloaded newer image for ubuntu:latest
$ docker run -i -t ubuntu /bin/bash
root@c191fbeae884:/# gcc
bash: gcc: command not found
root@c191fbeae884:/# apt-get update
// elided the output
root@c191fbeae884:/# apt-get install gcc
// elided the output
root@c191fbeae884:/# cat > hello.c
int main() { printf("hello worldn”); }
root@c191fbeae884:/# gcc -w hello.c
root@c191fbeae884:/# ./a.out
hello world
root@c191fbeae884:/#
How do I run a C program?
$ cat Dockerfile
FROM gcc:latest
MAINTAINER Ganesh Samarthyam version: 0.1
COPY . /usr/src/mycapp
WORKDIR /usr/src/mycapp
RUN gcc -o first first.c
CMD ["./first"]
$ cat first.c
#include <stdio.h>
int main() { printf("hello worldn"); }
$ docker build . -t"mycapp:latest"
Sending build context to Docker daemon 3.072 kB
Step 1 : FROM gcc:latest
---> a0b516dc1799
// .. steps elided ...
Step 6 : CMD ./first
---> Using cache
---> f99e7f18fa42
Successfully built f99e7f18fa42
$ docker run -it mycapp
hello world
How do I run a Java program?
$ cat Dockerfile
FROM java:latest
COPY . /usr/src/
WORKDIR /usr/src/
RUN javac hello.java
CMD ["java", "hello"]
$ cat hello.java
class hello {
public static void main(String []args) {
System.out.println("hello world");
}
}
$ docker build . -t"myjavaapp:latest"
Sending build context to Docker daemon 3.072 kB
Step 1 : FROM java:latest
---> 264282a59a95
// intermediate steps elided
Successfully built 0d7a3a12ba9d
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
myjavaapp latest 0d7a3a12ba9d About an hour ago 669.2 MB
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
myjavaapp latest 0d7a3a12ba9d About an hour ago 669.2 MB
<none> <none> 7cfb4bdf47a7 About an hour ago 669.2 MB
// rest of the output elided
$ docker run myjavaapp
hello world
Using Registry & Repository
How to push my image to Docker Hub?
$ docker tag myjavaapp gsamarthyam/myfirstjavaprog:latest
$ docker push gsamarthyam/myfirstjavaprog:latest
The push refers to a repository [docker.io/gsamarthyam/myfirstjavaprog]
a97e2e0314bc: Pushed
3b9964bc9417: Pushed
de174b528b56: Pushed
// elided the output
latest: digest: sha256:1618981552efb12afa4e348b9c0e6d28f0ac4496979ad0c0a821b43547e13c13 size: 2414
$
How to pull my image from Docker Hub?
$ docker pull gsamarthyam/myfirstjavaprog:latest
latest: Pulling from gsamarthyam/myfirstjavaprog
Digest: sha256:1618981552efb12afa4e348b9c0e6d28f0ac4496979ad0c0a821b43547e13c13
// output elided …
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
myjavaapp latest 0d7a3a12ba9d About an hour ago 669.2 MB
gsamarthyam/myfirstjavaprog latest 0d7a3a12ba9d About an hour ago 669.2 MB
// output elided …
$ docker run gsamarthyam/myfirstjavaprog
hello world
$
How do I create and use my own registry?
$ docker pull registry
Using default tag: latest
latest: Pulling from library/registry
e110a4a17941: Already exists
2ee5ed28ffa7: Pull complete
d1562c23a8aa: Pull complete
06ba8e23299f: Pull complete
802d2a9c64e8: Pull complete
Digest: sha256:1b68f0d54837c356e353efb04472bc0c9a60ae1c8178c9ce076b01d2930bcc5d
Status: Downloaded newer image for registry:latest
$ docker run -d -p5000:5000 registry
7768bed98a5e1916a820c84906e1f21cfc84888a934c140ad22e19cee5e2541d
Pull the “registry” image and run the container
You can now push/pull
images from this private
registry
Other Topics
How do debug on a running container?
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED
STATUS PORTS NAMES
9128bf57e03c ubuntu "/bin/sh -c 'while tr" 24 minutes ago Up
24 minutes lonely_einstein
$ docker exec -ti lonely_einstein /bin/bash
root@9128bf57e03c:/#
Use “docker exec” command
Can I use GUI instead of command-line?
Use “kitematic” (https://github.com/docker/kitematic)
Crazy Stuff: Docker in Docker!!
Use “docker run --privileged -d docker:dind"
“docker:dind” is the official “Docker in Docker base image”
See: https://github.com/jpetazzo/dind
Docker Best Practices
❖ Explicitly use --rm to remove the container from the file system -
otherwise, even if the container exits, it is not cleaned up yet (and
will hog memory).
❖ Remove “dangling images” using the command “$docker rmi $
(docker images -f "dangling=true" -q)”
❖ Explicitly use --rm to remove the container from the file system -
otherwise, even if the container exits, it is not cleaned up yet.
❖ Containers will have volumes. When the container is removed,
the volumes will not be removed. If the volumes also need to be
removed, we have to use -v option, as in: docker rm -v <<sha>>
Docker Best Practices
❖ Avoid creating docker images manually (e.g., using
“docker commit”); rather automate the image build
process (using Dockerfile and “docker build”)
❖ Choose a smaller base image that provides equivalent
functionality (for your requirement) instead of choosing
a larger one
❖ Example: Choose Alpine vs. Fedora (5 MB vs. 205 MB)
alpine latest 4e38e38c8ce0 4 weeks ago 4.799 MB
fedora latest f9873d530588 4 weeks ago 204.4 MB
“Management says we need
Docker, so let’s use it”
Docker Commands
attach Attach to a running container
build Build an image from a Dockerfile
commit Create a new image from a container's changes
cp Copy files/folders between a container and the local filesystem
create Create a new container
deploy Create and update a stack from a Distributed Application Bundle (DAB)
diff Inspect changes on a container's filesystem
events Get real time events from the server
exec Run a command in a running container
export Export a container's filesystem as a tar archive
history Show the history of an image
images List images
import Import the contents from a tarball to create a filesystem image
info Display system-wide information
inspect Return low-level information on a container, image or task
kill Kill one or more running container
load Load an image from a tar archive or STDIN
login Log in to a Docker registry.
logout Log out from a Docker registry.
logs Fetch the logs of a container
network Manage Docker networks
node Manage Docker Swarm nodes
pause Pause all processes within one or more containers
plugin Manage Docker plugins
Docker Commands
port List port mappings or a specific mapping for the container
ps List containers
pull Pull an image or a repository from a registry
push Push an image or a repository to a registry
rename Rename a container
restart Restart a container
rm Remove one or more containers
rmi Remove one or more images
run Run a command in a new container
save Save one or more images to a tar archive (streamed to STDOUT by default)
search Search the Docker Hub for images
service Manage Docker services
stack Manage Docker stacks
start Start one or more stopped containers
stats Display a live stream of container(s) resource usage statistics
stop Stop one or more running containers
swarm Manage Docker Swarm
tag Tag an image into a repository
top Display the running processes of a container
unpause Unpause all processes within one or more containers
update Update configuration of one or more containers
version Show the Docker version information
volume Manage Docker volumes
wait Block until a container stops, then print its exit code
Where to learn more on Docker?
❖ Self-learning courses: https://training.docker.com/
❖ Detailed documentation: https://docs.docker.com/
❖ Detailed tutorial (presentation): http://docker.training
❖ SE-Radio Episode 217: James Turnbull on Docker
❖ Docker related presentations in parleys.com
DOCKER: UP & RUNNING
➤ Covers how to develop, test,
debug, ship, scale, and
support with Docker from
DevOps perspective
➤ We liked the useful tips;
examples:
➤ “Maximize robustness with fast
startup and graceful shutdown.”
➤ “Explicitly declare and isolate
dependencies.”
➤ “Strictly separate build and run
stages.”
http://amzn.com/1491917571
“Docker: Up & Running”, Karl Matthias, Sean P. Kane, O'Reilly Media; 1 edition (July 3, 2015)
THE DOCKER BOOK
➤ Interesting sub-title:
“Containerization is the new
virtualization”.
➤ From James Turnbull (CTO at
Kickstarter and Advisor at
Docker)
➤ Useful to get comfortable with
core concepts of Docker
➤ Useful for developers,
operations staff (and DevOps),
and SysAdmins
➤ Supporting website: http://
dockerbook.com/http://www.amazon.in/dp/B00LRROTI4
The Docker Book, James Turnbull, Amazon Digital South Asia Services, July 2014
DOCKER COOKBOOK
➤ Contents written in recipe
format (Problem, Solution,
Discussion)
➤ Useful because we can look for
solutions to the problems that
we face when using Docker
➤ What we like: it covers topics
that are not covered well in
other books including
Kubernetes, Docker ecosystem
tools, monitoring Docker, and
application use cases (CI, CD)
http://amzn.com/149191971X
“Docker Cookbook”, Sébastien Goasguen, O'Reilly Media, 2015
DOCKER IN ACTION
➤ Wide coverage from basics to
advanced topics like managing
massive clusters
➤ Book organised into three parts:
➤ Keeping a tidy computer
➤ Packaging software for distribution
➤ Multi-container and multi-host
environments
➤ The third part is more
interesting for us because it is
not covered well in other books
➤ Covers Docker Compose, Machine
and Swarm
http://amzn.com/1633430235
Docker in Action, Jeff Nickoloff, Manning Publications, 2016
USING DOCKER
➤ Book organised into three
parts:
➤ Background and Basics
➤ The Software Lifecycle with Docker
➤ Tools and Techniques
➤ Useful example: Walks you
through the steps to develop
and deploy web applications
with Docker
➤ Though the book touches
upon basics, it covers more
advanced topics
http://amzn.com/1491915765
Using Docker: Developing and Deploying Software with Containers, Adrian Mouat, O'Reilly Media, 2016
Docker by Example - Basics
Source: http://zeroturnaround.com/wp-content/uploads/2016/03/Docker-cheat-sheet-by-RebelLabs.png
Upcoming Bootcamps
Modern Software Architecture (10th Sept, BLR)
SOLID Principles and Design Patterns (27th August, BLR)
Azure Hands-on (27th August, BLR)
Meetups
h"p://www.meetup.com/JavaScript-Meetup-Bangalore/	
h"p://www.meetup.com/Container-Developers-Meetup-Bangalore/		
h"p://www.meetup.com/So>ware-Cra>smanship-Bangalore-Meetup/	
h"p://www.meetup.com/Core-Java-Meetup-Bangalore/	
h"p://www.meetup.com/Technical-Writers-Meetup-Bangalore/	
h"p://www.meetup.com/CloudOps-Meetup-Bangalore/	
h"p://www.meetup.com/Bangalore-SDN-IoT-NetworkVirtualizaHon-Enthusiasts/	
h"p://www.meetup.com/So>wareArchitectsBangalore/
ganesh@codeops.tech @GSamarthyam
www.codeops.tech slideshare.net/sgganesh
+91 98801 64463 bit.ly/ganeshsg
Image Credits
❖ https://pbs.twimg.com/media/CH-ISJGUwAAt8hQ.png
❖ http://patg.net/assets/container_vs_vm.jpg
❖ http://static1.businessinsider.com/image/
525e9c7669bedd9c3015dc60-1190-625/the-10-funniest-dilbert-comic-strips-
about-idiot-bosses.jpg
❖ https://blog.docker.com/wp-content/uploads/2014/03/docker-
execdriver-diagram.png
❖ https://docs.docker.com/engine/article-img/architecture.svg
❖ https://en.wikipedia.org/wiki/File:Docker-linux-interfaces.svg
❖ http://lohmander.me/content/images/2015/10/d2f.jpg

More Related Content

Docker by Example - Basics

  • 1. Lorem Ipsum Dolor Docker by Example Ganesh & Hari ganesh@codeops.tech hari@codeops.tech
  • 2. What is Docker? Source: https://en.wikipedia.org/wiki/Docker_(software) Docker is an open-source project that automates the deployment of applications inside software containers. “an open platform for developers and sysadmins to build, ship, and run distributed applications”
  • 4. Docker accesses virtualisation features of Linux
  • 7. Where do I go to get Docker to install it? Install it from “https://www.docker.com/products/overview"
  • 8. Where do I get official Docker images? From “https://hub.docker.com/explore/"
  • 9. How to find my Docker version?
  • 10. How to find my Docker version? $ docker -v Docker version 1.12.0-rc4, build e4a0dbc, experimental
  • 11. How to find details of my Docker installation?
  • 12. Can I install Docker from commandline? Yes! from get.docker.com # This script is meant for quick & easy install via: # 'curl -sSL https://get.docker.com/ | sh' # or: # 'wget -qO- https://get.docker.com/ | sh'
  • 13. How to do “hello world” in Docker? $ docker run docker/whalesay cowsay Hello world
  • 14. How to do “hello world” in Docker? $ docker run docker/whalesay cowsay "Hello world" Runs a command in a new container Base image for creating the container Command name to run within the container Argument to the “cowsay” command
  • 15. How to do “hello world” in Docker? $ docker run -it hello-world $ docker run -it hello-world Hello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker Hub account: https://hub.docker.com For more examples and ideas, visit: https://docs.docker.com/engine/userguide/
  • 16. The term “Docker” can be confusing: the client and the daemon both are called Docker!
  • 17. How to get help on commands to use? Use “docker -h” command, as in: $ docker -h Usage: docker [OPTIONS] COMMAND [arg...] docker [ --help | -v | --version ] A self-sufficient runtime for containers. Options: --config=~/.docker Location of client config files -D, --debug Enable debug mode -H, --host=[] Daemon socket(s) to connect to -h, --help Print usage -l, --log-level=info Set the logging level … Commands: attach Attach to a running container
  • 18. Docker commands look like Linux commands - so familiarity with Linux commands can really help to get up to speed quickly with Docker.
  • 20. How to get list of images?
  • 21. How to search for an image?
  • 22. How to get an image? Use “docker pull <image_name>” command In my case debian image was already pulled. If it were not there, Docker would have pulled it afresh
  • 23. How to get details of an image? Use “docker inspect <image_name>” command docker inspect debian [ { "Id": "sha256:1b088884749bd93867ddb48ff404d4bbff09a17af8d95bc863efa5d133f87b78", "RepoTags": [ "debian:latest" ], "RepoDigests": [ "debian@sha256:8b1fc3a7a55c42e3445155b2f8f40c55de5f8bc8012992b26b570530c4bded9e" ], "Parent": "", "Comment": "", "Created": "2016-06-09T21:28:43.776404816Z", "Container": "2f3dcd897cf758418389d50784c73b43b1fd7db09a80826329496f05eef7b377", "ContainerConfig": { "Hostname": "6250540837a8", "Domainname": "", "User": "", "AttachStdin": false, "AttachStdout": false, "AttachStderr": false, "Tty": false, "OpenStdin": false, // ...
  • 24. How to see “layers” in an image? Use “docker history <image_name>” command Each of these lines are layers and the size column shows the exact size of each layer in the image
  • 25. How can I load and store images? Use “docker save” and “docker load” commands
  • 26. How do I delete an image? Use “docker rmi <image-tag>” $ docker images alpine REPOSITORY TAG IMAGE ID CREATED SIZE alpine latest 4e38e38c8ce0 4 weeks ago 4.799 MB $ docker rmi alpine Untagged: alpine:latest Untagged: alpine@sha256:3dcdb92d7432d56604d4545cbd324b14e647b313626d99b889d0626de158f73a $ docker images alpine REPOSITORY TAG IMAGE ID CREATED SIZE
  • 27. How to delete all docker images? Use “$docker rmi $(docker images -q)” docker images -q lists all image ids
  • 28. How to find “dangling images”? Use “docker images -f "dangling=true"” $ docker images -f "dangling=true" REPOSITORY TAG IMAGE ID CREATED SIZE <none> <none> 777f9424d24d 7 minutes ago 125.2 MB <none> <none> 3d02168f00fc 12 days ago 34.22 MB <none> <none> 0f192147631d 3 weeks ago 132.8 MB
  • 29. How to remove “dangling images”? Use “docker rmi $(docker images -f "dangling=true" -q)”
  • 30. How can I create my own Docker image? Create “Dockerfile” - its like Makefile for Docker $ cat myimage/Dockerfile FROM ubuntu RUN echo "my first image" > /tmp/first.txt $ docker build myimage Sending build context to Docker daemon 2.048 kB Step 1 : FROM ubuntu ---> ac526a356ca4 Step 2 : RUN echo "my first image" > /tmp/first.txt ---> Running in 18f62f47d2c8 ---> 777f9424d24d Removing intermediate container 18f62f47d2c8 Successfully built 777f9424d24d $ docker images | grep 777f9424d24d <none> <none> 777f9424d24d 4 minutes ago 125.2 MB $ docker run -it 777f9424d24d root@2dcd9d0caf6f:/# ls bin boot core dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var root@2dcd9d0caf6f:/# cat /tmp/first.txt my first image root@2dcd9d0caf6f:/# exit exit $
  • 31. How to name/tag an image when building? Use “docker build <<dirname>> -t"imagename:tag"” command $ docker build myimage -t"myfirstimage:latest" Sending build context to Docker daemon 2.048 kB Step 1 : FROM ubuntu ---> ac526a356ca4 Step 2 : RUN echo "my first image" > /tmp/first.txt ---> Using cache ---> 777f9424d24d Successfully built 777f9424d24d $ docker images myfirstimage REPOSITORY TAG IMAGE ID CREATED SIZE myfirstimage latest 777f9424d24d 58 minutes ago 125.2 MB $
  • 33. How to get list of containers?
  • 34. How to run a container? Use “docker run OPTIONS <<image-tag>> CMD ARGS” docker run fedora /bin/echo 'Hello world' Command name Image name Command argument $ docker run fedora /bin/echo 'Hello world' Hello world $
  • 35. How to run a container interactively? $ docker run -t -i fedora /bin/bash [root@00eef5289c91 /]# pwd / [root@00eef5289c91 /]# whoami root [root@00eef5289c91 /]# ls bin boot dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var [root@00eef5289c91 /]# cc bash: cc: command not found [root@00eef5289c91 /]# gcc bash: gcc: command not found [root@00eef5289c91 /]# java bash: java: command not found [root@00eef5289c91 /]# tar bash: tar: command not found [root@00eef5289c91 /]# exit exit $ docker run -t -i fedora /bin/bash Create a terminal to interact with short for “—interactive"
  • 36. How to run a container in the background? $ docker run -d ubuntu /bin/sh -c "while true; do echo current date and time is: $(date); sleep 10; done" 9128bf57e03c3b32f0bf784a92332953996236d7e358a77c62c10bdec95fd5b9 $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9128bf57e03c ubuntu "/bin/sh -c 'while tr" About a minute ago Up About a minute lonely_einstein $ docker logs 9128bf57e03c3b32f0bf784a92332953996236d7e358a77c62c10bdec95fd5b9 current date and time is: Fri Jul 22 15:42:49 IST 2016 current date and time is: Fri Jul 22 15:42:49 IST 2016 current date and time is: Fri Jul 22 15:42:49 IST 2016 current date and time is: Fri Jul 22 15:42:49 IST 2016 // output elided short for “—detach” and it runs container in the background
  • 37. How to attach to a running container? $ docker run -d ubuntu /bin/sh -c "while true; do echo current date and time is: $ (date); sleep 10; done" acc349675098a0133366076f2082db6171ee4a0cd2e1e45ada9a485684ea4c01 $ docker attach acc349675098a0133366076f2082db6171ee4a0cd2e1e45ada9a485684ea4c01 current date and time is: Mon Aug 1 10:30:13 IST 2016 current date and time is: Mon Aug 1 10:30:13 IST 2016 short for “—detach” and it runs container in the background The “attach” command attaches to a running container
  • 38. How do I create an image from a running container? Use “docker commit” command $ docker run -d alpine echo "hello world" 9884347880f62f7c5d43702c3d701e3b87a49f9bdde5843380af1479f4dc0755 $ docker logs 9884347880f62f7c5d43702c3d701e3b87a49f9bdde5843380af1479f4dc0755 hello world $ docker commit -m "my first image from container" 9884347880f62f7c5d43702c3d701e3b87a49f9bdde5843380af1479f4dc0755 myalpine:latest sha256:b707ef35394c365bece70240213942e43da7f882107d30482ad6bec6b4bacfb7 $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE myalpine latest b707ef35394c 18 hours ago 4.799 MB $ docker run -it b707ef35394c365bece70240213942e43da7f882107d30482ad6bec6b4bacfb7 hello world $
  • 39. How to get list of containers? Use “docker ps” command $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3651758ff308 wordpress:latest "/entrypoint.sh apach" 2 days ago Up 2 days 0.0.0.0:8000->80/tcp mywordpress_wordpress_1 b95388054539 mysql:5.7 "docker-entrypoint.sh" 2 days ago Up 2 days 3306/tcp mywordpress_db_1
  • 40. How do I see all the containers? Use “docker ps -a” command $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2c378c6b84b1 fedora "/bin/echo 'Hello wor" 4 minutes ago Exited (0) 4 minutes ago grave_thompson c4b2db95f268 hello-world "/hello" 5 minutes ago Exited (0) 5 minutes ago amazing_jones 2dcd9d0caf6f 777f9424d24d "/bin/bash" 42 minutes ago Exited (0) 42 minutes ago prickly_khorana 3651758ff308 wordpress:latest "/entrypoint.sh apach" 2 days ago Up 2 days 0.0.0.0:8000->80/tcp mywordpress_wordpress_1 b95388054539 mysql:5.7 "docker-entrypoint.sh" 2 days ago Up 2 days 3306/tcp mywordpress_db_1 4b984664f9aa golang:latest "go run myapp.go" 2 days ago Exited (1) 2 days ago mydocker_app_1 63cd7661a8ad hello-world "/hello" 2 days ago Exited (0) 2 days ago adoring_sammet c191fbeae884 ubuntu "/bin/bash" 2 days ago Exited (0) 2 days ago clever_mcclintock 08e173332d46 docker/whalesay "cowsay Hello world" 2 days ago Exited (0) 2 days ago tender_joliot 6322b8204a5d 0f192147631d "/bin/bash" 9 days ago Exited (0) 9 days ago desperate_aryabhata ...
  • 41. How do I remove a container? Use “docker rm” command $ docker stop mywordpress_db_1 mywordpress_db_1 $ docker rm mywordpress_db_1 mywordpress_db_1 You have to first stop a container before trying to remove it
  • 42. How do I remove all the containers? Use “docker stop $(docker ps -a -q)” and “docker rm $(docker ps -a -q)” commands $ docker stop $(docker ps -a -q) 00eef5289c91 8553eebfab94 696a04db91db // rest of the output elided $ docker rm $(docker ps -a -q) 00eef5289c91 8553eebfab94 696a04db91db // rest of the output elided $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES Note how the output shows no containers
  • 43. Using nginx $ docker run --name mynginx -P -d nginx 561e15ac1848cf481f89bb161c23dd644f176b8f142fe617947e06f095e0953f $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 561e15ac1848 nginx "nginx -g 'daemon off" 18 hours ago Up About a minute 0.0.0.0:32771->80/tcp, 0.0.0.0:32770->443/tcp mynginx $ curl localhost:32771 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> // rest of the output elided ... Nginx exposes ports 80 and 443; -P maps them randomly in the ports range 49153 and 65535
  • 44. Using nginx $ cat Dockerfile FROM nginx:latest MAINTAINER Ganesh Samarthyam ADD ./index.html /usr/share/nginx/html/index.html EXPOSE 80 $ cat index.html <h1> welcome to Dockerizing apps! <h1> $ docker build . Sending build context to Docker daemon 3.072 kB // output elided ... Removing intermediate container b043a75a4e1c Successfully built 1aae04309f8b $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE <none> <none> 1aae04309f8b 6 seconds ago 182.8 MB $ docker run -p 80:80 -d 1aae04309f8b 984c179231188445289e70d854250e4e981b77a899208360db4466e73930be42 $ curl localhost:80 <h1> welcome to Dockerizing apps! <h1> $ Type “localhost:80” in the browser address bar
  • 45. How do I run a C program? $ docker pull gcc Using default tag: latest latest: Pulling from library/gcc 5c90d4a2d1a8: Already exists ab30c63719b1: Already exists c6072700a242: Already exists abb742d515b4: Already exists d32a4c04e369: Pull complete 276c31cf0a4c: Pull complete a455d29f9189: Pull complete dcfe5869552b: Pull complete Digest: sha256:35256b5f4e4d5643c9631c92e3505154cd2ea666d2f83812b418cfdb1d5866e8 Status: Downloaded newer image for gcc:latest $
  • 46. How do I run a C program? $ docker pull ubuntu:latest latest: Pulling from library/ubuntu 43db9dbdcb30: Pull complete 85a9cd1fcca2: Pull complete c23af8496102: Pull complete e88c36ca55d8: Pull complete Digest: sha256:7ce82491d6e35d3aa7458a56e470a821baecee651fba76957111402591d20fc1 Status: Downloaded newer image for ubuntu:latest $ docker run -i -t ubuntu /bin/bash root@c191fbeae884:/# gcc bash: gcc: command not found root@c191fbeae884:/# apt-get update // elided the output root@c191fbeae884:/# apt-get install gcc // elided the output root@c191fbeae884:/# cat > hello.c int main() { printf("hello worldn”); } root@c191fbeae884:/# gcc -w hello.c root@c191fbeae884:/# ./a.out hello world root@c191fbeae884:/#
  • 47. How do I run a C program? $ cat Dockerfile FROM gcc:latest MAINTAINER Ganesh Samarthyam version: 0.1 COPY . /usr/src/mycapp WORKDIR /usr/src/mycapp RUN gcc -o first first.c CMD ["./first"] $ cat first.c #include <stdio.h> int main() { printf("hello worldn"); } $ docker build . -t"mycapp:latest" Sending build context to Docker daemon 3.072 kB Step 1 : FROM gcc:latest ---> a0b516dc1799 // .. steps elided ... Step 6 : CMD ./first ---> Using cache ---> f99e7f18fa42 Successfully built f99e7f18fa42 $ docker run -it mycapp hello world
  • 48. How do I run a Java program? $ cat Dockerfile FROM java:latest COPY . /usr/src/ WORKDIR /usr/src/ RUN javac hello.java CMD ["java", "hello"] $ cat hello.java class hello { public static void main(String []args) { System.out.println("hello world"); } } $ docker build . -t"myjavaapp:latest" Sending build context to Docker daemon 3.072 kB Step 1 : FROM java:latest ---> 264282a59a95 // intermediate steps elided Successfully built 0d7a3a12ba9d $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE myjavaapp latest 0d7a3a12ba9d About an hour ago 669.2 MB $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE myjavaapp latest 0d7a3a12ba9d About an hour ago 669.2 MB <none> <none> 7cfb4bdf47a7 About an hour ago 669.2 MB // rest of the output elided $ docker run myjavaapp hello world
  • 49. Using Registry & Repository
  • 50. How to push my image to Docker Hub? $ docker tag myjavaapp gsamarthyam/myfirstjavaprog:latest $ docker push gsamarthyam/myfirstjavaprog:latest The push refers to a repository [docker.io/gsamarthyam/myfirstjavaprog] a97e2e0314bc: Pushed 3b9964bc9417: Pushed de174b528b56: Pushed // elided the output latest: digest: sha256:1618981552efb12afa4e348b9c0e6d28f0ac4496979ad0c0a821b43547e13c13 size: 2414 $
  • 51. How to pull my image from Docker Hub? $ docker pull gsamarthyam/myfirstjavaprog:latest latest: Pulling from gsamarthyam/myfirstjavaprog Digest: sha256:1618981552efb12afa4e348b9c0e6d28f0ac4496979ad0c0a821b43547e13c13 // output elided … $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE myjavaapp latest 0d7a3a12ba9d About an hour ago 669.2 MB gsamarthyam/myfirstjavaprog latest 0d7a3a12ba9d About an hour ago 669.2 MB // output elided … $ docker run gsamarthyam/myfirstjavaprog hello world $
  • 52. How do I create and use my own registry? $ docker pull registry Using default tag: latest latest: Pulling from library/registry e110a4a17941: Already exists 2ee5ed28ffa7: Pull complete d1562c23a8aa: Pull complete 06ba8e23299f: Pull complete 802d2a9c64e8: Pull complete Digest: sha256:1b68f0d54837c356e353efb04472bc0c9a60ae1c8178c9ce076b01d2930bcc5d Status: Downloaded newer image for registry:latest $ docker run -d -p5000:5000 registry 7768bed98a5e1916a820c84906e1f21cfc84888a934c140ad22e19cee5e2541d Pull the “registry” image and run the container You can now push/pull images from this private registry
  • 54. How do debug on a running container? $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9128bf57e03c ubuntu "/bin/sh -c 'while tr" 24 minutes ago Up 24 minutes lonely_einstein $ docker exec -ti lonely_einstein /bin/bash root@9128bf57e03c:/# Use “docker exec” command
  • 55. Can I use GUI instead of command-line? Use “kitematic” (https://github.com/docker/kitematic)
  • 56. Crazy Stuff: Docker in Docker!! Use “docker run --privileged -d docker:dind" “docker:dind” is the official “Docker in Docker base image” See: https://github.com/jpetazzo/dind
  • 57. Docker Best Practices ❖ Explicitly use --rm to remove the container from the file system - otherwise, even if the container exits, it is not cleaned up yet (and will hog memory). ❖ Remove “dangling images” using the command “$docker rmi $ (docker images -f "dangling=true" -q)” ❖ Explicitly use --rm to remove the container from the file system - otherwise, even if the container exits, it is not cleaned up yet. ❖ Containers will have volumes. When the container is removed, the volumes will not be removed. If the volumes also need to be removed, we have to use -v option, as in: docker rm -v <<sha>>
  • 58. Docker Best Practices ❖ Avoid creating docker images manually (e.g., using “docker commit”); rather automate the image build process (using Dockerfile and “docker build”) ❖ Choose a smaller base image that provides equivalent functionality (for your requirement) instead of choosing a larger one ❖ Example: Choose Alpine vs. Fedora (5 MB vs. 205 MB) alpine latest 4e38e38c8ce0 4 weeks ago 4.799 MB fedora latest f9873d530588 4 weeks ago 204.4 MB
  • 59. “Management says we need Docker, so let’s use it”
  • 60. Docker Commands attach Attach to a running container build Build an image from a Dockerfile commit Create a new image from a container's changes cp Copy files/folders between a container and the local filesystem create Create a new container deploy Create and update a stack from a Distributed Application Bundle (DAB) diff Inspect changes on a container's filesystem events Get real time events from the server exec Run a command in a running container export Export a container's filesystem as a tar archive history Show the history of an image images List images import Import the contents from a tarball to create a filesystem image info Display system-wide information inspect Return low-level information on a container, image or task kill Kill one or more running container load Load an image from a tar archive or STDIN login Log in to a Docker registry. logout Log out from a Docker registry. logs Fetch the logs of a container network Manage Docker networks node Manage Docker Swarm nodes pause Pause all processes within one or more containers plugin Manage Docker plugins
  • 61. Docker Commands port List port mappings or a specific mapping for the container ps List containers pull Pull an image or a repository from a registry push Push an image or a repository to a registry rename Rename a container restart Restart a container rm Remove one or more containers rmi Remove one or more images run Run a command in a new container save Save one or more images to a tar archive (streamed to STDOUT by default) search Search the Docker Hub for images service Manage Docker services stack Manage Docker stacks start Start one or more stopped containers stats Display a live stream of container(s) resource usage statistics stop Stop one or more running containers swarm Manage Docker Swarm tag Tag an image into a repository top Display the running processes of a container unpause Unpause all processes within one or more containers update Update configuration of one or more containers version Show the Docker version information volume Manage Docker volumes wait Block until a container stops, then print its exit code
  • 62. Where to learn more on Docker? ❖ Self-learning courses: https://training.docker.com/ ❖ Detailed documentation: https://docs.docker.com/ ❖ Detailed tutorial (presentation): http://docker.training ❖ SE-Radio Episode 217: James Turnbull on Docker ❖ Docker related presentations in parleys.com
  • 63. DOCKER: UP & RUNNING ➤ Covers how to develop, test, debug, ship, scale, and support with Docker from DevOps perspective ➤ We liked the useful tips; examples: ➤ “Maximize robustness with fast startup and graceful shutdown.” ➤ “Explicitly declare and isolate dependencies.” ➤ “Strictly separate build and run stages.” http://amzn.com/1491917571 “Docker: Up & Running”, Karl Matthias, Sean P. Kane, O'Reilly Media; 1 edition (July 3, 2015)
  • 64. THE DOCKER BOOK ➤ Interesting sub-title: “Containerization is the new virtualization”. ➤ From James Turnbull (CTO at Kickstarter and Advisor at Docker) ➤ Useful to get comfortable with core concepts of Docker ➤ Useful for developers, operations staff (and DevOps), and SysAdmins ➤ Supporting website: http:// dockerbook.com/http://www.amazon.in/dp/B00LRROTI4 The Docker Book, James Turnbull, Amazon Digital South Asia Services, July 2014
  • 65. DOCKER COOKBOOK ➤ Contents written in recipe format (Problem, Solution, Discussion) ➤ Useful because we can look for solutions to the problems that we face when using Docker ➤ What we like: it covers topics that are not covered well in other books including Kubernetes, Docker ecosystem tools, monitoring Docker, and application use cases (CI, CD) http://amzn.com/149191971X “Docker Cookbook”, Sébastien Goasguen, O'Reilly Media, 2015
  • 66. DOCKER IN ACTION ➤ Wide coverage from basics to advanced topics like managing massive clusters ➤ Book organised into three parts: ➤ Keeping a tidy computer ➤ Packaging software for distribution ➤ Multi-container and multi-host environments ➤ The third part is more interesting for us because it is not covered well in other books ➤ Covers Docker Compose, Machine and Swarm http://amzn.com/1633430235 Docker in Action, Jeff Nickoloff, Manning Publications, 2016
  • 67. USING DOCKER ➤ Book organised into three parts: ➤ Background and Basics ➤ The Software Lifecycle with Docker ➤ Tools and Techniques ➤ Useful example: Walks you through the steps to develop and deploy web applications with Docker ➤ Though the book touches upon basics, it covers more advanced topics http://amzn.com/1491915765 Using Docker: Developing and Deploying Software with Containers, Adrian Mouat, O'Reilly Media, 2016
  • 70. Upcoming Bootcamps Modern Software Architecture (10th Sept, BLR) SOLID Principles and Design Patterns (27th August, BLR) Azure Hands-on (27th August, BLR)
  • 73. Image Credits ❖ https://pbs.twimg.com/media/CH-ISJGUwAAt8hQ.png ❖ http://patg.net/assets/container_vs_vm.jpg ❖ http://static1.businessinsider.com/image/ 525e9c7669bedd9c3015dc60-1190-625/the-10-funniest-dilbert-comic-strips- about-idiot-bosses.jpg ❖ https://blog.docker.com/wp-content/uploads/2014/03/docker- execdriver-diagram.png ❖ https://docs.docker.com/engine/article-img/architecture.svg ❖ https://en.wikipedia.org/wiki/File:Docker-linux-interfaces.svg ❖ http://lohmander.me/content/images/2015/10/d2f.jpg