how to deploy php projects with docker
DESCRIPTION
PHPConf 2014 http://phpconf.tw/2014/TRANSCRIPT
Docker x PHPHow to deploy PHP projects with docker.
PHPConf 2014
What will I Talk today?
Application!20%
Use!35%
Concept!35%
Story!10%
What story I wanna!talk before speech ?
The situation we!deploy PHP Projects!
that we feel HURTHURT
PHP Version Requirement
Laravel
Symfony
CodeIgniter Phalcon
Yii
Wordpress
Drupal 7 Drupal 8Drupal 6
Joomla
MediaWiki
DokuWiki
Laravel
Symfony
CodeIgniter Phalcon
Yii
Wordpress
Drupal 7 Drupal 8Drupal 6
Joomla
MediaWiki
DokuWiki
There are so many!PHP Projects…
PHP Version Requirement
Laravel 5.4+
Symfony 5.3.3+
CodeIgniter 5.1.6+ Phalcon 5.3+!
Yii 5.1+
Wordpress 5.2.4+
Drupal-7 5.2.5+ Drupal-8 5.4+Drupal-6 5.2.x
Joomla! 5.4+
MediaWiki 5.3.2+
DokuWiki 5.2
But version !requirement !
are different!?
PHP Version Requirement
`
Laravel 5.4+
Symfony 5.3.3+
CodeIgniter 5.1.6+ Phalcon 5.3+!
Yii 5.1+
Wordpress 5.2.4+
Drupal-7 5.2.5+ Drupal-8 5.4+Drupal-6 5.2.x
Joomla! 5.4+
MediaWiki 5.3.2+
DokuWiki 5.2
WHICH PHP VERSION !SHOULD I INSTALLED ?
Multifarious Extension
Multifarious Extensionapxs2, 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
Multifarious Extensionapxs2, 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
PECL? !
Recompiled?
One Server Multi Projects
Server
App 1PHP
MySQL etc…
App 2PHP
MySQL etc…
App nPHP, DB,
etc………
One Server Multi Projects
Server
App 1PHP 5.3.2,
MySQL 5.0.2, etc…
App 2PHP 5.4,
MySQL 5.0.15, etc…
App nPHP 5.4, MariaDB,
etc…
……
BUT DIFFERENT REQUIRMENT
某某專案需要更⾼高的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 portable.
How docker can help us?
Built specify environment for target project.!
Isolate every project space.!
Package it and be portable.!
Deploy lightweight and fast.
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 developers and sysadmins.
-docker.io
LXC !
Not VM !
Encapsulation!
Portability !
Lightweight
What is it?
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
ServerHost OS
Hypervisor
Guest OS
/usr/bin, /usr/lib, …
App
Guest OS
/usr/bin, /usr/lib, …
App 2
Guest OS
/usr/bin, /usr/lib, …
App'
Virtual Machine
ServerHost OS
Hypervisor
Guest OS
/usr/bin, /usr/lib, …
App
Guest OS
/usr/bin, /usr/lib, …
App 2
Guest OS
/usr/bin, /usr/lib, …
App'
VM1 VM2 VM3
Virtual Machine
ServerHost OS
Hypervisor
Guest OS
PHP 5.2
PHP App
Guest OS
PHP 5.4
PHP App2
Guest OS
PHP 5.3
PHP App'
VM1 VM2 VM3
Docker
ServerHost OS
/bin, /lib
PHP !App3
Docker
/bin, /lib
PHP !App4
/bin, /lib
PHP !App
PHP !App`
Docker
ServerHost OS
/bin, /lib
PHP !App3
Docker
Docker container
/bin, /lib
PHP !App4
/bin, /lib
PHP !App
PHP !App`
/bin, /lib
Docker
ServerHost OS
PHP 5.3
PHP !App3
Docker
Docker container
PHP 5.4
PHP !App4
PHP 5.2
PHP !App
PHP !App`
PHP 5.2
Docker
ServerHost OS
PHP 5.3
PHP !App3
Docker
Docker container
PHP 5.4
PHP !App4
Shared FS with AUFS
PHP 5.2
PHP !App
PHP !App`
PHP 5.2
Docker Container
Kernel
LXC AUFS
Docker
Base image (Ubuntu)
Image (php)
Image (apache)
Container
Base image (CentOS)
Image (nginx)
Container Container
Docker Container
Kernel
LXC AUFS
Docker
Base image (Ubuntu)
Image (php)
Image (apache)
Container
Base image (CentOS)
Image (nginx)
Container ContainerParent !Reference
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 Picture!
AUFS
Add Files A
Add Files B
Add Files C
Delete Files B
Add Files E
Add Files D
AUFS
Add Files A
Add Files B
Add Files C
Delete Files B
Add Files E
Add Files D
Layered FS
AUFS
Add Files A
Add Files B
Add Files C
Delete Files B
Add Files E
Add Files D
Share commonFS
AUFS
Base image
Image
Image
Container
Container
Container
AUFS
Base image
Image
Image
Container
Container
Container
ReadOnly
ReadWrite
AUFS
Base image
Image
Image
Container
Container
Container
Used to share between container
ImagesReadOnly Layer!
Don't change. !
Environments!
Used to be container
ContainersReadWrite Layer!
Running Process!
Built with one or more images!
Commit change to create image
Docker Container
Kernel
LXC AUFS
Docker
Base image (Ubuntu)
Image (php)
Image (apache)
Container
Base image (CentOS)
Image (nginx)
Container Container
Docker Container
Kernel
LXC AUFS
Docker
Base image (Ubuntu)
Image (php)
Image (apache)
Container
Base image (CentOS)
Image (nginx)
Container Container
Read!Only
Docker Container
Kernel
LXC AUFS
Docker
Base image (Ubuntu)
Image (php)
Image (apache)
Container
Base image (CentOS)
Image (nginx)
Container Container
Read!Only
Writable
Relationship between image and container
Image!(registry)
Image!(registry)
Relationship between image and container
Image!(local)
PULLImage!
(registry)
Relationship between image and container
Image!(registry)
Container
RUN
Image!(local)
PULL
Relationship between image and container
Image!(registry)
Container
RUN
Container'CHANGE
Image!(local)
PULL
Relationship between image and container
Image!(registry)
Container
RUN
Container'CHANGE
COMMIT
Image!(local)
PULL
Relationship between image and container
Image!(registry)
Container
RUN
Container'CHANGE
COMMIT
Image!(local)
PULL
PUSHImage!(registry)
Relationship between image and container
Image!(registry)
Container
RUN
Container'CHANGE
COMMIT
Image!(local)
PULL
PUSH
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
Same day as my birthday >///<
Basic Command
Version
$ docker version
Version
$ docker versionClient version: 1.3.0Client API version: 1.15Go version (client): go1.3.3Git commit (client): c78088fOS/Arch (client): linux/amd64Server version: 1.3.0Server API version: 1.15Go version (server): go1.3.3Git commit (server): c78088f
Info
$ docker info
Info
$ docker infoContainers: 4Images: 71Storage Driver: aufs Root Dir: /var/lib/docker/aufs Dirs: 79Execution Driver: native-0.2Kernel Version: 3.13.0-36-genericOperating System: Ubuntu 14.04.1 LTS
Pull base image(s)
$ docker pull ubuntu
Pull base image(s)
$ docker pull ubuntu
image name
Pull base image(s)
$ docker pull ubuntuPulling repository ubuntu463ff6be4238: Download complete9cbaf023786c: Download complete2185fd50e2ca: Download completea9561eb1b190: Download complete3db9c44f4520: Download complete195eb90b5349: Download completec5881f11ded9: Download complete511136ea3c5a: Download complete500cae81e00f: Download complete3ed75c4904e0: Download completeb8c495ea8a4e: Download complete0f154c52e965: Download completef180ea115597: Download completebac448df371d: Download complete……
List images$ docker images
List images$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZEubuntu 14.10 2185fd50e2ca 28 hours ago 237.2 MBubuntu utopic 2185fd50e2ca 28 hours ago 237.2 MBubuntu 14.04.1 9cbaf023786c 28 hours ago 192.8 MBubuntu 14.04 9cbaf023786c 28 hours ago 192.8 MBubuntu trusty 9cbaf023786c 28 hours ago 192.8 MBubuntu latest 9cbaf023786c 28 hours ago 192.8 MBubuntu precise a9561eb1b190 28 hours ago 120.2 MBubuntu 12.04.5 a9561eb1b190 28 hours ago 120.2 MBubuntu 12.04 a9561eb1b190 28 hours ago 120.2 MBubuntu 12.10 c5881f11ded9 3 months ago 172.2 MBubuntu quantal c5881f11ded9 3 months ago 172.2 MBubuntu 13.04 463ff6be4238 3 months ago 169.4 MBubuntu raring 463ff6be4238 3 months ago 169.4 MBubuntu 13.10 195eb90b5349 3 months ago 184.7 MBubuntu saucy 195eb90b5349 3 months ago 184.7 MB……
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
$ docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES73ec6de5630b ubuntu:14.04 "/bin/echo 'hello, w 2 hours ago Exited (0) sad_engelbart
image name execute argument
Run and List container
$ docker run ubuntu:trusty /bin/echo "hello, world"hello, world
$ docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES73ec6de5630b ubuntu:14.04 "/bin/echo 'hello, w 2 hours ago Exited (0) sad_engelbart
image name execute argument
The container is finished, so we use -a
Run and list running container
docker run ubuntu:latest /bin/sh -c \"while true; do echo hello, world; sleep 1; done;"
hello, worldhello, world……
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES8e46bc2bd17d ubuntu:14.04 "/bin/sh -c 2 hours ago Up 5 seconds lonely_brow
Run and list running container
docker run ubuntu:latest /bin/sh -c \"while true; do echo hello, world; sleep 1; done;"
hello, worldhello, world……
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES8e46bc2bd17d ubuntu:14.04 "/bin/sh -c 2 hours ago Up 5 seconds lonely_brow
The container is running until we stop it
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 NAMES90f0ca0a1301 ubuntu:14.04 "/bin/sh -c 2 hours ago Up 5 seconds lonely_brow
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 NAMES90f0ca0a1301 ubuntu:14.04 "/bin/sh -c 2 hours ago Up 5 seconds lonely_brow
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 NAMES90f0ca0a1301 ubuntu:14.04 "/bin/sh -c 2 hours ago Up 5 seconds lonely_brow
We use container id to manage it
Logs and Attach Container
$ docker logs 90f0cahello, worldhello, world……
$ docker attach 90f0cahello, worldhello, world……
Logs and Attach Container
$ docker logs 90f0cahello, worldhello, world……
$ docker attach 90f0cahello, worldhello, world……
Get logs
Logs and Attach Container
$ docker logs 90f0cahello, worldhello, world……
$ docker attach 90f0cahello, worldhello, world……
Get logs
Back to container console
Logs and Attach Container
$ docker logs 90f0cahello, worldhello, world……
$ docker attach 90f0cahello, worldhello, world……
Get logs
Back to container console
「CTRL-p CTRL-q」 to detach.!
Commit$ docker run -i -t php:5.6.1-apache /bin/bash!
root@4441f36ebab1:/# You do some change ……
Sets STDIN and open a PTY
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 NAMES6a495e871389 php:5-apache "/bin/bash" 24 minutes ago Exited (0) cranky_morse
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 NAMES6a495e871389 php:5-apache "/bin/bash" 24 minutes ago Exited (0) cranky_morse
$ docker commit 6a495e871389 fntsr/first-image!2006ba62eb6508560ae38782ee514a4212d29ea4e4a2e7495b1eedf155fe13df
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 NAMES6a495e871389 php:5-apache "/bin/bash" 24 minutes ago Exited (0) cranky_morse
$ docker commit 6a495e871389 fntsr/first-image!2006ba62eb6508560ae38782ee514a4212d29ea4e4a2e7495b1eedf155fe13df
<username>/<image_name>
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 NAMES6a495e871389 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 SIZEfntsr/first-image latest 2006ba62eb65 22 minutes ago 803.6 MB
Expose Port
docker run -d -p 80 nginxc63fda2248d0dcf90a90cc817d1acb6c9546db841128ca7558ff1f496ad4f8fb
$ docker ps -a!CONTAINER ID IMAGE COMMAND CREATED STATUS PORTSc63fda2248d0 nginx:1 "nginx… 6 seconds ago Up 5 seconds 443/tcp, 0.0.0.0:49153->80/tcp
Expose Port
docker run -d -p 80 nginxc63fda2248d0dcf90a90cc817d1acb6c9546db841128ca7558ff1f496ad4f8fb
-p <guest_port>!
$ docker ps -a!CONTAINER ID IMAGE COMMAND CREATED STATUS PORTSc63fda2248d0 nginx:1 "nginx… 6 seconds ago Up 5 seconds 443/tcp, 0.0.0.0:49153->80/tcp
Expose Port
docker run -d -p 80 nginxc63fda2248d0dcf90a90cc817d1acb6c9546db841128ca7558ff1f496ad4f8fb
-p <guest_port>!
$ docker ps -a!CONTAINER ID IMAGE COMMAND CREATED STATUS PORTSc63fda2248d0 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
docker run -d -p 10080:80 nginxafd45d0f7d34baf90dbef109ae167c99a49432080adc8621e8cd7e18a4004658
$ docker ps -a!CONTAINER ID IMAGE COMMAND CREATED STATUS PORTSafd45d0f7d34 nginx:1 "nginx… 6 seconds ago Up 5 seconds 443/tcp, 0.0.0.0:10080->80/tcp
Expose Port
docker run -d -p 10080:80 nginxafd45d0f7d34baf90dbef109ae167c99a49432080adc8621e8cd7e18a4004658
-p <host_port>:<guest_port>
$ docker ps -a!CONTAINER ID IMAGE COMMAND CREATED STATUS PORTSafd45d0f7d34 nginx:1 "nginx… 6 seconds ago Up 5 seconds 443/tcp, 0.0.0.0:10080->80/tcp
Expose Port
docker run -d -p 10080:80 nginxafd45d0f7d34baf90dbef109ae167c99a49432080adc8621e8cd7e18a4004658
-p <host_port>:<guest_port>
$ docker ps -a!CONTAINER ID IMAGE COMMAND CREATED STATUS PORTSafd45d0f7d34 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
Expose Port
docker run -d -p 127.0.0.1:10080:80 nginx76d00613ccb3576ef604c61f4d086aa6f090ed7268c42638f1931e235c0fe526
$ docker ps -a!CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS76d00613ccb3 nginx:1 "nginx… 6 seconds ago Up 5 seconds 443/tcp, 127.0.0.1:10080->80/tcp
Expose Port
docker run -d -p 127.0.0.1:10080:80 nginx76d00613ccb3576ef604c61f4d086aa6f090ed7268c42638f1931e235c0fe526
-p <hostname>:<host_port>:<guest_port>
$ docker ps -a!CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS76d00613ccb3 nginx:1 "nginx… 6 seconds ago Up 5 seconds 443/tcp, 127.0.0.1:10080->80/tcp
Expose Port
docker run -d -p 127.0.0.1:10080:80 nginx76d00613ccb3576ef604c61f4d086aa6f090ed7268c42638f1931e235c0fe526
-p <hostname>:<host_port>:<guest_port>
$ docker ps -a!CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS76d00613ccb3 nginx:1 "nginx… 6 seconds ago Up 5 seconds 443/tcp, 127.0.0.1:10080->80/tcp
Expose with host name
Expose to host with hostname
Expose Port
docker run -d -P nginx2123f55d26fc3d5824492ed8ad4d7f9e28ed5d749e7d401e21a1bb0002f65048
$ docker ps -a!CONTAINER ID IMAGE COMMAND CREATED PORTSafd45d0f7d34 nginx:1 "nginx… Up 5 seconds 0.0.0.0:49154->443/tcp, 0.0.0.0:49155->80/tcp
Expose Port
docker run -d -P nginx2123f55d26fc3d5824492ed8ad4d7f9e28ed5d749e7d401e21a1bb0002f65048
-P
$ docker ps -a!CONTAINER ID IMAGE COMMAND CREATED PORTSafd45d0f7d34 nginx:1 "nginx… Up 5 seconds 0.0.0.0:49154->443/tcp, 0.0.0.0:49155->80/tcp
Expose Port
docker run -d -P nginx2123f55d26fc3d5824492ed8ad4d7f9e28ed5d749e7d401e21a1bb0002f65048
-P
$ docker ps -a!CONTAINER ID IMAGE COMMAND CREATED PORTSafd45d0f7d34 nginx:1 "nginx… Up 5 seconds 0.0.0.0:49154->443/tcp, 0.0.0.0:49155->80/tcp
Expose all port of container !with host random port
443 expose to 49154 (random)
Expose Port
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 on docker 1.3 (rock)
$ docker run nginx --name my-nginx -d nginx4441f36ebab1975004782ea6d03198fd8ced8472cf34721f9906cbebfe61872d"
Alias
$ docker run nginx --name my-nginx -d nginx4441f36ebab1975004782ea6d03198fd8ced8472cf34721f9906cbebfe61872d"
Alias
$ docker exec -it nginx bin/bashCONTAINER ID IMAGE …… STATUS PORTS NAMES4441f36ebab1 nginx:latest Up 4 seconds 443/tcp, 0.0.0.0:80->80/tcp my-nginx
$ docker run nginx --name my-nginx -d nginx4441f36ebab1975004782ea6d03198fd8ced8472cf34721f9906cbebfe61872d"
$ docker exec -it my-nginx bin/bash
root@4441f36ebab1:/#
Alias
$ docker exec -it nginx bin/bashCONTAINER ID IMAGE …… STATUS PORTS NAMES4441f36ebab1 nginx:latest Up 4 seconds 443/tcp, 0.0.0.0:80->80/tcp my-nginx
LinkingWe don't have enough time…
Let's see picture again! XD
LinkingPHP+Nginx!Container
Host
MySQL!Container
Port
Port
LinkingPHP+Nginx!Container
Host
MySQL!Container
Port
Port
Let's try to hack!
LinkingPHP+Nginx!Container
Host
MySQL!Container
Port
Port
斷開鎖鏈!
LinkingPHP+Nginx!Container
Host
MySQL!Container
Port
Link
Port
移情別戀!(不對
LinkingPHP+Nginx!Container
Host
MySQL!Container
Port
Link
Oops! More Secure
VolumePicture, BJ4
volume directory
Host /var/www/html
…………
Container
volume directory
Host /var/www/html
…………
Container
Isolation
volume directory
Host /var/www/html
…………
Container
How could we mount container's directory to host?
volume directory
Host /var/www/html
…………
ContainerVolume
volume directory
Host /var/www/html
…………
ContainerVolume
• Real time changes
volume directory
Host /var/www/html
…………
ContainerVolume
• Real time changes!• Exist until container destroyed!
volume directory
Host /var/www/html
…………
ContainerVolume
• Real time changes!• Exist until container destroyed!• Can set RO mode.
volume directory
Host /var/www/html
…………
Container A
/var/www/html
……
Container B
Share Volume between containers
volume directory
Host /var/www/html
…………
Container AVolume
/var/www/html
……
Container B
Share Volume between containers
volume directory
Host /var/www/html
…………
Container AVolume
/var/www/html
……
Container B
Share Volume between containers
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 config!
!
We don't have time to talk how to write…but official document is completed.
Which patterns can we use?
Single app container
PHP App
Volume /var/www/html PHP 5.6
…… Nginx
MySQL……
Port
Single app container
PHP App
Volume /var/www/html PHP 5.6
…… Nginx
MySQL……
Port
Not recommend use for production
Container Groups
PHP App
Volume /var/www/html
…… Nginx
/var/lib/mysql/
……
PHP 5.6
MySQL
……
App Container
DB Container
Port
Port
Easy to manage
Separate containers
…… PHP-apache
FS php container
…… MySQL
FS MySQL container
PHP App
Volume
…… Link
Link
Port…… Nginx
FS nginx container
volume
Using in production
Data Only Container
8421917fbed8aa018ad3….
Volume /data
……
/data
……
……
DB-data Container
DB Container
volume from
volume
How could I use docker to solve problem?
Multi PHP ProjectsNginxHOST
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
Multi PHP ProjectsNginxHOST
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
Multi PHP ProjectsNginxHOST
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
Multi PHP ProjectsNginxHOST
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
Thank you.
Thanks my girlfriend especially.
Resource & Reference• Docker Documentation!
• Digital Ocean!
• boot2docker!
• Ship it with Docker! by Xabier Larrakoetxea!
• Docker.Taipei!
• Flat UI Colors!
• IcoMoon App
Q & A