Slide 1

Slide 1 text

ì   10  Docker  Tips  in  10  Minutes   Brian  Morearty                          Hands  on  with  Docker  -­‐  handsonwith.com                              Nov  20,  2013  

Slide 2

Slide 2 text

1.  Getting  the  id  of  the  last-­‐run   container     15  Docker  Tips  in  5  Minutes   2  

Slide 3

Slide 3 text

•  This  works  great  in  scripts:       •  But  is  annoying  interacCvely,  and  only   works  with  detached  containers.   •  Try  this  instead:   ! $ ID=$(docker run -d ubuntu myapp)! $ docker commit $ID helloworld! fd08a884dc79! 15  Docker  Tips  in  5  Minutes   3  

Slide 4

Slide 4 text

! $ alias dl='docker ps -l -q'! $ docker run ubuntu echo hello world! hello world! $ dl! 1904cf045887! $ docker commit `dl` helloworld! fd08a884dc79! 15  Docker  Tips  in  5  Minutes   4  

Slide 5

Slide 5 text

2.  Why  you  always  want  a  Dockerfile,  even   if  you  install  everything  in  the  shell   15  Docker  Tips  in  5  Minutes   5  

Slide 6

Slide 6 text

$ docker run -i -t ubuntu bash! root@db0c3978abf8:/# apt-get install postgresql! Reading package lists... Done! Building dependency tree... Done! etc., etc., etc.! root@db0c3978abf8:/# exit! $ docker commit \! -run='{"Cmd":["postgres", 
 "-too -many -opts"]}' \! `dl` postgres! 5061b88e4cf0! 15  Docker  Tips  in  5  Minutes   6  

Slide 7

Slide 7 text

  •  Instead,  make  a  wee  liFle   Dockerfile  that  is  FROM  the  image   you  made  interacCvely.   •  There  you  can  set  CMD,   ENTRYPOINT,  VOLUME,  etc.   15  Docker  Tips  in  5  Minutes   7  

Slide 8

Slide 8 text

3.  jq  -­‐  the  gangsta  way  to  parse     docker inspect’s  output ! 15  Docker  Tips  in  5  Minutes   8  

Slide 9

Slide 9 text

! $ docker inspect `dl` | \! grep IPAddress | cut -d '"' -f 4! 172.17.0.52! ! $ docker inspect `dl` | \! jq -r '.[0].NetworkSettings.IPAddress'! 172.17.0.52! !     •  JSON  is  for  JavaScript.   15  Docker  Tips  in  5  Minutes   9  

Slide 10

Slide 10 text

4.  What  environment  variables  does   an  image  have?     15  Docker  Tips  in  5  Minutes   10  

Slide 11

Slide 11 text

! $ docker run ubuntu env! HOME=/! PATH=/usr/local/sbin:/usr/local/bin:/ usr/sbin:/usr/bin:/sbin:/bin! container=lxc! HOSTNAME=5e1560b7f757!     •  This  is  nice  when  using  docker run
 -link  to  connect  containers.  (Later  slide.)   15  Docker  Tips  in  5  Minutes   11  

Slide 12

Slide 12 text

5.  CMD  vs.  ENTRYPOINT  instruction   15  Docker  Tips  in  5  Minutes   12  

Slide 13

Slide 13 text

! $ cat Dockerfile! FROM ubuntu! CMD ["echo"]! ! $ docker run \
 imagename \
 echo hello! hello! ! 15  Docker  Tips  in  5  Minutes   13   ! $ cat Dockerfile! FROM ubuntu! ENTRYPOINT ["echo"]! ! $ docker run \
 imagename \
 echo hello! echo hello! !     •  Overrideable.       •  Not  overridden  by   default.  

Slide 14

Slide 14 text

6.  Graph  the  dependencies  among   your  images     15  Docker  Tips  in  5  Minutes   14  

Slide 15

Slide 15 text

! # Generate an image dependency diagram! $ docker images -viz | \! dot -Tpng -o docker.png! ! # To see it, run this on the host:! $ python -m SimpleHTTPServer! ! # then browse to:! # http://machinename:8000/docker.png!     15  Docker  Tips  in  5  Minutes   15  

Slide 16

Slide 16 text

15  Docker  Tips  in  5  Minutes   16   •  And  hope  yours  doesn’t  look  like  this.  

Slide 17

Slide 17 text

15  Docker  Tips  in  5  Minutes   17  

Slide 18

Slide 18 text

7.  Where  does  Docker  store   everything?   15  Docker  Tips  in  5  Minutes   18  

Slide 19

Slide 19 text

! $ sudo su! # cd /var/lib/docker! # ls -F! containers/ graph/ repositories volumes/!     •  Explore!   •  “graph”  means  images.   •  Filesystem  layers  are  in  graph/imageid/layer.   15  Docker  Tips  in  5  Minutes   19  

Slide 20

Slide 20 text

8.  Docker  source  code:  Go,  Go,  Go,   Grabote.   15  Docker  Tips  in  5  Minutes   20  

Slide 21

Slide 21 text

15  Docker  Tips  in  5  Minutes   21  

Slide 22

Slide 22 text

15  Docker  Tips  in  5  Minutes   22   commands.go   The  CLI.     api.go   The  REST  API  router.     server.go   ImplementaCon  of  much  of  the  the  REST  API.   buildfile.go   The  Dockerfile  parser.  

Slide 23

Slide 23 text

9.  RUN  some  daemons,  exit  the   container.  What  happens?   15  Docker  Tips  in  5  Minutes   23  

Slide 24

Slide 24 text

$ cat Dockerfile! FROM ubuntu! MAINTAINER Brian Morearty! RUN apt-get install mysql-server! RUN /etc/init.d/mysql start ...! ! $ docker run -i -t mysqlimage bash! root@08d363f57161:/# ps aux! # Doesn’t show mysql daemon!         •  Don’t  run  a  daemon  in  your  Dockerfile.   15  Docker  Tips  in  5  Minutes   24  

Slide 25

Slide 25 text

10.  Letting  containers  talk  to  each   other   15  Docker  Tips  in  5  Minutes   25  

Slide 26

Slide 26 text

15  Docker  Tips  in  5  Minutes   26   • I  saved  the  best  for   last.  

Slide 27

Slide 27 text

# Run a container. Give it a name.! $ docker run -d -name loldb loldbimage! ! # Run another. Link it to the first,! # using an alias.! $ docker run -link /loldb:cheez \! otherimage env! CHEEZ_PORT=tcp://172.17.0.8:6379! CHEEZ_PORT_1337_TCP=tcp://172.17.0.8:6379! CHEEZ_PORT_1337_TCP_ADDR=172.17.0.12! CHEEZ_PORT_1337_TCP_PORT=6379! CHEEZ_PORT_1337_TCP_PROTO=tcp! !         •  This  sets  up  a  bridge.  2nd  container  needs  to   know  aliased  name  (CHEEZ)  and  port  (1337).   15  Docker  Tips  in  5  Minutes   27  

Slide 28

Slide 28 text

Extracted  from  our  1-­‐day,  intro-­‐level   Hands  on  with  Docker  class.     Docker’s  only  training  partner.     Next  class:  Sat.,  December  14th.   handsonwith.com   15  Docker  Tips  in  5  Minutes   28