SlideShare a Scribd company logo
App Container
Docker Basics
Eueung Mulyana
http://eueung.github.io/docker-stuff/intro
CodeLabs | Attribution-ShareAlike CC BY-SA
1 / 36
Outline
VMs, Containers, Docker
Getting Started - Docker Engine
Custom Images
Docker Compose
2 / 36
VMs, Containers & Docker
Introduction
3 / 36
Virtual Machines
Each virtual machine includes the application, the necessary
binaries and libraries and an entire guest operating system - all
of which may be tens of GBs in size.
Containers
(Docker) Containers include the application and all of its
dependencies, but share the kernel with other containers. They
run as an isolated process in userspace on the host operating
system. They're also not tied to any speci c infrastructure.
(Docker) Containers running on a single machine all share the
same operating system kernel so they start instantly and make
more e cient use of RAM. Images are constructed from layered
lesystems so they can share common les, making disk usage
and image downloads much more e cient.
4 / 36
Virtual Machines
vs.
Containers
 
Containers have similar resource isolation
and allocation bene ts as virtual machines
but a di erent architectural approach
allows them to be much more portable and
e cient.
Ref: docker.com
5 / 36
LXC
LXC owes its origin to the development of cgroups and
namespaces in the Linux kernel to support lightweight
virtualized OS environments (containers) and some early work
by Daniel Lezcano and Serge Hallyn dating from 2009 at IBM.
The LXC Project provides tools to manage containers, advanced
networking and storage support and a wide choice of minimal
container OS templates. It is currently led by a 2 member team,
Stephane Graber and Serge Hallyn from Ubuntu. The LXC
project is supported by Ubuntu.
Docker
Docker is a project by dotCloud now Docker Inc released in
March 2013, initially based on the LXC project to build single
application containers. Docker has now developed their own
implementation libcontainer that uses kernel namespaces and
cgroups directly.
6 / 36
Containers
Container (lightweight process virtualization) technology is
not new, mainstream support in the vanilla kernel however
is, paving the way for widespread adoption (Linux Kernel 3.8
- released in February 2013 - cf. Rami Rosen).
FreeBSD has Jails, Solaris has Zones and
there are other (Linux) container
technologies: OpenVZ, VServer, Google
Containers, LXC/LXD, Docker, etc.
Ref: Flockport
Both LXC and Docker are userland container
managers that use kernel namespaces to
provide end user containers. We also now
have Systemd-Nspawn that does the same
thing.
The only di erence is LXC containers have an
an init and can thus run multiple processes
and Docker containers do not have an init
and can only run single processes.
7 / 36
LXC vs. Docker
Ref: Flockport
8 / 36
9 / 36
Docker
Docker allows you to package an application with all of its
dependencies into a standardized unit for software
development.
Docker containers wrap up a piece of software in a complete
lesystem that contains everything it needs to run: code,
runtime, system tools, system libraries - anything you can
install on a server. This guarantees that it will always run the
same, regardless of the environment it is running in.
Docker containers run on any computer, on any
infrastructure and in any cloud.
Ref: docker.com
Containers isolate individual applications and use operating system resources that have been abstracted by Docker.
Containers can be built by "layering", with multiple containers sharing underlying layers, decreasing resource usage.
Ref: Docker Ecosystem - DO
10 / 36
Advantages
Lightweight resource utilization: instead of virtualizing an
entire operating system, containers isolate at the process
level and use the host's kernel.
Portability: all of the dependencies for a containerized
application are bundled inside of the container, allowing
it to run on any Docker host.
Predictability: The host does not care about what is
running inside of the container and the container does
not care about which host it is running on. The interfaces
are standardized and the interactions are predictable.
11 / 36
Docker
Typically, when designing an application or service to use
Docker, it works best to break out functionality into individual
containers, a design recently known as micro-service
architecture.
This gives you the ability to easily scale or update
components independently in the future.
Having this exibility is one of the many reasons that people
are interested in Docker for development and deployment.
Ref: Docker Ecosystem - DO
Docker Engine
Getting Started
12 / 36
Docker Engine
When people say "Docker" they typically mean Docker Engine,
the client-server application made up of the Docker daemon, a
REST API that speci es interfaces for interacting with the
daemon, and a command line interface (CLI) client that talks to
the daemon (through the REST API wrapper).
Docker Engine accepts docker commands from the CLI, such as
dockerrun<image>, dockerpsto list running
containers, dockerimagesto list images, and so on.
Engine is the core of Docker and nothing else will run without it.
Ref: docker.com
13 / 36
Docker Architecture
14 / 36
Docker daemon
The Docker daemon runs on a host machine. The user does not
directly interact with the daemon, but instead through the
Docker client.
Docker client
The Docker client, in the form of the docker binary, is the
primary user interface to Docker.
It accepts commands from the user and communicates back and
forth with a Docker daemon.
Ref: docker.com
15 / 36
Docker Architecture
Docker uses a client-server architecture. The Docker client talks
to the Docker daemon, which does the heavy lifting of building,
running, and distributing your Docker containers.
Both the Docker client and the daemon can run on the same
system, or you can connect a Docker client to a remote Docker
daemon.
The Docker client and daemon communicate via sockets or
through a RESTful API.
16 / 36
Let's Try It ...
My Case: amd64 Machine, Ubuntu 16.04
17 / 36
$curl-fsSLhttps://get.docker.com/|sh
$dockerinfo
Containers:1
...
Images:15
ServerVersion:1.11.1
StorageDriver:aufs
...
LoggingDriver:json-file
CgroupDriver:cgroupfs
Plugins:
...
KernelVersion:4.4.0-21-generic
OperatingSystem:Ubuntu16.04LTS
...
$dockerversion
Client:
Version: 1.11.1
APIversion: 1.23
Goversion: go1.5.4
Gitcommit: 5604cbe
Built: TueApr2623:43:492016
OS/Arch: linux/amd64
Server:
Version: 1.11.1
APIversion: 1.23
Goversion: go1.5.4
Gitcommit: 5604cbe
Built: TueApr2623:43:492016
OS/Arch: linux/amd64
First Step
Ref: Quickstart, Install Docker
$dockerrunhello-world
HellofromDocker.
Thismessageshowsthatyourinstallationappearstobeworkin
Togeneratethismessage,Dockertookthefollowingsteps:
1.TheDockerclientcontactedtheDockerdaemon.
2.TheDockerdaemonpulledthe"hello-world"imagefromthe
3.TheDockerdaemoncreatedanewcontainerfromthatimage
executablethatproducestheoutputyouarecurrentlyread
4.TheDockerdaemonstreamedthatoutputtotheDockerclien
toyourterminal.
Totrysomethingmoreambitious,youcanrunanUbuntucontain
$dockerrun-itubuntubash
Shareimages,automateworkflows,andmorewithafreeDocker
https://hub.docker.com
Formoreexamplesandideas,visit:
https://docs.docker.com/userguide/
18 / 36
Try Some Commands
$dockerimages
REPOSITORY TAG SIZE
em/notebook v1 864.9MB
ubuntu 16.04 120.1MB
alpine 3.3 4.798MB
busybox latest 1.113MB
firecyberice/whalesay latest 47.25MB
hello-world latest 960B
docker/whalesay latest 247MB
$JOB=$(dockerrun-dubuntu/bin/sh-c"whiletrue;doechoHelloworld;sleep1;done"
$dockerstop$JOB
$dockerstart$JOB
$dockerrestart$JOB
$dockerkill$JOB
$dockerstop$JOB #Containermustbestoppedtoremoveit
$dockerrm$JOB
$dockerrm-f$JOB #Runningcontainer
$dockerrun--rmfirecyberice/whalesayHelloDocker
______________
<HelloDocker>
--------------



## .
###### ==
########## ===
/"""""""""""""""""___/===
~~~{~~~~~~~~~~~~~~~~~/ ===-~~~
______o __/
  __/
___________/
$dockerps-a
CONTAINERID IMAGE COMMAND
2f6f337530d5 hello-world "/hello"
e71dbedafb57 em/notebook:v1 "tini--jupyternote
$dockerrm-f2f6f
2f6f
$dockerps-a
CONTAINERID IMAGE COMMAND
e71dbedafb57 em/notebook:v1 "tini--jupyternote
$dockerrun-it--entrypoint/bin/shfirecyberice/whalesay
19 / 36
$dockerrun-d-P--namewebnginx
224a61ea84cfbf468bd090aebbd0ba534e9b07bb8e7e0068bfaeca1ba72f754b
$dockerps
CONTAINERID IMAGE COMMAND CREATED STATUS PORTS
224a61ea84cf nginx "nginx-g'daemonoff"
e71dbedafb57 em/notebook:v1 "tini--jupyternote"
$dockerportweb
443/tcp->0.0.0.0:32768
80/tcp->0.0.0.0:32769
$dockerstopweb
$dockerrmweb
nginx
20 / 36
Mount a Volume on the Container
Ref: docker.com
$mkdirmysite&&cdmysite
mysite$echo"mynewsite">index.html
mysite$dockerrun-d-P-v$(pwd):/usr/share/nginx/html--namemywebnginx
da01817c28bbdb2f3b71275ba7b9560da4e65f8716329c16787c83181760534c
mysite$dockerportmyweb
443/tcp->0.0.0.0:32770
80/tcp->0.0.0.0:32771
mysite$echo"thisiscool">cool.html
$dockerstopmyweb
$dockerrmmyweb
21 / 36
Custom Images
22 / 36
Build Custom Image
Ref: Build your own image
$mkdirmydockerbuild&&cdmydockerbuild/&&touchDockerfile
$dockerbuild-tdocker-whale.
SendingbuildcontexttoDockerdaemon2.048kB
Step1:FROMdocker/whalesay:latest
--->6b362a9f73eb
Step2:RUNapt-get-yupdate&&apt-getinstall-yfortunes
--->Runningin7375f27597d7
...
Step3:CMD/usr/games/fortune-a|cowsay
--->Runningin09c57e3ebb83
--->428cbace4310
Removingintermediatecontainer09c57e3ebb83
Successfullybuilt428cbace4310
Dockerfile
FROMdocker/whalesay:latest
RUNapt-get-yupdate&&apt-getinstall-yfortunes
CMD/usr/games/fortune-a|cowsay
$dockerrundocker-whale
________________________________________
/Ontheotherhand,lifecanbean 
|endlessparadeofTRANSSEXUALQUILTING|
|BEESaboardacruiseshipto |
DISNEYWORLDifonlyweletit!! /
----------------------------------------



## .
###### ==
######## ===
/""""""""""""""""___/===
~~~{~~~~~~~~~~~~~~~~/ ===-~~~
______o __/
  __/
__________/
23 / 36
Example Dockerfile
docker/whalesay
FROMubuntu:14.04
RUNapt-getupdate
&&apt-getinstall-ycowsay--no-install-recommends
&&rm-rf/var/lib/apt/lists/*
&&mv/usr/share/cowsay/cows/default.cow/usr/share/cowsay/cows/orig-default.cow
#"cowsay"installsto/usr/games
ENVPATH$PATH:/usr/games
COPYdocker.cow/usr/share/cowsay/cows/
RUNln-sv/usr/share/cowsay/cows/docker.cow/usr/share/cowsay/cows/default.cow
CMD["cowsay"]
firecyberice/whalesay
FROMalpine:3.2
RUNapkupdate
&&apkaddgitperl
&&cd/tmp/
&&gitclonehttps://github.com/jasonm23/cowsay.git
&&cdcowsay&&./install.sh/usr/local
&&cd..
&&rm-rfcowsay
&&apkdelgit
ENVPATH$PATH
COPYdocker.cow/usr/local/share/cows/
#Movethe"default.cow"outofthewaysowecanoverwriteit
RUN
mv/usr/local/share/cows/default.cow/usr/local/share/cows
&&ln-sv/usr/local/share/cows/docker.cow/usr/local/shar
ENTRYPOINT["cowsay"]
24 / 36
$dockerrun--namemyredis-itubuntu:16.04bash
root@ac6002b2a98b:/#apt-getupdate
root@ac6002b2a98b:/#apt-getinstallwget
root@ac6002b2a98b:/#apt-getinstallbuild-essentialtcl8.5
root@ac6002b2a98b:/#wgethttp://download.redis.io/redis-stable.tar.gz
root@ac6002b2a98b:/#tarxzfredis-stable.tar.gz
root@ac6002b2a98b:/#cdredis-stable&&make&&makeinstall
root@ac6002b2a98b:/#./redis-stable/utils/install_server.sh
...
Selectedconfig:
Port :6379
Configfile :/etc/redis/6379.conf
Logfile :/var/log/redis_6379.log
Datadir :/var/lib/redis/6379
Executable :/usr/local/bin/redis-server
CliExecutable:/usr/local/bin/redis-cli
Isthisok?ThenpressENTERtogoonorCtrl-Ctoabort.
Copied/tmp/6379.conf=>/etc/init.d/redis_6379
Installingservice...
Success!
StartingRedisserver...
Installationsuccessful
Manual Process
test/myredis:v1
Ref: Getting Started with Docker
root@ac6002b2a98b:/redis-stable#psax|grepredis
root@ac6002b2a98b:/redis-stable#src/redis-cli
127.0.0.1:6379>setfoobar
OK
127.0.0.1:6379>getfoo
"bar"
127.0.0.1:6379>exit
root@ac6002b2a98b:/redis-stable#exit
$dockerps-a
$dockercommit-m"addredis"-a"em"myredistest/myredis:v1
sha256:9b75a94f67cb47b012f445ed65fb13fc67d05a00ad1bb262d20ba4d
$dockerimages|grepredis
test/myredis v1 9b75a94f67cb 39secondsago 408.3MB
25 / 36
Dockerfile
test/myredis:df
$dockerbuild-ttest/myredis:df.
$dockerimages|grepredis
test/myredis df 9a450ae418d8 Aboutaminuteago 408.6
test/myredis v1 9b75a94f67cb 13minutesago 408.3
$dockerrun-d-p6379:6379test/myredis:df
1240a12b56e4a87dfe89e4ca4400eb1cafde802ac0187a54776f9ea54bb7f74f
$dockerps
CONTAINERID IMAGE COMMAND CREATED STATUS PORTS
1240a12b56e4 test/myredis:df "redis-server"
$sudoapt-getinstallredis-tools
$redis-cli
127.0.0.1:6379>setbatman
OK
127.0.0.1:6379>getbat
"man"
127.0.0.1:6379>quit
FROMubuntu:16.04
RUNapt-getupdate
RUNapt-getinstall-ywget
RUNapt-getinstall-ybuild-essentialtcl8.5
RUNwgethttp://download.redis.io/redis-stable.tar.gz
RUNtarxzfredis-stable.tar.gz
RUNcdredis-stable&&make&&makeinstall
RUN./redis-stable/utils/install_server.sh
EXPOSE6379
ENTRYPOINT ["redis-server"]
26 / 36
Docker Compose
27 / 36
Docker Compose
Compose is a tool for de ning and running multi-container
Docker applications. With Compose, you use a Compose le to
con gure your application's services. Then, using a single
command, you create and start all the services from your
con guration.
Using Compose is basically a three-step process:
1. De ne your app's environment with a Docker le so it can
be reproduced anywhere.
2. De ne the services that make up your app in docker-
compose.yml so they can be run together in an isolated
environment.
3. Lastly, run docker-compose up and Compose will start
and run your entire app.
Ref: Overview of Docker Compose
28 / 36
$docker-composeversion
docker-composeversion1.7.0,build0d7bf73
docker-pyversion:1.8.0
CPythonversion:2.7.9
OpenSSLversion:OpenSSL1.0.1e11Feb2013
$curl-Lhttps://github.com/docker/compose/releases/download/
$chmod+x/usr/local/bin/docker-compose
Docker Compose
Getting Started
29 / 36
Getting Started
Step #1
app.py
requirements.txt
flask
redis
Ref: Getting Started
fromflaskimportFlask
fromredisimportRedis
app=Flask(__name__)
redis=Redis(host='redis',port=6379)
@app.route('/')
defhello():
redis.incr('hits')
return'HelloWorld!Ihavebeenseen%stimes.'%redis.g
if__name__=="__main__":
app.run(host="0.0.0.0",debug=True)
30 / 36
Dockerfile
FROMpython:2.7
ADD./code
WORKDIR/code
RUNpipinstall-rrequirements.txt
CMDpythonapp.py
$dockerbuild-tweb.
$dockerimages|grepweb
web latest d6f25a9bf632 2minutesago 667.7MB
Getting Started
Step #2
31 / 36
Getting Started
Step #3
docker-compose.yml
version:'2'
services:
web:
build:.
ports:
-"5000:5000"
volumes:
-.:/code
depends_on:
-redis
redis:
image:redis
32 / 36
Getting Started
Step #4
$docker-composeup
Creatingnetwork"composetest_default"withthedefaultdriver
Buildingweb
...
$docker-composeup-d
33 / 36
Refs
34 / 36
Refs
1. Docker Introduction
2. Docker - Documentation
3. Docker Ecosystem - Digital Ocean
4. LXC vs. Docker - Flockport
5. CLIs Reference docker ps
6. Open Container Initiative
7. Getting Started with Docker
8. Docker Compose - Getting Started
35 / 36
END
Eueung Mulyana
http://eueung.github.io/docker-stuff/intro
CodeLabs | Attribution-ShareAlike CC BY-SA
36 / 36

More Related Content

Docker Basics