Slide 1

Slide 1 text

Geoffrey Bachelet – @ubermuda What it is. What it can do for you.

Slide 2

Slide 2 text

Who am I? • Geoffrey Bachelet • @ubermuda • Then: Lagardère, SensioLabs, KnpLabs, and PMSIPilot. • Now: Stage1, Gustave, Freelance.

Slide 3

Slide 3 text

Go!

Slide 4

Slide 4 text

"Container Engine" Based on the Linux kernel's LXC instructions Processes and resources isolation "chroot" on steroids / super lightweight VMs

Slide 5

Slide 5 text

Containers vs VMs LXC / Jails / etc Use the host's kernel Boots in seconds 0 overhead, almost Easy to pass around Hypervisor Boots a complete OS Boots in... more time. All an OS' overhead Several Go images

Slide 6

Slide 6 text

Docker vs Vagrant Less mature (1 year) 379 contributors Manages containers Dockerfile (homegrown DSL) DIY Mature (4 years) 338 contributors Manages... VMs. Vagrantfile (Ruby) Chef, Puppet, etc

Slide 7

Slide 7 text

$  echo  "deb  https://get.docker.io/ubuntu  docker  main"  \     >  /etc/apt/sources.list.d/docker.list   $  apt-­‐get  update   $  apt-­‐get  install  lxc-­‐docker

Slide 8

Slide 8 text

Create a container

Slide 9

Slide 9 text

$  docker  search  ubuntu   ! $  docker  run  -­‐i  -­‐t  stackbrew/ubuntu  /bin/bash   Unable  to  find  image  'stackbrew/ubuntu'  locally   Pulling  repository  stackbrew/ubuntu   ...   ! root@21d86a0b8387:/#

Slide 10

Slide 10 text

$  docker  search  ubuntu   ! $  docker  run  -­‐i  -­‐t  stackbrew/ubuntu  /bin/bash   Unable  to  find  image  'stackbrew/ubuntu'  locally   Pulling  repository  stackbrew/ubuntu   ...   ! root@21d86a0b8387:/#

Slide 11

Slide 11 text

credit: http:/ /docs.docker.io/en/latest/terms/image/

Slide 12

Slide 12 text

$  docker  search  ubuntu   ! $  docker  run  -­‐i  -­‐t  stackbrew/ubuntu  /bin/bash   Unable  to  find  image  'stackbrew/ubuntu'  locally   Pulling  repository  stackbrew/ubuntu   ...   ! root@21d86a0b8387:/#

Slide 13

Slide 13 text

credit: http:/ /docs.docker.io/en/latest/terms/image/

Slide 14

Slide 14 text

$  docker  search  ubuntu   ! $  docker  run  -­‐i  -­‐t  stackbrew/ubuntu  /bin/bash   Unable  to  find  image  'stackbrew/ubuntu'  locally   Pulling  repository  stackbrew/ubuntu   ...   ! root@21d86a0b8387:/#

Slide 15

Slide 15 text

Commit the container

Slide 16

Slide 16 text

root@21d86a0b8387:/#  apt-­‐get  install  nginx   root@21d86a0b8387:/#  exit   ! $  docker  ps  -­‐q  -­‐n  1   9cc9c762a0eb   ! $  docker  commit  9cc9c762a0eb  m6web/nginx   240198b750c3cc950c60005d6d24cae4fc2dbcc6c31e274574af68d4a2e8   ! $  docker  images   REPOSITORY            TAG                  IMAGE  ID   m6web/nginx          latest            240198b750c3

Slide 17

Slide 17 text

root@21d86a0b8387:/#  apt-­‐get  install  nginx   root@21d86a0b8387:/#  exit   ! $  docker  ps  -­‐q  -­‐n  1   9cc9c762a0eb   ! $  docker  commit  9cc9c762a0eb  m6web/nginx   240198b750c3cc950c60005d6d24cae4fc2dbcc6c31e274574af68d4a2e8   ! $  docker  images   REPOSITORY            TAG                  IMAGE  ID   m6web/nginx          latest            240198b750c3

Slide 18

Slide 18 text

