Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Docker x PHP 
How to deploy PHP projects with docker. 
PHPConf 2014
Who am I ? 
• Ruoshi Lin (@fntsrlike)! 
• 深藏若虛! 
• 2.5 Y PHPer ! 
• fntsr.tw 
Photo by
What will I Talk today? 
Application! 
20% 
Use! 
35% 
Story! 
10% 
Concept! 
35%
What story I wanna! 
talk before speech ?
The situation we! 
deploy PHP Projects! 
that we feel HHUURRTT
PHP Version Requirement 
Laravel 
Symfony 
CodeIgniter Phalcon 
Yii 
Wordpress 
Joomla 
MediaWiki 
DokuWiki 
Drupal 6 Drup...
PHP Version Requirement 
Laravel 
Symfony 
There are so many! 
PHP Projects… 
CodeIgniter Phalcon 
Yii 
Wordpress 
Joomla ...
PHP Version Requirement 
Symfony 5.3.3+ 
Laravel 5.4+ 
Yii 5.1+ 
But version ! 
requirement ! 
are different!? 
CodeIgnite...
WHICH PHP ` 
VERSION ! 
SHOULD I INSTALLED ? 
Symfony 5.3.3+ 
Laravel 5.4+ 
Yii 5.1+ 
CodeIgniter 5.1.6+ Phalcon 5.3+! 
Do...
Multifarious Extension
Multifarious Extension 
apxs2, bcmath, bz2, calendar, cgi, cli, 
ctype, dba, debug, dom, embed, exif, 
fileinfo, filter, f...
Multifarious Extension 
apxs2, bcmath, bz2, calendar, cgi, cli, 
ctype, dba, debug, dom, embed, exif, 
fileinfo, filter, f...
One Server Multi Projects 
Server 
App 1 
PHP 
MySQL 
etc… 
App 2 
PHP 
MySQL 
etc… 
App n 
PHP, DB, 
etc… 
……
One Server Multi Projects 
Server 
App 1 
PHP 5.3.2, 
MySQL 5.0.2, 
etc… 
App 2 
PHP 5.4, 
MySQL 5.0.15, 
etc… 
App n 
PHP...
某某專案需要更⾼高的PHP版本,我今天要把 
伺服器的PHP版本升級喲~
某某專案需要更⾼高的PHP版本,我今天要把 
伺服器的PHP版本升級喲~
How To Solve 
Problems?
+ PHPBrew
+ PHPBrew 
@c9s
+ PHPBrew 
Almost enough. 
@c9s
+ PHPBrew 
Almost enough. 
But may we had ! 
encapsulation and portability ? 
@c9s
That's awesome!
That's awesome! 
But may it be more lightweight?
Maybe you can try to use 
DOCKER!
How docker can help us?
How docker can help us? 
Built specify environment for target project.
How docker can help us? 
Built specify environment for target project.! 
Isolate every project space.
How docker can help us? 
Built specify environment for target project.! 
Isolate every project space.! 
Package it and be ...
How docker can help us? 
Built specify environment for target project.! 
Isolate every project space.! 
Package it and be ...
WHAT IS DOCKER ?
This is Dock!
DOCK
DOCK -ER
? 
DOCK -ER
What is it? 
Build, Ship and Run 
Any App, Anywhere 
Docker - An open platform for distributed 
applications for developer...
LXC ! 
Not VM ! 
What is it? 
Encapsulation! 
Portability ! 
Lightweight
LXC 
Linux Container is a userspace interface ! 
for the Linux kernel containment features.
LXC 
Linux Container is a userspace interface ! 
for the Linux kernel containment features. 
What?
LXC 
! 
Kernel 
namespaces! 
PID, mount, 
user, network, 
UTS, IPC!
LXC 
! 
Kernel 
namespaces! 
Cgroups 
PID, mount, 
user, network, 
UTS, IPC! 
cpu, memory, 
disk I/O!
LXC 
! 
Kernel 
namespaces! 
Cgroups Chroot 
PID, mount, 
user, network, 
UTS, IPC! 
cpu, memory, 
disk I/O! 
File system!
What different between 
VM and Docker
Virtual Machine 
App' 
/usr/bin, /usr/lib, … 
Hypervisor 
Host OS 
Server 
App 
/usr/bin, /usr/lib, … 
Guest OS 
App 2 
/u...
Virtual Machine 
VM1 VM2 VM3 
App' 
/usr/bin, /usr/lib, … 
Hypervisor 
Host OS 
Server 
App 
/usr/bin, /usr/lib, … 
Guest ...
Virtual Machine 
VM1 VM2 VM3 
PHP App' 
PHP 5.3 
Hypervisor 
Host OS 
Server 
PHP App 
PHP 5.2 
Guest OS 
PHP App2 
PHP 5....
Docker 
PHP ! 
App3 
/bin, /lib 
Host OS 
Server 
Docker 
PHP ! 
App4 
/bin, /lib 
PHP ! 
App 
PHP ! 
App` 
/bin, /lib
Docker 
PHP ! 
App3 
/bin, /lib 
Host OS 
Server 
Docker 
Docker container 
PHP ! 
App4 
/bin, /lib 
PHP ! 
App 
PHP ! 
Ap...
Docker 
PHP ! 
App3 
PHP 5.3 
Host OS 
Server 
Docker 
Docker container 
PHP ! 
App4 
PHP 5.4 
PHP ! 
App 
PHP ! 
App` 
PH...
Docker 
PHP ! 
App3 
PHP 5.3 
Host OS 
Server 
Docker 
Docker container 
PHP ! 
App4 
PHP 5.4 
Shared FS with AUFS 
PHP ! ...
Docker Container 
Container 
Image (apache) 
Base image (Ubuntu) 
Container Container 
Docker 
Image (nginx) 
LXC AUFS 
Ke...
Docker Container 
Container 
Image (apache) 
Parent ! Container Container 
Reference 
Base image (Ubuntu) 
Docker 
Image (...
We knew LXC,! 
but what is AUFS?
AUFS 
• Layered FS! 
• Share commonFS! 
• RO & RW! 
• Used to share between container
AUFS 
• Layered FS! 
• Share commonFS! 
• RO & RW! 
• Used to share between container 
Can't understand? Let's see the Pic...
AUFS 
Add Files C 
Add Files B 
Add Files A 
Delete Files B 
Add Files E 
Add Files D
AUFS 
Add Files C 
Add Files B 
Add Files A 
Delete Files B 
Add Files E 
Add Files D 
Layered FS
AUFS 
Add Files C 
Add Files B 
Add Files A 
Delete Files B 
Add Files E 
Add Files D 
Share commonFS
AUFS 
Image 
Image 
Base image 
Container 
Container 
Container
AUFS 
Image 
Image 
Base image 
Container 
Container 
Container 
ReadOnly 
ReadWrite
AUFS 
Used to share between container 
Image 
Image 
Base image 
Container 
Container 
Container
Images 
ReadOnly Layer! 
Don't change. ! 
Environments! 
Used to be container
Containers 
ReadWrite Layer! 
Running Process! 
Built with one or more images! 
Commit change to create image
Docker Container 
Container 
Image (apache) 
Base image (Ubuntu) 
Container Container 
Docker 
Image (nginx) 
LXC AUFS 
Ke...
Docker Container 
Container 
Image (apache) 
Base image (Ubuntu) 
Container Container 
Docker 
Image (nginx) 
LXC AUFS 
Ke...
Docker Container 
Container 
Image (apache) 
Base image (Ubuntu) 
Container Container 
Docker 
Image (nginx) 
LXC AUFS 
Ke...
Relationship between 
image and container 
ImageImage! 
! 
(registry) 
(registry)
Relationship between 
image and container 
Image! 
(local) 
PULL 
Image! 
(registry)
Relationship between 
image and container 
Image! 
(registry) 
RUN 
Container 
Image! 
(local) 
PULL
Relationship between 
image and container 
Image! 
(registry) 
RUN 
Container 
Container' 
Image! 
(local) 
CHANGE 
PULL
Relationship between 
image and container 
Image! 
(registry) 
RUN 
Container 
Container' 
CHANGE 
COMMIT 
Image! 
(local)...
Relationship between 
image and container 
Image! 
(registry) 
RUN 
Container 
Container' 
CHANGE 
COMMIT 
Image! 
(local)...
Relationship between 
image and container 
Image! 
(registry) 
RUN 
Container 
Container' 
CHANGE 
COMMIT 
Image! 
(local)...
How to use docker ?
Requirements 
Linux kernel 3.8+! 
LXC! 
AUFS
Installation 
• Linux by package manager! 
• OS X, Windows by boot2docker! 
• Version 1.20
Installation 
• Linux by package manager! 
• OS X, Windows by boot2docker! 
• Version 1.20 
1.3.0 released! 
2014/10/16 
S...
Basic Command
Version 
$ docker version
Version 
$ docker version 
Client version: 1.3.0 
Client API version: 1.15 
Go version (client): go1.3.3 
Git commit (clie...
Info 
$ docker info
Info 
$ docker info 
Containers: 4 
Images: 71 
Storage Driver: aufs 
Root Dir: /var/lib/docker/aufs 
Dirs: 79 
Execution ...
Pull base image(s) 
$ docker pull ubuntu
Pull base image(s) 
$ docker pull ubuntu 
image name
Pull base image(s) 
$ docker pull ubuntu 
Pulling repository ubuntu 
463ff6be4238: Download complete 
9cbaf023786c: Downlo...
List images 
$ docker images
List images 
$ docker images 
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE 
ubuntu 14.10 2185fd50e2ca 28 hours ago 237.2 M...
Run and List container 
$ docker run ubuntu:trusty /bin/echo "hello, world" 
hello, world
Run and List container 
$ docker run ubuntu:trusty /bin/echo "hello, world" 
hello, world 
image name
Run and List container 
$ docker run ubuntu:trusty /bin/echo "hello, world" 
hello, world 
image name execute
Run and List container 
$ docker run ubuntu:trusty /bin/echo "hello, world" 
hello, world 
image name execute argument
Run and List container 
$ docker run ubuntu:trusty /bin/echo "hello, world" 
hello, world 
image name execute argument 
$ ...
Run and List container 
$ docker run ubuntu:trusty /bin/echo "hello, world" 
hello, world 
image name execute argument 
$ ...
Run and list running container 
docker run ubuntu:latest /bin/sh -c  
"while true; do echo hello, world; sleep 1; done;" 
...
Run and list running container 
docker run ubuntu:latest /bin/sh -c  
"while true; do echo hello, world; sleep 1; done;" 
...
Run running container in deamon 
docker run -d ubuntu:latest /bin/sh -c  
"while true; do echo hello, world; sleep 1; done...
Run running container in deamon 
docker run -d ubuntu:latest /bin/sh -c  
"while true; do echo hello, world; sleep 1; done...
Run running container in deamon 
docker run -d ubuntu:latest /bin/sh -c  
"while true; do echo hello, world; sleep 1; done...
Logs and Attach Container 
$ docker logs 90f0ca 
hello, world 
hello, world 
…… 
$ docker attach 90f0ca 
hello, world 
hel...
Logs and Attach Container 
$ docker logs 90f0ca 
hello, world 
hello, world 
…… 
$ docker attach 90f0ca 
hello, world 
hel...
Logs and Attach Container 
$ docker logs 90f0ca 
hello, world 
hello, world 
…… 
$ docker attach 90f0ca 
hello, world 
hel...
Logs and Attach Container 
$ docker logs 90f0ca 
hello, world 
hello, world 
…… 
$ docker attach 90f0ca 
hello, world 
hel...
Commit 
$ docker run -i -t php:5.6.1-apache /bin/bash! 
root@4441f36ebab1:/# 
You do some change …… 
Sets STDIN and open a...
Commit 
$ docker run -i -t php:5.6.1-apache /bin/bash! 
You do some change …… 
$ docker ps -a! 
CONTAINER ID IMAGE COMMAND...
Commit 
$ docker run -i -t php:5.6.1-apache /bin/bash! 
You do some change …… 
$ docker ps -a! 
CONTAINER ID IMAGE COMMAND...
Commit 
$ docker run -i -t php:5.6.1-apache /bin/bash! 
You do some change …… 
$ docker ps -a! 
CONTAINER ID IMAGE COMMAND...
Commit 
$ docker run -i -t php:5.6.1-apache /bin/bash! 
You do some change …… 
$ docker ps -a! 
CONTAINER ID IMAGE COMMAND...
Expose Port 
docker run -d -p 80 nginx 
c63fda2248d0dcf90a90cc817d1acb6c9546db841128ca7558ff1f496ad4f8fb 
$ docker ps -a! ...
Expose Port 
-p <guest_port>! 
docker run -d -p 80 nginx 
c63fda2248d0dcf90a90cc817d1acb6c9546db841128ca7558ff1f496ad4f8fb...
Expose Port 
-p <guest_port>! 
docker run -d -p 80 nginx 
c63fda2248d0dcf90a90cc817d1acb6c9546db841128ca7558ff1f496ad4f8fb...
Expose Port 
docker run -d -p 10080:80 nginx 
afd45d0f7d34baf90dbef109ae167c99a49432080adc8621e8cd7e18a4004658 
$ docker p...
Expose Port 
-p <host_port>:<guest_port> 
docker run -d -p 10080:80 nginx 
afd45d0f7d34baf90dbef109ae167c99a49432080adc862...
Expose Port 
-p <host_port>:<guest_port> 
docker run -d -p 10080:80 nginx 
afd45d0f7d34baf90dbef109ae167c99a49432080adc862...
Expose Port 
docker run -d -p 127.0.0.1:10080:80 nginx 
76d00613ccb3576ef604c61f4d086aa6f090ed7268c42638f1931e235c0fe526 
...
Expose Port 
-p <hostname>:<host_port>:<guest_port> 
docker run -d -p 127.0.0.1:10080:80 nginx 
76d00613ccb3576ef604c61f4d...
Expose Port 
Expose to host with hostname 
-p <hostname>:<host_port>:<guest_port> 
docker run -d -p 127.0.0.1:10080:80 ngi...
Expose Port 
docker run -d -P nginx 
2123f55d26fc3d5824492ed8ad4d7f9e28ed5d749e7d401e21a1bb0002f65048 
$ docker ps -a! 
CO...
Expose Port 
-P 
docker run -d -P nginx 
2123f55d26fc3d5824492ed8ad4d7f9e28ed5d749e7d401e21a1bb0002f65048 
$ docker ps -a!...
Expose Port 
-P 
Expose all port of container ! 
with host random port 
docker run -d -P nginx 
2123f55d26fc3d5824492ed8ad...
How could I back to running 
container and do another thing? 
• attach!
How could I back to running 
container and do another thing? 
• attach! It can only run one process.
How could I back to running 
container and do another thing? 
• attach! 
• exec 
It can only run one process.
How could I back to running 
container and do another thing? 
• attach! 
• exec 
It can only run one process. 
It's added ...
Alias 
$ docker run nginx --name my-nginx -d nginx 
4441f36ebab1975004782ea6d03198fd8ced8472cf34721f9906cbebfe61872d"
Alias 
$ docker run nginx --name my-nginx -d nginx 
4441f36ebab1975004782ea6d03198fd8ced8472cf34721f9906cbebfe61872d" 
$ d...
$ docker run nginx --name my-nginx -d nginx 
4441f36ebab1975004782ea6d03198fd8ced8472cf34721f9906cbebfe61872d" 
$ docker e...
Linking 
We don't have enough time… 
Let's see picture again! XD
Linking 
PHP+Nginx! 
Container 
Host 
MySQL! 
Container 
Port 
Port
Linking 
PHP+Nginx! 
Container 
Host 
MySQL! 
Container 
Port 
Port 
Let's try to hack!
Linking 
PHP+Nginx! 
Container 
Host 
MySQL! 
Container 
Port 
Port 
斷開鎖鏈!
Linking 
PHP+Nginx! 
Container 
Host 
MySQL! 
Container 
Port 
Link 
Port 
移情別戀!(不對
Linking 
PHP+Nginx! 
Container 
Host 
MySQL! 
Container 
Port 
Link 
Oops! 
More Secure
Volume 
Picture, BJ4
Host 
volume directory 
/var/www/html 
…… 
…… 
Container
Host 
volume directory 
/var/www/html 
…… 
…… 
Container 
Isolation
Host 
volume directory 
/var/www/html 
…… 
…… 
Container 
How could we mount 
container's directory to host?
Host 
volume directory 
/var/www/html 
…… 
…… 
Volume Container
Host 
volume directory 
/var/www/html 
…… 
…… 
Volume Container 
• Real time changes
Host 
volume directory 
/var/www/html 
…… 
…… 
Volume Container 
• Real time changes! 
• Exist until container destroyed!
Host 
volume directory 
/var/www/html 
…… 
…… 
Volume Container 
• Real time changes! 
• Exist until container destroyed! ...
Share Volume between containers 
Host 
volume directory 
/var/www/html 
…… 
…… 
Container A 
/var/www/html 
…… 
Container ...
Share Volume between containers 
Host 
volume directory 
/var/www/html 
…… 
…… 
Container A Volume 
/var/www/html 
…… 
Con...
Share Volume between containers 
Host 
volume directory 
/var/www/html 
…… 
…… 
Container A Volume 
/var/www/html 
…… 
Con...
Registry & Dockerfile
index.docker.io
registry = docker's github.
Official PHP Repo
Tutorial for using image
Dockerfile of image
Dockerfile 
• Automatically built images and deploy! 
• Automated Builds on Docker Hub! 
• Easy to share and customize con...
We don't have time to talk how to write…but official 
document is completed.
Which patterns can 
we use?
Single app container 
Volume 
PHP App 
/var/www/html PHP 5.6 
…… Nginx 
MySQL 
…… 
Port
Single app container 
Volume 
PHP App 
/var/www/html PHP 5.6 
…… Nginx 
MySQL 
…… 
Port 
Not recommend use for production
Container Groups 
Volume /var/www/html 
PHP App 
…… Nginx 
/var/lib/mysql/ 
…… 
PHP 5.6 
MySQL 
…… 
App Container 
DB Cont...
Separate containers 
FS nginx container 
FS 
php container 
…… PHP-apache 
FS MySQL container 
…… MySQL 
Volume 
PHP App 
...
Data Only Container 
Volume /data 
8421917fbed8aa018ad3…. 
…… 
/data 
…… 
…… 
DB-data Container 
volume from 
DB Container...
How could I use docker 
to solve problem?
Multi PHP Projects 
HOST 
Nginx 
PHP project A 
/var/www/html 
…… 
PHP:5.6-apache ! 
Container 
PHP project B 
/var/www/ht...
Multi PHP Projects 
HOST 
Nginx 
PHP project A 
/var/www/html 
…… 
PHP:5.6-apache ! 
Container 
PHP project B 
/var/www/ht...
Multi PHP Projects 
HOST 
Nginx 
PHP project A 
/var/www/html 
…… 
PHP:5.6-apache ! 
Container 
/data 
…… 
DB Container 
P...
Multi PHP Projects 
HOST 
Nginx 
PHP project A 
/var/www/html 
…… 
PHP:5.6-apache ! 
Container 
/data 
…… 
DB Container 
P...
Thank you. 
Thanks my girlfriend especially.
Resource & Reference 
• Docker Documentation! 
• Digital Ocean! 
• boot2docker! 
• Ship it with Docker! by Xabier Larrakoe...
Q & A
How to deploy PHP projects with docker
How to deploy PHP projects with docker
How to deploy PHP projects with docker
How to deploy PHP projects with docker
How to deploy PHP projects with docker
How to deploy PHP projects with docker
How to deploy PHP projects with docker
How to deploy PHP projects with docker
Upcoming SlideShare
Loading in …5
×

How to deploy PHP projects with docker

45,870 views

Published on

PHPConf 2014
http://phpconf.tw/2014/

Published in: Technology

How to deploy PHP projects with docker

  1. 1. Docker x PHP How to deploy PHP projects with docker. PHPConf 2014
  2. 2. Who am I ? • Ruoshi Lin (@fntsrlike)! • 深藏若虛! • 2.5 Y PHPer ! • fntsr.tw Photo by
  3. 3. What will I Talk today? Application! 20% Use! 35% Story! 10% Concept! 35%
  4. 4. What story I wanna! talk before speech ?
  5. 5. The situation we! deploy PHP Projects! that we feel HHUURRTT
  6. 6. PHP Version Requirement Laravel Symfony CodeIgniter Phalcon Yii Wordpress Joomla MediaWiki DokuWiki Drupal 6 Drupal 7 Drupal 8
  7. 7. PHP Version Requirement Laravel Symfony There are so many! PHP Projects… CodeIgniter Phalcon Yii Wordpress Joomla MediaWiki DokuWiki Drupal 6 Drupal 7 Drupal 8
  8. 8. PHP Version Requirement Symfony 5.3.3+ Laravel 5.4+ Yii 5.1+ But version ! requirement ! are different!? CodeIgniter 5.1.6+ Phalcon 5.3+! DokuWiki 5.2 Wordpress 5.2.4+ Joomla! 5.4+ MediaWiki 5.3.2+ Drupal-7 Drupal-6 5.2.x 5.2.5+ Drupal-8 5.4+
  9. 9. WHICH PHP ` VERSION ! SHOULD I INSTALLED ? Symfony 5.3.3+ Laravel 5.4+ Yii 5.1+ CodeIgniter 5.1.6+ Phalcon 5.3+! DokuWiki 5.2 Wordpress 5.2.4+ Joomla! 5.4+ MediaWiki 5.3.2+ Drupal-7 Drupal-6 5.2.x 5.2.5+ Drupal-8 5.4+
  10. 10. Multifarious Extension
  11. 11. Multifarious Extension apxs2, bcmath, bz2, calendar, cgi, cli, ctype, dba, debug, dom, embed, exif, fileinfo, filter, fpm, ftp, gcov, gd, gettext, hash, iconv, icu, imap, intl, ipc, ipv6, json, kerberos, mbregex, mbstring, mcrypt, mhash, mysql, openssl, pcntl, pcre, pdo, pgsql, phar, posix, readline, session, soap, sockets, sqlite, tidy, tokenizer, xml_all, xmlrpc, zip, zlib
  12. 12. Multifarious Extension apxs2, bcmath, bz2, calendar, cgi, cli, ctype, dba, debug, dom, embed, exif, fileinfo, filter, fpm, ftp, gcov, gd, gettext, hash, iconv, icu, imap, intl, ipc, ipv6, PECL? ! Recompiled? json, kerberos, mbregex, mbstring, mcrypt, mhash, mysql, openssl, pcntl, pcre, pdo, pgsql, phar, posix, readline, session, soap, sockets, sqlite, tidy, tokenizer, xml_all, xmlrpc, zip, zlib
  13. 13. One Server Multi Projects Server App 1 PHP MySQL etc… App 2 PHP MySQL etc… App n PHP, DB, etc… ……
  14. 14. One Server Multi Projects Server App 1 PHP 5.3.2, MySQL 5.0.2, etc… App 2 PHP 5.4, MySQL 5.0.15, etc… App n PHP 5.4, MariaDB, etc… …… BUT DIFFERENT REQUIRMENT
  15. 15. 某某專案需要更⾼高的PHP版本,我今天要把 伺服器的PHP版本升級喲~
  16. 16. 某某專案需要更⾼高的PHP版本,我今天要把 伺服器的PHP版本升級喲~
  17. 17. How To Solve Problems?
  18. 18. + PHPBrew
  19. 19. + PHPBrew @c9s
  20. 20. + PHPBrew Almost enough. @c9s
  21. 21. + PHPBrew Almost enough. But may we had ! encapsulation and portability ? @c9s
  22. 22. That's awesome!
  23. 23. That's awesome! But may it be more lightweight?
  24. 24. Maybe you can try to use DOCKER!
  25. 25. How docker can help us?
  26. 26. How docker can help us? Built specify environment for target project.
  27. 27. How docker can help us? Built specify environment for target project.! Isolate every project space.
  28. 28. How docker can help us? Built specify environment for target project.! Isolate every project space.! Package it and be portable.
  29. 29. How docker can help us? Built specify environment for target project.! Isolate every project space.! Package it and be portable.! Deploy lightweight and fast.
  30. 30. WHAT IS DOCKER ?
  31. 31. This is Dock!
  32. 32. DOCK
  33. 33. DOCK -ER
  34. 34. ? DOCK -ER
  35. 35. What is it? Build, Ship and Run Any App, Anywhere Docker - An open platform for distributed applications for developers and sysadmins. -docker.io
  36. 36. LXC ! Not VM ! What is it? Encapsulation! Portability ! Lightweight
  37. 37. LXC Linux Container is a userspace interface ! for the Linux kernel containment features.
  38. 38. LXC Linux Container is a userspace interface ! for the Linux kernel containment features. What?
  39. 39. LXC ! Kernel namespaces! PID, mount, user, network, UTS, IPC!
  40. 40. LXC ! Kernel namespaces! Cgroups PID, mount, user, network, UTS, IPC! cpu, memory, disk I/O!
  41. 41. LXC ! Kernel namespaces! Cgroups Chroot PID, mount, user, network, UTS, IPC! cpu, memory, disk I/O! File system!
  42. 42. What different between VM and Docker
  43. 43. Virtual Machine App' /usr/bin, /usr/lib, … Hypervisor Host OS Server App /usr/bin, /usr/lib, … Guest OS App 2 /usr/bin, /usr/lib, … Guest OS Guest OS
  44. 44. Virtual Machine VM1 VM2 VM3 App' /usr/bin, /usr/lib, … Hypervisor Host OS Server App /usr/bin, /usr/lib, … Guest OS App 2 /usr/bin, /usr/lib, … Guest OS Guest OS
  45. 45. Virtual Machine VM1 VM2 VM3 PHP App' PHP 5.3 Hypervisor Host OS Server PHP App PHP 5.2 Guest OS PHP App2 PHP 5.4 Guest OS Guest OS
  46. 46. Docker PHP ! App3 /bin, /lib Host OS Server Docker PHP ! App4 /bin, /lib PHP ! App PHP ! App` /bin, /lib
  47. 47. Docker PHP ! App3 /bin, /lib Host OS Server Docker Docker container PHP ! App4 /bin, /lib PHP ! App PHP ! App` /bin, /lib
  48. 48. Docker PHP ! App3 PHP 5.3 Host OS Server Docker Docker container PHP ! App4 PHP 5.4 PHP ! App PHP ! App` PHP 5.2
  49. 49. Docker PHP ! App3 PHP 5.3 Host OS Server Docker Docker container PHP ! App4 PHP 5.4 Shared FS with AUFS PHP ! App PHP ! App` PHP 5.2
  50. 50. Docker Container Container Image (apache) Base image (Ubuntu) Container Container Docker Image (nginx) LXC AUFS Kernel Image (php) Base image (CentOS)
  51. 51. Docker Container Container Image (apache) Parent ! Container Container Reference Base image (Ubuntu) Docker Image (nginx) LXC AUFS Kernel Image (php) Base image (CentOS)
  52. 52. We knew LXC,! but what is AUFS?
  53. 53. AUFS • Layered FS! • Share commonFS! • RO & RW! • Used to share between container
  54. 54. AUFS • Layered FS! • Share commonFS! • RO & RW! • Used to share between container Can't understand? Let's see the Picture!
  55. 55. AUFS Add Files C Add Files B Add Files A Delete Files B Add Files E Add Files D
  56. 56. AUFS Add Files C Add Files B Add Files A Delete Files B Add Files E Add Files D Layered FS
  57. 57. AUFS Add Files C Add Files B Add Files A Delete Files B Add Files E Add Files D Share commonFS
  58. 58. AUFS Image Image Base image Container Container Container
  59. 59. AUFS Image Image Base image Container Container Container ReadOnly ReadWrite
  60. 60. AUFS Used to share between container Image Image Base image Container Container Container
  61. 61. Images ReadOnly Layer! Don't change. ! Environments! Used to be container
  62. 62. Containers ReadWrite Layer! Running Process! Built with one or more images! Commit change to create image
  63. 63. Docker Container Container Image (apache) Base image (Ubuntu) Container Container Docker Image (nginx) LXC AUFS Kernel Image (php) Base image (CentOS)
  64. 64. Docker Container Container Image (apache) Base image (Ubuntu) Container Container Docker Image (nginx) LXC AUFS Kernel Image (php) Base image (CentOS) Read! Only
  65. 65. Docker Container Container Image (apache) Base image (Ubuntu) Container Container Docker Image (nginx) LXC AUFS Kernel Image (php) Base image (CentOS) Read! Only Writable
  66. 66. Relationship between image and container ImageImage! ! (registry) (registry)
  67. 67. Relationship between image and container Image! (local) PULL Image! (registry)
  68. 68. Relationship between image and container Image! (registry) RUN Container Image! (local) PULL
  69. 69. Relationship between image and container Image! (registry) RUN Container Container' Image! (local) CHANGE PULL
  70. 70. Relationship between image and container Image! (registry) RUN Container Container' CHANGE COMMIT Image! (local) PULL
  71. 71. Relationship between image and container Image! (registry) RUN Container Container' CHANGE COMMIT Image! (local) PULL PUSH Image! (registry)
  72. 72. Relationship between image and container Image! (registry) RUN Container Container' CHANGE COMMIT Image! (local) PULL PUSH
  73. 73. How to use docker ?
  74. 74. Requirements Linux kernel 3.8+! LXC! AUFS
  75. 75. Installation • Linux by package manager! • OS X, Windows by boot2docker! • Version 1.20
  76. 76. Installation • Linux by package manager! • OS X, Windows by boot2docker! • Version 1.20 1.3.0 released! 2014/10/16 Same day as my birthday >///<
  77. 77. Basic Command
  78. 78. Version $ docker version
  79. 79. Version $ docker version Client version: 1.3.0 Client API version: 1.15 Go version (client): go1.3.3 Git commit (client): c78088f OS/Arch (client): linux/amd64 Server version: 1.3.0 Server API version: 1.15 Go version (server): go1.3.3 Git commit (server): c78088f
  80. 80. Info $ docker info
  81. 81. Info $ docker info Containers: 4 Images: 71 Storage Driver: aufs Root Dir: /var/lib/docker/aufs Dirs: 79 Execution Driver: native-0.2 Kernel Version: 3.13.0-36-generic Operating System: Ubuntu 14.04.1 LTS
  82. 82. Pull base image(s) $ docker pull ubuntu
  83. 83. Pull base image(s) $ docker pull ubuntu image name
  84. 84. Pull base image(s) $ docker pull ubuntu Pulling repository ubuntu 463ff6be4238: Download complete 9cbaf023786c: Download complete 2185fd50e2ca: Download complete a9561eb1b190: Download complete 3db9c44f4520: Download complete 195eb90b5349: Download complete c5881f11ded9: Download complete 511136ea3c5a: Download complete 500cae81e00f: Download complete 3ed75c4904e0: Download complete b8c495ea8a4e: Download complete 0f154c52e965: Download complete f180ea115597: Download complete bac448df371d: Download complete ……
  85. 85. List images $ docker images
  86. 86. List images $ docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE ubuntu 14.10 2185fd50e2ca 28 hours ago 237.2 MB ubuntu utopic 2185fd50e2ca 28 hours ago 237.2 MB ubuntu 14.04.1 9cbaf023786c 28 hours ago 192.8 MB ubuntu 14.04 9cbaf023786c 28 hours ago 192.8 MB ubuntu trusty 9cbaf023786c 28 hours ago 192.8 MB ubuntu latest 9cbaf023786c 28 hours ago 192.8 MB ubuntu precise a9561eb1b190 28 hours ago 120.2 MB ubuntu 12.04.5 a9561eb1b190 28 hours ago 120.2 MB ubuntu 12.04 a9561eb1b190 28 hours ago 120.2 MB ubuntu 12.10 c5881f11ded9 3 months ago 172.2 MB ubuntu quantal c5881f11ded9 3 months ago 172.2 MB ubuntu 13.04 463ff6be4238 3 months ago 169.4 MB ubuntu raring 463ff6be4238 3 months ago 169.4 MB ubuntu 13.10 195eb90b5349 3 months ago 184.7 MB ubuntu saucy 195eb90b5349 3 months ago 184.7 MB ……
  87. 87. Run and List container $ docker run ubuntu:trusty /bin/echo "hello, world" hello, world
  88. 88. Run and List container $ docker run ubuntu:trusty /bin/echo "hello, world" hello, world image name
  89. 89. Run and List container $ docker run ubuntu:trusty /bin/echo "hello, world" hello, world image name execute
  90. 90. Run and List container $ docker run ubuntu:trusty /bin/echo "hello, world" hello, world image name execute argument
  91. 91. Run and List container $ docker run ubuntu:trusty /bin/echo "hello, world" hello, world image name execute argument $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 73ec6de5630b ubuntu:14.04 "/bin/echo 'hello, w 2 hours ago Exited (0) sad_engelbart
  92. 92. Run and List container $ docker run ubuntu:trusty /bin/echo "hello, world" hello, world image name execute argument $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 73ec6de5630b ubuntu:14.04 "/bin/echo 'hello, w 2 hours ago Exited (0) sad_engelbart The container is finished, so we use -a
  93. 93. Run and list running container docker run ubuntu:latest /bin/sh -c "while true; do echo hello, world; sleep 1; done;" hello, world hello, world …… $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 8e46bc2bd17d ubuntu:14.04 "/bin/sh -c 2 hours ago Up 5 seconds lonely_brow
  94. 94. Run and list running container docker run ubuntu:latest /bin/sh -c "while true; do echo hello, world; sleep 1; done;" hello, world hello, world …… The container is running until we stop it $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 8e46bc2bd17d ubuntu:14.04 "/bin/sh -c 2 hours ago Up 5 seconds lonely_brow
  95. 95. Run running container in deamon docker run -d ubuntu:latest /bin/sh -c "while true; do echo hello, world; sleep 1; done;" 90f0ca0a13014ef82f33a2fbef646d8c2cd2b1b260b0d6e71fc46e553560babb $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 90f0ca0a1301 ubuntu:14.04 "/bin/sh -c 2 hours ago Up 5 seconds lonely_brow
  96. 96. Run running container in deamon docker run -d ubuntu:latest /bin/sh -c "while true; do echo hello, world; sleep 1; done;" 90f0ca0a13014ef82f33a2fbef646d8c2cd2b1b260b0d6e71fc46e553560babb $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 90f0ca0a1301 ubuntu:14.04 "/bin/sh -c 2 hours ago Up 5 seconds lonely_brow
  97. 97. Run running container in deamon docker run -d ubuntu:latest /bin/sh -c "while true; do echo hello, world; sleep 1; done;" 90f0ca0a13014ef82f33a2fbef646d8c2cd2b1b260b0d6e71fc46e553560babb We use container id to manage it $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 90f0ca0a1301 ubuntu:14.04 "/bin/sh -c 2 hours ago Up 5 seconds lonely_brow
  98. 98. Logs and Attach Container $ docker logs 90f0ca hello, world hello, world …… $ docker attach 90f0ca hello, world hello, world ……
  99. 99. Logs and Attach Container $ docker logs 90f0ca hello, world hello, world …… $ docker attach 90f0ca hello, world hello, world …… Get logs
  100. 100. Logs and Attach Container $ docker logs 90f0ca hello, world hello, world …… $ docker attach 90f0ca hello, world hello, world …… Get logs Back to container console
  101. 101. Logs and Attach Container $ docker logs 90f0ca hello, world hello, world …… $ docker attach 90f0ca hello, world hello, world …… Get logs Back to container console 「CTRL-p CTRL-q」 to detach.!
  102. 102. Commit $ docker run -i -t php:5.6.1-apache /bin/bash! root@4441f36ebab1:/# You do some change …… Sets STDIN and open a PTY
  103. 103. Commit $ docker run -i -t php:5.6.1-apache /bin/bash! You do some change …… $ docker ps -a! CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6a495e871389 php:5-apache "/bin/bash" 24 minutes ago Exited (0) cranky_morse
  104. 104. Commit $ docker run -i -t php:5.6.1-apache /bin/bash! You do some change …… $ docker ps -a! CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6a495e871389 php:5-apache "/bin/bash" 24 minutes ago Exited (0) cranky_morse $ docker commit 6a495e871389 fntsr/first-image! 2006ba62eb6508560ae38782ee514a4212d29ea4e4a2e7495b1eedf155fe13df
  105. 105. Commit $ docker run -i -t php:5.6.1-apache /bin/bash! You do some change …… $ docker ps -a! CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6a495e871389 php:5-apache "/bin/bash" 24 minutes ago Exited (0) cranky_morse $ docker commit 6a495e871389 fntsr/first-image! 2006ba62eb6508560ae38782ee514a4212d29ea4e4a2e7495b1eedf155fe13df <username>/<image_name>
  106. 106. Commit $ docker run -i -t php:5.6.1-apache /bin/bash! You do some change …… $ docker ps -a! CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6a495e871389 php:5-apache "/bin/bash" 24 minutes ago Exited (0) cranky_morse $ docker commit 6a495e871389 fntsr/first-image! 2006ba62eb6508560ae38782ee514a4212d29ea4e4a2e7495b1eedf155fe13df $ docker images! REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE fntsr/first-image latest 2006ba62eb65 22 minutes ago 803.6 MB
  107. 107. Expose Port docker run -d -p 80 nginx c63fda2248d0dcf90a90cc817d1acb6c9546db841128ca7558ff1f496ad4f8fb $ docker ps -a! CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS c63fda2248d0 nginx:1 "nginx… 6 seconds ago Up 5 seconds 443/tcp, 0.0.0.0:49153->80/tcp
  108. 108. Expose Port -p <guest_port>! docker run -d -p 80 nginx c63fda2248d0dcf90a90cc817d1acb6c9546db841128ca7558ff1f496ad4f8fb $ docker ps -a! CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS c63fda2248d0 nginx:1 "nginx… 6 seconds ago Up 5 seconds 443/tcp, 0.0.0.0:49153->80/tcp
  109. 109. Expose Port -p <guest_port>! docker run -d -p 80 nginx c63fda2248d0dcf90a90cc817d1acb6c9546db841128ca7558ff1f496ad4f8fb $ docker ps -a! CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS c63fda2248d0 nginx:1 "nginx… 6 seconds ago Up 5 seconds 443/tcp, 0.0.0.0:49153->80/tcp Expose 80 to 49153 (random) Expose to random port
  110. 110. Expose Port docker run -d -p 10080:80 nginx afd45d0f7d34baf90dbef109ae167c99a49432080adc8621e8cd7e18a4004658 $ docker ps -a! CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS afd45d0f7d34 nginx:1 "nginx… 6 seconds ago Up 5 seconds 443/tcp, 0.0.0.0:10080->80/tcp
  111. 111. Expose Port -p <host_port>:<guest_port> docker run -d -p 10080:80 nginx afd45d0f7d34baf90dbef109ae167c99a49432080adc8621e8cd7e18a4004658 $ docker ps -a! CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS afd45d0f7d34 nginx:1 "nginx… 6 seconds ago Up 5 seconds 443/tcp, 0.0.0.0:10080->80/tcp
  112. 112. Expose Port -p <host_port>:<guest_port> docker run -d -p 10080:80 nginx afd45d0f7d34baf90dbef109ae167c99a49432080adc8621e8cd7e18a4004658 $ docker ps -a! CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS afd45d0f7d34 nginx:1 "nginx… 6 seconds ago Up 5 seconds 443/tcp, 0.0.0.0:10080->80/tcp Expose 80 to 10080 (assigned) Expose to assigned port
  113. 113. Expose Port docker run -d -p 127.0.0.1:10080:80 nginx 76d00613ccb3576ef604c61f4d086aa6f090ed7268c42638f1931e235c0fe526 $ docker ps -a! CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS 76d00613ccb3 nginx:1 "nginx… 6 seconds ago Up 5 seconds 443/tcp, 127.0.0.1:10080->80/tcp
  114. 114. Expose Port -p <hostname>:<host_port>:<guest_port> docker run -d -p 127.0.0.1:10080:80 nginx 76d00613ccb3576ef604c61f4d086aa6f090ed7268c42638f1931e235c0fe526 $ docker ps -a! CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS 76d00613ccb3 nginx:1 "nginx… 6 seconds ago Up 5 seconds 443/tcp, 127.0.0.1:10080->80/tcp
  115. 115. Expose Port Expose to host with hostname -p <hostname>:<host_port>:<guest_port> docker run -d -p 127.0.0.1:10080:80 nginx 76d00613ccb3576ef604c61f4d086aa6f090ed7268c42638f1931e235c0fe526 $ docker ps -a! CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS 76d00613ccb3 nginx:1 "nginx… 6 seconds ago Up 5 seconds 443/tcp, 127.0.0.1:10080->80/tcp Expose with host name
  116. 116. Expose Port docker run -d -P nginx 2123f55d26fc3d5824492ed8ad4d7f9e28ed5d749e7d401e21a1bb0002f65048 $ docker ps -a! CONTAINER ID IMAGE COMMAND CREATED PORTS afd45d0f7d34 nginx:1 "nginx… Up 5 seconds 0.0.0.0:49154->443/tcp, 0.0.0.0:49155->80/tcp
  117. 117. Expose Port -P docker run -d -P nginx 2123f55d26fc3d5824492ed8ad4d7f9e28ed5d749e7d401e21a1bb0002f65048 $ docker ps -a! CONTAINER ID IMAGE COMMAND CREATED PORTS afd45d0f7d34 nginx:1 "nginx… Up 5 seconds 0.0.0.0:49154->443/tcp, 0.0.0.0:49155->80/tcp
  118. 118. Expose Port -P Expose all port of container ! with host random port docker run -d -P nginx 2123f55d26fc3d5824492ed8ad4d7f9e28ed5d749e7d401e21a1bb0002f65048 $ docker ps -a! CONTAINER ID IMAGE COMMAND CREATED PORTS afd45d0f7d34 nginx:1 "nginx… Up 5 seconds 0.0.0.0:49154->443/tcp, 0.0.0.0:49155->80/tcp 443 expose to 49154 (random)
  119. 119. How could I back to running container and do another thing? • attach!
  120. 120. How could I back to running container and do another thing? • attach! It can only run one process.
  121. 121. How could I back to running container and do another thing? • attach! • exec It can only run one process.
  122. 122. How could I back to running container and do another thing? • attach! • exec It can only run one process. It's added on docker 1.3 (rock)
  123. 123. Alias $ docker run nginx --name my-nginx -d nginx 4441f36ebab1975004782ea6d03198fd8ced8472cf34721f9906cbebfe61872d"
  124. 124. Alias $ docker run nginx --name my-nginx -d nginx 4441f36ebab1975004782ea6d03198fd8ced8472cf34721f9906cbebfe61872d" $ docker exec -it nginx bin/bash CONTAINER ID IMAGE …… STATUS PORTS NAMES 4441f36ebab1 nginx:latest Up 4 seconds 443/tcp, 0.0.0.0:80->80/tcp my-nginx
  125. 125. $ docker run nginx --name my-nginx -d nginx 4441f36ebab1975004782ea6d03198fd8ced8472cf34721f9906cbebfe61872d" $ docker exec -it my-nginx bin/bash root@4441f36ebab1:/# Alias $ docker exec -it nginx bin/bash CONTAINER ID IMAGE …… STATUS PORTS NAMES 4441f36ebab1 nginx:latest Up 4 seconds 443/tcp, 0.0.0.0:80->80/tcp my-nginx
  126. 126. Linking We don't have enough time… Let's see picture again! XD
  127. 127. Linking PHP+Nginx! Container Host MySQL! Container Port Port
  128. 128. Linking PHP+Nginx! Container Host MySQL! Container Port Port Let's try to hack!
  129. 129. Linking PHP+Nginx! Container Host MySQL! Container Port Port 斷開鎖鏈!
  130. 130. Linking PHP+Nginx! Container Host MySQL! Container Port Link Port 移情別戀!(不對
  131. 131. Linking PHP+Nginx! Container Host MySQL! Container Port Link Oops! More Secure
  132. 132. Volume Picture, BJ4
  133. 133. Host volume directory /var/www/html …… …… Container
  134. 134. Host volume directory /var/www/html …… …… Container Isolation
  135. 135. Host volume directory /var/www/html …… …… Container How could we mount container's directory to host?
  136. 136. Host volume directory /var/www/html …… …… Volume Container
  137. 137. Host volume directory /var/www/html …… …… Volume Container • Real time changes
  138. 138. Host volume directory /var/www/html …… …… Volume Container • Real time changes! • Exist until container destroyed!
  139. 139. Host volume directory /var/www/html …… …… Volume Container • Real time changes! • Exist until container destroyed! • Can set RO mode.
  140. 140. Share Volume between containers Host volume directory /var/www/html …… …… Container A /var/www/html …… Container B
  141. 141. Share Volume between containers Host volume directory /var/www/html …… …… Container A Volume /var/www/html …… Container B
  142. 142. Share Volume between containers Host volume directory /var/www/html …… …… Container A Volume /var/www/html …… Container B
  143. 143. Registry & Dockerfile
  144. 144. index.docker.io
  145. 145. registry = docker's github.
  146. 146. Official PHP Repo
  147. 147. Tutorial for using image
  148. 148. Dockerfile of image
  149. 149. Dockerfile • Automatically built images and deploy! • Automated Builds on Docker Hub! • Easy to share and customize config! !
  150. 150. We don't have time to talk how to write…but official document is completed.
  151. 151. Which patterns can we use?
  152. 152. Single app container Volume PHP App /var/www/html PHP 5.6 …… Nginx MySQL …… Port
  153. 153. Single app container Volume PHP App /var/www/html PHP 5.6 …… Nginx MySQL …… Port Not recommend use for production
  154. 154. Container Groups Volume /var/www/html PHP App …… Nginx /var/lib/mysql/ …… PHP 5.6 MySQL …… App Container DB Container Port Port Easy to manage
  155. 155. Separate containers FS nginx container FS php container …… PHP-apache FS MySQL container …… MySQL Volume PHP App …… Link Link Port …… Nginx volume Using in production
  156. 156. Data Only Container Volume /data 8421917fbed8aa018ad3…. …… /data …… …… DB-data Container volume from DB Container volume
  157. 157. How could I use docker to solve problem?
  158. 158. Multi PHP Projects HOST Nginx PHP project A /var/www/html …… PHP:5.6-apache ! Container PHP project B /var/www/html …… PHP:5.5-apache ! …… Container /var/www/html ……
  159. 159. Multi PHP Projects HOST Nginx PHP project A /var/www/html …… PHP:5.6-apache ! Container PHP project B /var/www/html …… PHP:5.5-apache ! …… Container /var/www/html …… volume
  160. 160. Multi PHP Projects HOST Nginx PHP project A /var/www/html …… PHP:5.6-apache ! Container /data …… DB Container PHP project B /var/www/html …… PHP:5.5-apache ! …… Container /var/www/html …… DB! Link volume
  161. 161. Multi PHP Projects HOST Nginx PHP project A /var/www/html …… PHP:5.6-apache ! Container /data …… DB Container PHP project B /var/www/html …… PHP:5.5-apache ! …… Container /var/www/html …… DB! Link volume Port
  162. 162. Thank you. Thanks my girlfriend especially.
  163. 163. Resource & Reference • Docker Documentation! • Digital Ocean! • boot2docker! • Ship it with Docker! by Xabier Larrakoetxea! • Docker.Taipei! • Flat UI Colors! • IcoMoon App
  164. 164. Q & A

×