Top Banner
Ladislav Prskavec http://blog.prskavec.net @abtris 23.11.2013
55

Docker.io

Jan 15, 2015

Download

Technology

Docker is an open-source project to easily create lightweight, portable, self-sufficient containers from any application. The same container that a developer builds and tests on a laptop can run at scale, in production, on VMs, bare metal, OpenStack clusters, public clouds and more.
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Docker.io

Ladislav Prskavec http://blog.prskavec.net

@abtris 23.11.2013

Page 2: Docker.io
Page 3: Docker.io
Page 4: Docker.io

4 yearsdocker

packer

Canonical's JuJu serf

CloudFlare

SoundCloud

Page 5: Docker.io

What is docker?

Page 6: Docker.io

an open source project to pack, ship and run any application as

a lightweight container

Page 7: Docker.io

Why container?

Page 8: Docker.io

Analogy from logistics

Page 9: Docker.io
Page 10: Docker.io
Page 11: Docker.io
Page 12: Docker.io

build once, run anywhere

~ developer

Page 13: Docker.io

configure once, run anything

~ operations

Page 14: Docker.io

Containers are to Virtual Machines

as threads are to processes. Or you can think of them as

chroots on steroids.

~ Will Sargent

Page 15: Docker.io

What is container in docker?• Kernel namespaces (ipc, uts, mount, pid, network

and user)

• Chroots (using pivot_root)

• Apparmor and SELinux profiles

• Kernel capabilities

• Control groups (cgroups)

• AUFS or replacement in 0.7 version and later

Page 16: Docker.io

SERVER

HOST OS

Docker Engine

Container A

Container B

Container C

Page 17: Docker.io

SERVER

HOST OS

Docker Engine

Container A

Container B

Container C

SERVER

HOST OS

Hypervisor

Guest OS Guest OS Guest OS

APP A

APP B

APP C

Page 18: Docker.io

Basics

Page 19: Docker.io

Installation

Page 20: Docker.io

Finding and downloading images

docker  search  ubuntu

docker  pull  shykes/ubuntu

Page 21: Docker.io

Running

docker  run  ubuntu  /bin/echo  hello  world  !

docker  run  -­‐i  -­‐t  ubuntu  /bin/bash

Page 22: Docker.io

Committing your changesdocker  ps  -­‐l

docker  commit  ID  base/with_curl

Page 23: Docker.io

Pushing an image to the repository

docker  push  abtris/curl

docker  push  internal_repository:5000/curl

Page 24: Docker.io

Image

Page 25: Docker.io
Page 26: Docker.io

Parent Image

Page 27: Docker.io

Dockerfile Best Practices

• Use the cache

• Use tags

• EXPOSE-ing ports

• CMD and ENTRYPOINT syntax

• CMD and ENTRYPOINT better together

Page 28: Docker.io

Use the cache

FROM  ubuntu:latest  MAINTAINER  Ladislav  Prskavec  !RUN  echo  "deb  http://archive.ubuntu.com/ubuntu  precise  main  universe"  >  /etc/apt/sources.list  !RUN  apt-­‐get  update    RUN  apt-­‐get  -­‐y  upgrade

Page 29: Docker.io

Use tags

!docker  build  -­‐t="abtris/sentry"  .

Page 30: Docker.io

EXPOSE-ing ports

!#  private  and  public  mapping  EXPOSE  80:8080  !#  private  only  EXPOSE  80

Page 31: Docker.io

CMD and ENTRYPOINT

!!CMD  /bin/echo  #  or  CMD  ["/bin/echo"]

Page 32: Docker.io

CMD and ENTRYPOINT better together

RUN  apt-­‐get  install  -­‐y  rethinkdb  !#  Rethinkdb  process  EXPOSE  28015  #  Rethinkdb  admin  console  EXPOSE  8080  !#  Create  the  /rethinkdb_data  dir  structure  RUN  /usr/bin/rethinkdb  create  !ENTRYPOINT  ["/usr/bin/rethinkdb"]  !CMD  ["-­‐-­‐help"]

Page 33: Docker.io

Running  'rethinkdb'  will  create  a  new  data  directory  or  use  an  existing  one,      and  serve  as  a  RethinkDB  cluster  node.  File  path  options:      -­‐d  [  -­‐-­‐directory  ]  path                      specify  directory  to  store  data  and  metadata      -­‐-­‐io-­‐threads  n                                        how  many  simultaneous  I/O  operations  can  happen                                                                          at  the  same  time  !Machine  name  options:      -­‐n  [  -­‐-­‐machine-­‐name  ]  arg                  the  name  for  this  machine  (as  will  appear  in                                                                          the  metadata).    If  not  specified,  it  will  be                                                                          randomly  chosen  from  a  short  list  of  names.  !Network  options:      -­‐-­‐bind  {all  |  addr}                              add  the  address  of  a  local  interface  to  listen                                                                          on  when  accepting  connections;  loopback                                                                          addresses  are  enabled  by  default      -­‐-­‐cluster-­‐port  port                              port  for  receiving  connections  from  other  nodes      -­‐-­‐driver-­‐port  port                                port  for  rethinkdb  protocol  client  drivers      -­‐o  [  -­‐-­‐port-­‐offset  ]  offset              all  ports  used  locally  will  have  this  value                                                                          added      -­‐j  [  -­‐-­‐join  ]  host:port                      host  and  port  of  a  rethinkdb  node  to  connect  to      .................

docker run crosbymichael/rethinkdb

Page 34: Docker.io