root@21d86a0b8387:/#  apt-­‐get  install  nginx   root@21d86a0b8387:/#  exit   ! $  docker  ps  -­‐q  -­‐n  1   9cc9c762a0eb   ! $  docker  commit  9cc9c762a0eb  m6web/nginx   240198b750c3cc950c60005d6d24cae4fc2dbcc6c31e274574af68d4a2e8   ! $  docker  images   REPOSITORY            TAG                  IMAGE  ID   m6web/nginx          latest            240198b750c3

Slide 19

Slide 19 text

root@21d86a0b8387:/#  apt-­‐get  install  nginx   root@21d86a0b8387:/#  exit   ! $  docker  ps  -­‐q  -­‐n  1   9cc9c762a0eb   ! $  docker  commit  9cc9c762a0eb  m6web/nginx   240198b750c3cc950c60005d6d24cae4fc2dbcc6c31e274574af68d4a2e8   ! $  docker  images   REPOSITORY            TAG                  IMAGE  ID   m6web/nginx          latest            240198b750c3

Slide 20

Slide 20 text

root@21d86a0b8387:/#  apt-­‐get  install  nginx   root@21d86a0b8387:/#  exit   ! $  docker  ps  -­‐q  -­‐n  1   9cc9c762a0eb   ! $  docker  commit  9cc9c762a0eb  m6web/nginx   240198b750c3cc950c60005d6d24cae4fc2dbcc6c31e274574af68d4a2e8   ! $  docker  images   REPOSITORY            TAG                  IMAGE  ID   m6web/nginx          latest            240198b750c3

Slide 21

Slide 21 text

Run the image

Slide 22

Slide 22 text

$  docker  run  -­‐p  80  m6web/nginx  nginx  -­‐g  'daemon  off;'

Slide 23

Slide 23 text

$  docker  ps   CONTAINER  ID    ...    PORTS   923cb190dbc3    ...    0.0.0.0:49155-­‐>80/tcp   ! $  curl  http://localhost:49155       Welcome  to  nginx!   ...

Slide 24

Slide 24 text

Dockerfile

Slide 25

Slide 25 text

credit: http:/ /docs.docker.io/en/latest/terms/image/

Slide 26

Slide 26 text

FROM  stackbrew/ubuntu   ! RUN  apt-­‐get  update  -­‐y   RUN  apt-­‐get  install  nginx  -­‐y   RUN  echo  "\ndaemon  off;"  >>  /etc/nginx/nginx.conf   ! EXPOSE  80   ENTRYPOINT  ["nginx"]

Slide 27

Slide 27 text

FROM  stackbrew/ubuntu   ! RUN  apt-­‐get  update  -­‐y   RUN  apt-­‐get  install  nginx  -­‐y   RUN  echo  "\ndaemon  off;"  >>  /etc/nginx/nginx.conf   ! EXPOSE  80   ENTRYPOINT  ["nginx"]

Slide 28

Slide 28 text

FROM  stackbrew/ubuntu   ! RUN  apt-­‐get  update  -­‐y   RUN  apt-­‐get  install  nginx  -­‐y   RUN  echo  "\ndaemon  off;"  >>  /etc/nginx/nginx.conf   ! EXPOSE  80   ENTRYPOINT  ["nginx"]

Slide 29

Slide 29 text

FROM  stackbrew/ubuntu   ! RUN  apt-­‐get  update  -­‐y   RUN  apt-­‐get  install  nginx  -­‐y   RUN  echo  "\ndaemon  off;"  >>  /etc/nginx/nginx.conf   ! EXPOSE  80   ENTRYPOINT  ["nginx"]

Slide 30

Slide 30 text

FROM  stackbrew/ubuntu   ! RUN  apt-­‐get  update  -­‐y   RUN  apt-­‐get  install  nginx  -­‐y   RUN  echo  "\ndaemon  off;"  >>  /etc/nginx/nginx.conf   ! EXPOSE  80   ENTRYPOINT  ["nginx"]

Slide 31

Slide 31 text

$  docker  run  \     -­‐p  8000:80  \     -­‐v  $(pwd):/usr/share/nginx/www  \     m6web/nginx   ! $  echo  'Hello,  world!'  >  index.html   ! $  curl  http://localhost:8000   Hello,  world!

Slide 32

Slide 32 text

