Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Docker Introduction

ubermuda
March 28, 2014

Docker Introduction

ubermuda

March 28, 2014
Tweet

More Decks by ubermuda

Other Decks in Technology

Transcript

  1. Who am I? • Geoffrey Bachelet • @ubermuda • Then:

    Lagardère, SensioLabs, KnpLabs, and PMSIPilot. • Now: Stage1, Gustave, Freelance.
  2. Go!

  3. "Container Engine" Based on the Linux kernel's LXC instructions Processes

    and resources isolation "chroot" on steroids / super lightweight VMs
  4. 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
  5. 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
  6. $  echo  "deb  https://get.docker.io/ubuntu  docker  main"  \     >

     /etc/apt/sources.list.d/docker.list   $  apt-­‐get  update   $  apt-­‐get  install  lxc-­‐docker
  7. $  docker  search  ubuntu   ! $  docker  run  -­‐i

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

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

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

     -­‐t  stackbrew/ubuntu  /bin/bash   Unable  to  find  image  'stackbrew/ubuntu'  locally   Pulling  repository  stackbrew/ubuntu   ...   ! root@21d86a0b8387:/#
  11. 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
  12. 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
  13. 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
  14. 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
  15. 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
  16. $  docker  ps   CONTAINER  ID    ...    PORTS

      923cb190dbc3    ...    0.0.0.0:49155-­‐>80/tcp   ! $  curl  http://localhost:49155   <html>   <head>   <title>Welcome  to  nginx!</title>   ...
  17. 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"]
  18. 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"]
  19. 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"]
  20. 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"]
  21. 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"]
  22. $  docker  run  \     -­‐p  8000:80  \  

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

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

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

      -­‐v  $(pwd):/usr/share/nginx/www  \     m6web/nginx   ! $  echo  'Hello,  world!'  >  index.html   ! $  curl  http://localhost:8000   Hello,  world!
  26. 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"]
  27. 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
  28. 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
  29. 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
  30. 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
  31. 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;                  }   }
  32. docker  run  \     -­‐p  8000:80  \    

    -­‐v  /project:/var/www  \     m6web/symfony2
  33. alias  drun='docker  run  -­‐t  \     -­‐p  8000:80  \

        -­‐v  $(pwd):/var/www  \     m6web/symfony2'
  34. $  cd  /project   $  drun   Loading  composer  repositories

     with  package  information   Installing  dependencies  (including  require-­‐dev)  from  lock  file   ...   ! $  curl  http://localhost:8000
  35. $  docker  run  -­‐name  redis  m6web/redis   $  docker  run

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

     ...  \     -­‐link  redis:redis  \     m6web/symfony2
  37. 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
  38. #!/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
  39. #!/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
  40. #!/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
  41. #!/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
  42. $  docker  run  -­‐name  mysql-­‐data  m6web/data   $  docker  run

     -­‐i  -­‐t  \     -­‐-­‐volumes-­‐from  mysql-­‐data  \     m6web/mysql   ...   mysql>  create  database  'symfony';
  43. #!/bin/bash   ! if  [  !  -­‐f  /var/lib/mysql/ibdata1  ];  then

             mysql_install_db   fi   ! exec  mysqld_safe entrypoint.sh
  44. <?php   ! $container-­‐>setParameter('redis_host',     getenv('REDIS_PORT_6379_TCP_ADDR')   );  

    ! $container-­‐>setParameter('database_host',     getenv('MYSQL_PORT_3306_TCP_ADDR')   ); app/config/parameters.php
  45. $  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
  46. $  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
  47. 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, ... • ...
  48. 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.
  49. 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.