info:  Running  rethinkdb  1.7.1-­‐0ubuntu1~precise  (GCC  4.6.3)...  info:  Running  on  Linux  3.2.0-­‐45-­‐virtual  x86_64  info:  Loading  data  from  directory  /rethinkdb_data  warn:  Could  not  turn  off  filesystem  caching  for  database  file:  "/rethinkdb_data/metadata"  (Is  the  file  located  on  a  filesystem  that  doesn't  support  direct  I/O  (e.g.  some  encrypted  or  journaled  file  systems)?)  This  can  cause  performance  problems.  warn:  Could  not  turn  off  filesystem  caching  for  database  file:  "/rethinkdb_data/auth_metadata"  (Is  the  file  located  on  a  filesystem  that  doesn't  support  direct  I/O  (e.g.  some  encrypted  or  journaled  file  systems)?)  This  can  cause  performance  problems.  info:  Listening  for  intracluster  connections  on  port  29015  info:  Listening  for  client  driver  connections  on  port  28015  info:  Listening  for  administrative  HTTP  connections  on  port  8080  info:  Listening  on  addresses:  127.0.0.1,  172.16.42.13  info:  Server  ready  info:  Someone  asked  for  the  nonwhitelisted  file  /js/handlebars.runtime-­‐1.0.0.beta.6.js,  if  this  should  be  accessible  add  it  to  the  whitelist.

docker run crosbymichael/rethinkdb —bind all

Page 35: Docker.io

FROM  ubuntu:latest  MAINTAINER  Ladislav  Prskavec  <[email protected]>  RUN  apt-­‐get  update    RUN  apt-­‐get  -­‐y  upgrade  RUN  DEBIAN_FRONTEND=noninteractive  apt-­‐get  -­‐y  install  curl  apache2  libapache2-­‐mod-­‐php5  vim-­‐tiny    RUN  chown  -­‐R  www-­‐data:www-­‐data  /var/www/  EXPOSE  80  EXPOSE  22  CMD  ["/bin/bash"]

git clone https://gist.github.com/abtris/7548643

docker build .

Dockerfile

Page 36: Docker.io

Use raw Dockerfile

1. Cache wins.

2. Chef, ansible, etc, does not use cache.

3. Raw Dockerfile uses cache.

4. Raw Dockerfile wins.

Page 37: Docker.io

Links• If you have a docker container with the name CONTAINER

(specified by docker run -name CONTAINER) and in the Dockerfile, it has an exposed port: EXPOSE 1337

• docker run -d -link CONTAINER:ALIAS -name LINKED user/wordpress

• CONTAINER will show up in LINKED with the following environment variables:$ALIAS_PORT_1337_TCP_PORT$ALIAS_PORT_1337_TCP_ADDR

Page 38: Docker.io

Container Lifecycle• docker run - creates a container.

• docker stop stops it.

• docker start will start it again.

• docker restart restarts a container.

• docker rm deletes a container.

• docker attach will connect to a running container.

• docker wait blocks until container stops.

Page 39: Docker.io

Container Info• docker ps shows running containers.

• docker ps -a shows running and stopped containers.

• docker inspect looks at all the info on a container (including IP address).

• docker logs gets logs from container.

• docker events gets events from container.

• docker port shows public facing port of container.

• docker top shows running processes in container.

Page 40: Docker.io

Import / Export

• docker cp copies into a container.

• docker export turns container fs into tarball.

Page 41: Docker.io

Images Lifecycle• docker import creates an image from a tarball.

• docker build creates image from Dockerfile.

• docker commit creates image from a container.

• docker rmi removes an image.

• docker insert inserts a file from URL into image

Page 42: Docker.io

Images Info

• docker images shows all images

• docker history shows history of image

• docker tag tags an image to a name (local or registry)

Page 43: Docker.io

Registry & Repository

• docker search searches registry for image

• docker pull pulls an image from registry to local machine

• docker push pushes an image to the registry from local machine.

Page 44: Docker.io

Good practices• Install a internal docker registry

• Install Shipyard

• Create base image

• Build from your base image

• Push your images

• Save off your registry

Page 45: Docker.io

Install a internal docker registry

• Install an internal registry (the fast way) and run it as a daemon:docker  run  -­‐name  internal_registry  -­‐d  -­‐p  5000:5000  samalba/docker-­‐registry  

• Alias server to localhostecho  "127.0.0.1            internal_registry"  >>  /etc/host  

• Check internal_registry exists and is running on port 5000:curl  -­‐-­‐get  -­‐-­‐verbose  http://internal_registry:5000/v1/_ping

Page 46: Docker.io

Create base image

• Create a Dockerfile with initialization code such as `apt-get update / apt-get install’ etc: this is your base.

• Build your base image, then push it to the internal registry with docker  build  -­‐t  internal_registry:5000/base  .

Page 47: Docker.io

Build from your base image

• Build all of your other Dockerfile pull from “base” instead of ubuntu.

• Keep playing around until you have your images working.

Page 48: Docker.io

Push your images

• Push all of your images into the internal registry. docker  tag  IMAGE-­‐ID  abtris/apachedocker  push  internal_registry:5000/apache

Page 49: Docker.io

Save off your registry• If you need to blow away your Vagrant or set

someone else up, it’s much faster to do it with all the images still intact: docker  export  internal_registry  >  internal_registry.targzip  internal_registry.tarmv  internal_registry.tar.gz  /vagrant

Page 50: Docker.io

Projects uses docker

http://deis.io/ https://flynn.io/

http://coreos.com/

https://github.com/progrium/dokku

http://opdemand.com/

Page 51: Docker.io

http://index.docker.io

Page 52: Docker.io
Page 53: Docker.io

https://index.docker.io/u/abtris/devfest-2013/

Page 54: Docker.io

http://shipyard-project.com/

Page 55: Docker.io

docker.io !

https://plus.google.com/u/1/communities/108146856671494713993

docker cheat sheet https://gist.github.com/wsargent/7049221

demo files https://github.com/abtris/devfest-2013

docker sources http://bit.ly/dockersources