$  docker  run  \     -­‐p  8000:80  \     -­‐v  $(pwd):/usr/share/nginx/www  \     m6web/nginx   ! $  echo  'Hello,  world!'  >  index.html   ! $  curl  http://localhost:8000   Hello,  world!

Slide 33

Slide 33 text

$  docker  run  \     -­‐p  8000:80  \     -­‐v  $(pwd):/usr/share/nginx/www  \     m6web/nginx   ! $  echo  'Hello,  world!'  >  index.html   ! $  curl  http://localhost:8000   Hello,  world!

Slide 34

Slide 34 text

$  docker  run  \     -­‐p  8000:80  \     -­‐v  $(pwd):/usr/share/nginx/www  \     m6web/nginx   ! $  echo  'Hello,  world!'  >  index.html   ! $  curl  http://localhost:8000   Hello,  world!

Slide 35

Slide 35 text

Now what?

Slide 36

Slide 36 text

credit: http:/ /robtiffany.com/5-steps-to-containerize-your-apps/

Slide 37

Slide 37 text

FROM  stackbrew/ubuntu   ! ENV  DEBIAN_FRONTEND  noninteractive   ! RUN  apt-­‐get  update  -­‐y   RUN  apt-­‐get  install  -­‐y  daemontools  curl  nginx  \     php5-­‐fpm  php5-­‐cli  php5-­‐mysqlnd  php5-­‐intl  \     mysql-­‐server   ! RUN  curl  -­‐sS  https://getcomposer.org/installer  |  php   RUN  mv  composer.phar  /usr/local/bin/composer   ! RUN  echo  "daemonize=no"  >  /etc/php5/fpm/pool.d/daemonize.conf   RUN  echo  "\ndaemon  off;"  >>  /etc/nginx/nginx.conf   ! ADD  services  /srv/services   RUN  find  /srv/services  -­‐name  run  -­‐exec  chmod  +x  {}  \;   ! ADD  nginx.conf  /etc/nginx/sites-­‐enabled/default   ADD  php.ini  /etc/php5/fpm/php.ini   ADD  php.ini  /etc/php5/cli/php.ini   ADD  entrypoint.sh  /usr/local/bin/entrypoint.sh   ! EXPOSE  80   ENTRYPOINT  ["/usr/local/bin/entrypoint.sh"]

Slide 38

Slide 38 text

FROM  stackbrew/ubuntu   ENV  DEBIAN_FRONTEND  noninteractive   ! RUN  apt-­‐get  update  -­‐y   RUN  apt-­‐get  install  -­‐y  daemontools  curl  nginx  \     php5-­‐fpm  php5-­‐cli  php5-­‐mysqlnd  php5-­‐intl  \     mysql-­‐server   ! RUN  echo  "daemonize=no"  \      >  /etc/php5/fpm/pool.d/daemonize.conf   RUN  echo  "\ndaemon  off;"  \     >>  /etc/nginx/nginx.conf

Slide 39

Slide 39 text

FROM  stackbrew/ubuntu   ENV  DEBIAN_FRONTEND  noninteractive   ! RUN  apt-­‐get  update  -­‐y   RUN  apt-­‐get  install  -­‐y  daemontools  curl  nginx  \     php5-­‐fpm  php5-­‐cli  php5-­‐mysqlnd  php5-­‐intl  \     mysql-­‐server   ! RUN  echo  "daemonize=no"  \      >  /etc/php5/fpm/pool.d/daemonize.conf   RUN  echo  "\ndaemon  off;"  \     >>  /etc/nginx/nginx.conf

Slide 40

Slide 40 text

RUN  curl  -­‐sS  https://getcomposer.org/installer  |  php   RUN  mv  composer.phar  /usr/local/bin/composer

Slide 41

Slide 41 text

ADD  services  /srv/services   RUN  find  /srv/services  -­‐name  run  -­‐exec  chmod  +x  {}  \; =>  services/mysqld/run   #!/bin/bash   exec  mysqld =>  services/nginx/run   #!/bin/bash   exec  nginx =>  services/php5-­‐fpm/run   #!/bin/bash   exec  php5-­‐fpm

Slide 42

Slide 42 text

ADD  nginx.conf  /etc/nginx/sites-­‐enabled/default   ADD  php.ini  /etc/php5/fpm/php.ini   ADD  php.ini  /etc/php5/cli/php.ini   ADD  entrypoint.sh  /usr/local/bin/entrypoint.sh

Slide 43

Slide 43 text

server  {                  listen              80;   !                server_name    m6web;                  access_log      /var/log/nginx/access.log;                  error_log        /var/log/nginx/error.log;   !                root  /var/www/web/;                  index  app_dev.php;   !                location  /  {                                  try_files  $uri  $uri/  /app_dev.php?$query_string;                  }   !                location  ~  [^/]\.php(/|$)  {                                  fastcgi_pass  127.0.0.1:9000;                                  include  fastcgi_params;                  }   }

Slide 44

Slide 44 text

#!/bin/bash   cd  /var/www   composer  install   exec  svscan  /srv/services

Slide 45

Slide 45 text

EXPOSE  80   ENTRYPOINT  ["/usr/local/bin/entrypoint.sh"]

Slide 46

Slide 46 text

docker  run  \     -­‐p  8000:80  \     -­‐v  /project:/var/www  \     m6web/symfony2

Slide 47

Slide 47 text

alias  drun='docker  run  -­‐t  \     -­‐p  8000:80  \     -­‐v  $(pwd):/var/www  \     m6web/symfony2'

Slide 48

Slide 48 text

$  cd  /project   $  drun   Loading  composer  repositories  with  package  information   Installing  dependencies  (including  require-­‐dev)  from  lock  file   ...   ! $  curl  http://localhost:8000

Slide 49

Slide 49 text

credit: http:/ /www.goinflippincrazy.com/2014/03/10/anger-or-happiness-which-is-more-motivating/

Slide 50

Slide 50 text

Container Links

Slide 51

Slide 51 text

credit: http:/ /www.goinflippincrazy.com/2014/03/10/anger-or-happiness-which-is-more-motivating/

Slide 52

Slide 52 text

$  docker  run  -­‐name  redis  m6web/redis   $  docker  run  ...  \     -­‐link  redis:redis  \     m6web/symfony2

Slide 53

Slide 53 text

$  docker  run  -­‐name  redis  m6web/redis   $  docker  run  ...  \     -­‐link  redis:redis  \     m6web/symfony2

Slide 54

Slide 54 text

REDIS_PORT=tcp://172.17.0.44:6379   REDIS_PORT_6379_TCP_PROTO=tcp   REDIS_PORT_6379_TCP_PORT=6379   REDIS_PORT_6379_TCP=tcp://172.17.0.44:6379   REDIS_NAME=/crimson_squirrel9/redis   REDIS_PORT_6379_TCP_ADDR=172.17.0.44

Slide 55

Slide 55 text

REDIS_PORT=tcp://172.17.0.44:6379   REDIS_PORT_6379_TCP_PROTO=tcp   REDIS_PORT_6379_TCP_PORT=6379   REDIS_PORT_6379_TCP=tcp://172.17.0.44:6379   REDIS_NAME=/crimson_squirrel9/redis   REDIS_PORT_6379_TCP_ADDR=172.17.0.44

Slide 56

Slide 56 text

imports:     -­‐  {  resource:  parameters.php  } app/config/config.yml

Slide 57

Slide 57 text

setParameter(     'redis_host',     getenv('REDIS_PORT_6379_TCP_ADDR')   ); app/config/parameters.php

Slide 58

Slide 58 text

setParameter(     'redis_host',     getenv('REDIS_PORT_6379_TCP_ADDR')   ); app/config/parameters.php

Slide 59

Slide 59 text

Volume sharing

Slide 60

Slide 60 text

FROM  stackbrew/ubuntu   VOLUME  ["/var/lib/mysql"]   ENTRYPOINT  ["true"] data  container

Slide 61

Slide 61 text

FROM  stackbrew/ubuntu   ENV  DEBIAN_FRONTEND  noninteractive   RUN  apt-­‐get  update  -­‐y   RUN  apt-­‐get  install  -­‐y  mysql-­‐server  mysql-­‐client   ADD  entrypoint.sh  /usr/local/bin/entrypoint.sh   ENTRYPOINT  ["/usr/local/bin/entrypoint.sh"] mysql  container

Slide 62

Slide 62 text

#!/bin/bash   ! if  [  !  -­‐f  /var/lib/mysql/ibdata1  ];  then          mysql_install_db  >  /dev/null  2>  /dev/null   fi   ! mysqld_safe  >  /dev/null  2>  /dev/null  &   ! while  !  mysqladmin  -­‐s  ping;  do      echo  -­‐n  .;      sleep  1;   done;   ! exec  mysql

Slide 63

Slide 63 text

#!/bin/bash   ! if  [  !  -­‐f  /var/lib/mysql/ibdata1  ];  then          mysql_install_db  >  /dev/null  2>  /dev/null   fi   ! mysqld_safe  >  /dev/null  2>  /dev/null  &   ! while  !  mysqladmin  -­‐s  ping;  do      echo  -­‐n  .;      sleep  1;   done;   ! exec  mysql

Slide 64

Slide 64 text

#!/bin/bash   ! if  [  !  -­‐f  /var/lib/mysql/ibdata1  ];  then          mysql_install_db  >  /dev/null  2>  /dev/null   fi   ! mysqld_safe  >  /dev/null  2>  /dev/null  &   ! while  !  mysqladmin  -­‐s  ping;  do      echo  -­‐n  .;      sleep  1;   done;   ! exec  mysql

Slide 65

Slide 65 text

#!/bin/bash   ! if  [  !  -­‐f  /var/lib/mysql/ibdata1  ];  then          mysql_install_db  >  /dev/null  2>  /dev/null   fi   ! mysqld_safe  >  /dev/null  2>  /dev/null  &   ! while  !  mysqladmin  -­‐s  ping;  do      echo  -­‐n  .;      sleep  1;   done;   ! exec  mysql

Slide 66

Slide 66 text

$  docker  build  -­‐t  m6web/data  data/   $  docker  build  -­‐t  m6web/mysql  mysql/

Slide 67

Slide 67 text

$  docker  run  -­‐name  mysql-­‐data  m6web/data   $  docker  run  -­‐i  -­‐t  \     -­‐-­‐volumes-­‐from  mysql-­‐data  \     m6web/mysql   ...   mysql>  create  database  'symfony';

Slide 68

Slide 68 text

#!/bin/bash   ! if  [  !  -­‐f  /var/lib/mysql/ibdata1  ];  then          mysql_install_db   fi   ! exec  mysqld_safe entrypoint.sh

Slide 69

Slide 69 text

setParameter('redis_host',     getenv('REDIS_PORT_6379_TCP_ADDR')   );   ! $container-­‐>setParameter('database_host',     getenv('MYSQL_PORT_3306_TCP_ADDR')   ); app/config/parameters.php

Slide 70

Slide 70 text

$  docker  run  -­‐name  mysql-­‐data  m6web/data   $  docker  run  -­‐name  redis  m6web/redis   $  docker  run  -­‐-­‐volumes-­‐from  mysql-­‐data  -­‐name  mysql  m6web/mysql   $  docker  run  ...  \     -­‐link  redis:redis  \     -­‐link  mysql:mysql  \     m6web/symfony2

Slide 71

Slide 71 text

$  docker  run  -­‐name  mysql-­‐data  m6web/data   $  docker  run  -­‐name  redis  m6web/redis   $  docker  run  -­‐-­‐volumes-­‐from  mysql-­‐data  -­‐name  mysql  m6web/mysql   $  docker  run  ...  \     -­‐link  redis:redis  \     -­‐link  mysql:mysql  \     m6web/symfony2

Slide 72

Slide 72 text

No content

Slide 73

Slide 73 text

And more! • docker run -d, attach, logs, top, ... • Orchestration (https://github.com/marmelab/gaudi) • Docker Index / local Index • Docker Remote API • Dockerfile: USER, WORKDIR, ONBUILD, ... • ...

Slide 74

Slide 74 text

Concepts recap. • An image is like a VM image, it contains the hard- drive and some configuration. • Images can be pushed and pulled from an index. • A container is a running instance of an image.

Slide 75

Slide 75 text

Concepts recap. • You can commit a terminated container, and you get a reusable image representing the state of that container. • Volumes are like shared directories. Containers can share zero or many volumes. • Containers can be linked to one another.

Slide 76

Slide 76 text

Thanks! https://github.com/ubermuda/m6web-docker/ Geoffrey Bachelet – @ubermuda