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 for PHP
Developers
Chris	Tankersley	
@dragonmantank	
NomadPHP	EU	April	2016	
NomadPHP	EU	April	2016		 1
Who Am I
•  PHP	Programmer	for	over	11	years	
•  Sysadmin/DevOps	for	around	9	years	
•  Using	Linux	for	more	than	15	years...
Docker
NomadPHP	EU	April	2016		 3
What Is Docker?
“Docker	is	an	open	plaWorm	for	developers	and	sysadmins	to	build,	
ship,	and	run	distributed	applicaXons.	...
What is it from a technical standpoint?
•  Docker	is	a	wrapper	around	Containers	
•  Docker	Engine	is	the	packaging	porXon...
Containers
NomadPHP	EU	April	2016		 6
Normal Bare-Metal Server
NomadPHP	EU	April	2016		 7	
CPU	 RAM	 HD	 Network	
OperaXng	System	
nginx	 PHP	 DB
Virtual Machines
NomadPHP	EU	April	2016		 8	
CPU	 RAM	 HD	 Network	
OperaXng	System	
nginx	 PHP	 DB	
OperaXng	System	
ngin...
Containers
NomadPHP	EU	April	2016		 9	
CPU	 RAM	 HD	 Network	
OperaXng	System	
nginx	nginx	 PHP	 DB	 PHP	 DB
Docker can use many different containers
•  Since	0.9.0	it	supports:	
•  LXC	(Linux	Containers)	–	Started	with	LXC	when	it...
Runs on *nix and Windows Hyper-V
•  No	naXve	container	drivers	for	OSX*	
•  Amazon	has	ElasXc	Container	Service,	and	Micro...
Sorry OSX Users
•  Docker	support	is	officially	maintained	through	Docker	Toolbox	
NomadPHP	EU	April	2016		 12
Docker Toolbox also is for Windows
NomadPHP	EU	April	2016		 13
Let’s use Docker
NomadPHP	EU	April	2016		 14
Running a container
•  `docker	run`	will	run	a	container	
•  This	will	not	restart	an	exisXng	container,	just	create	a	new...
Running a simple shell
NomadPHP	EU	April	2016		 16
Running a simple shell
NomadPHP	EU	April	2016		 17
Running a simple shell
NomadPHP	EU	April	2016		 18
Running Two Webservers
NomadPHP	EU	April	2016		 19
Running Two Webservers
NomadPHP	EU	April	2016		 20
Running Two Webservers
NomadPHP	EU	April	2016		 21
Running Two Webservers
NomadPHP	EU	April	2016		 22
Running Two Webservers
NomadPHP	EU	April	2016		 23
Running Two Webservers
NomadPHP	EU	April	2016		 24
Running Two Webservers
NomadPHP	EU	April	2016		 25
Running Two Webservers
NomadPHP	EU	April	2016		 26
Some Notes
•  All	three	containers	are	100%	self	contained	
•  Docker	containers	share	common	ancestors,	but	keep	their	ow...
Volumes
NomadPHP	EU	April	2016		 28
Modifying a running container
•  `docker	exec`	can	run	a	command	inside	of	an	exisXng	container	
•  Use	Volumes	to	share	d...
Persistent Data with Volumes
•  You	can	designate	a	volume	with	-v	
•  Volumes	can	be	shared	amongst	containers	
•  Volume...
Mounting from the host machine
NomadPHP	EU	April	2016		 31
Mounting from the host machine
NomadPHP	EU	April	2016		 32
Mounting from the host machine
NomadPHP	EU	April	2016		 33
Mounting from the host machine
NomadPHP	EU	April	2016		 34
Mounting from the host machine
NomadPHP	EU	April	2016		 35
Mounting from the host isn’t perfect
•  The	container	now	has	a	window	into	your	host	machine	
•  Permissions	can	get	scre...
Container Data Volumes
•  Uses	a	small	container	that	does	nothing	but	stores	data	
•  Have	our	app	containers	use	the	dat...
Mounting Data Volumes
NomadPHP	EU	April	2016		 38
Mounting Data Volumes
NomadPHP	EU	April	2016		 39
Mounting Data Volumes
NomadPHP	EU	April	2016		 40
Mounting Data Volumes
NomadPHP	EU	April	2016		 41
Mounting Data Volumes
NomadPHP	EU	April	2016		 42
Mounting Data Volumes
NomadPHP	EU	April	2016		 43
Mounting Data Volumes
NomadPHP	EU	April	2016		 44
Mounting Data Volumes
NomadPHP	EU	April	2016		 45
Why not run SSH inside of the container?
•  Well,	you	can…	
•  Docker	is	designed	for	one	command	per	container	
•  If	you...
Why go through the hassle?
•  Data	volumes	are	portable	
•  Data	volumes	are	safer	
•  Separates	the	app	containers	from	d...
Network Linking
NomadPHP	EU	April	2016		 48
Docker Links
•  Allows	containers	to	‘see’	each	other	over	the	network	
•  Each	container	thinks	the	other	one	is	just	ano...
More Traditional Setup
NomadPHP	EU	April	2016		 50	
INTARWEBS	 Nginx		 PHP-FPM	
Data	Volume	
Port	9000	
Editor
Let’s Build It
NomadPHP	EU	April	2016		 51
Let’s Build It
NomadPHP	EU	April	2016		 52
Let’s Build It
NomadPHP	EU	April	2016		 53
Let’s Build It
NomadPHP	EU	April	2016		 54
Let’s Build It
NomadPHP	EU	April	2016		 55
Let’s Build It
NomadPHP	EU	April	2016		 56
More Notes!
•  We	can	now	rebuild	secXons	of	the	app	as	needed	
•  We	can	restart	nginx	without	impacXng	PHP	
•  We	can	ex...
Creating your own Images
NomadPHP	EU	April	2016		 58
Dockerfile
•  Dockerfile	is	the	configuraXon	steps	for	an	image	
•  Can	be	created	from	scratch,	or	based	on	another	image	
...
FROM	phusion/baseimage:0.9.10	
#	…	
CMD	["/sbin/my_init"]	
#	Nginx-PHP	Installation	
RUN	apt-get	update	
RUN	apt-get	insta...
Build it
docker	build	-t	tag_name	./	
•  This	runs	through	the	Dockerfile	and	generates	the	image	
•  We	can	now	use	the	ta...
Other Helpful Commands
NomadPHP	EU	April	2016		 62
Inspect a container
docker	inspect	[opXons]	CONTAINER_NAME	
•  Returns	a	JSON	string	with	data	about	the	container	
•  Can...
Work with images
•  docker	pull	IMAGE	–	Pulls	down	an	image	before	using	
•  docker	images	–	Lists	all	the	images	that	are...
Docker Machine
NomadPHP	EU	April	2016		 65
What is Docker Machine?
•  A	provisioning	tool	that	is	used	to	set	up	a	box	with	Docker	
•  Used	in	Docker	Toolbox	to	crea...
Why use it?
•  Makes	it	very	easy	to	spin	up	new	boxes	
•  Docker	Machine	handles	all	of	the	dirty	stuff	for	you	
•  Docker...
Docker Swarm
NomadPHP	EU	April	2016		 68
What is Docker Swarm?
•  Cluster	management	tool	developed	by	Docker	
•  Looks	like	a	machine	running	docker,	but	is	actua...
Docker Compose
NomadPHP	EU	April	2016		 70
What is Docker Compose?
•  MulX-container	orchestraXon	
•  A	single	config	file	holds	all	of	your	container	info	
•  Works	w...
Sample docker-compose.yml
phpserver:	
		build:	./docker/php	
		volumes:	
				-	/home/ctankersley/Projects/dockerfordevs:/v...
Deploying
NomadPHP	EU	April	2016		 73
I can’t answer this for you
NomadPHP	EU	April	2016		 74	
¯_(ツ)_/¯
Questions?
NomadPHP	EU	April	2016		 75
Each situation is different
•  You	will	probably	build	something	custom,	using	exisXng	tools	
•  Do	you	use	data	volumes?	...
Things to consider
•  Docker	Compose	will	only	deploy	an	app	to	one	server	
•  Docker	Swarm	is	preJy	low-level	and	bare-bo...
Rancher is a good start
•  Provides	a	nice	GUI	to	manage	everything	
•  Allows	volume	sharing	and	networking	across	hosts	...
Rancher in action
NomadPHP	EU	April	2016		 79
Questions?
NomadPHP	EU	April	2016		 80
http://ctankersley.com
chris@ctankersley.com
@dragonmantank
https://joind.in/talk/42cba
NomadPHP	EU	April	2016		 81
Upcoming SlideShare
Loading in …5
×

Docker for PHP Developers (NomadPHP)

569 views

Published on

Thanks to tools like vagrant, puppet/chef, and Platform as a Service services like Heroku, developers are extremely used to being able to spin up a development environment that is the same every time. What if we could go a step further and make sure our development environment is not only using the same software, but 100% configured and set up like production. Docker will let us do that, and so much more. We’ll look at what Docker is, why you should look into using it, and all of the features that developers can take advantage of.

Published in: Technology
  • Be the first to comment

Docker for PHP Developers (NomadPHP)

  1. 1. Docker for PHP Developers Chris Tankersley @dragonmantank NomadPHP EU April 2016 NomadPHP EU April 2016 1
  2. 2. Who Am I •  PHP Programmer for over 11 years •  Sysadmin/DevOps for around 9 years •  Using Linux for more than 15 years •  hJps://github.com/dragonmantank •  Author of “Docker for Developers” •  Reigning, Defending, Undisputed PHP MTG Champion of the World NomadPHP EU April 2016 2
  3. 3. Docker NomadPHP EU April 2016 3
  4. 4. What Is Docker? “Docker is an open plaWorm for developers and sysadmins to build, ship, and run distributed applicaXons. ConsisXng of Docker Engine, a portable, lightweight runXme and packaging tool, and Docker Hub, a cloud service for sharing applicaXons and automaXng workflows, Docker enables apps to be quickly assembled from components and eliminates the fricXon between development, QA, and producXon environments.” NomadPHP EU April 2016 4 hJps://www.docker.com/whaXsdocker/
  5. 5. What is it from a technical standpoint? •  Docker is a wrapper around Containers •  Docker Engine is the packaging porXon that builds and runs the containers •  Docker Hub allows you to publish images for others to use •  Docker Machine is a bare-metal provisioning tool •  Docker Swarm is an load-balancing deployment tool •  Docker Compose is a mulX-container build system NomadPHP EU April 2016 5
  6. 6. Containers NomadPHP EU April 2016 6
  7. 7. Normal Bare-Metal Server NomadPHP EU April 2016 7 CPU RAM HD Network OperaXng System nginx PHP DB
  8. 8. Virtual Machines NomadPHP EU April 2016 8 CPU RAM HD Network OperaXng System nginx PHP DB OperaXng System nginx PHP DB OperaXng System Hypervisor
  9. 9. Containers NomadPHP EU April 2016 9 CPU RAM HD Network OperaXng System nginx nginx PHP DB PHP DB
  10. 10. Docker can use many different containers •  Since 0.9.0 it supports: •  LXC (Linux Containers) – Started with LXC when it was released •  OpenVZ •  Systemd-nspawn •  libvert-sandbox •  Qemu/kvm •  BSD Jails •  Solaris Zones •  chroot NomadPHP EU April 2016 10
  11. 11. Runs on *nix and Windows Hyper-V •  No naXve container drivers for OSX* •  Amazon has ElasXc Container Service, and Microsok Azure has Azure Container Service NomadPHP EU April 2016 11
  12. 12. Sorry OSX Users •  Docker support is officially maintained through Docker Toolbox NomadPHP EU April 2016 12
  13. 13. Docker Toolbox also is for Windows NomadPHP EU April 2016 13
  14. 14. Let’s use Docker NomadPHP EU April 2016 14
  15. 15. Running a container •  `docker run` will run a container •  This will not restart an exisXng container, just create a new one •  docker run [opXons] IMAGE [command] [arguments] •  [opXons ]modify the docker process for this container •  IMAGE is the image to use •  [command] is the command to run inside the container •  [arguments] are arguments for the command NomadPHP EU April 2016 15
  16. 16. Running a simple shell NomadPHP EU April 2016 16
  17. 17. Running a simple shell NomadPHP EU April 2016 17
  18. 18. Running a simple shell NomadPHP EU April 2016 18
  19. 19. Running Two Webservers NomadPHP EU April 2016 19
  20. 20. Running Two Webservers NomadPHP EU April 2016 20
  21. 21. Running Two Webservers NomadPHP EU April 2016 21
  22. 22. Running Two Webservers NomadPHP EU April 2016 22
  23. 23. Running Two Webservers NomadPHP EU April 2016 23
  24. 24. Running Two Webservers NomadPHP EU April 2016 24
  25. 25. Running Two Webservers NomadPHP EU April 2016 25
  26. 26. Running Two Webservers NomadPHP EU April 2016 26
  27. 27. Some Notes •  All three containers are 100% self contained •  Docker containers share common ancestors, but keep their own files •  `docker run` parameters: •  --rm – Destroy a container once it exits •  -d – Run in the background (daemon mode) •  -i – Run in interacXve mode •  --name – Give the container a name •  -p [local port]:[container port] – Forward the local port to the container port NomadPHP EU April 2016 27
  28. 28. Volumes NomadPHP EU April 2016 28
  29. 29. Modifying a running container •  `docker exec` can run a command inside of an exisXng container •  Use Volumes to share data NomadPHP EU April 2016 29
  30. 30. Persistent Data with Volumes •  You can designate a volume with -v •  Volumes can be shared amongst containers •  Volumes can mount data from the host system NomadPHP EU April 2016 30
  31. 31. Mounting from the host machine NomadPHP EU April 2016 31
  32. 32. Mounting from the host machine NomadPHP EU April 2016 32
  33. 33. Mounting from the host machine NomadPHP EU April 2016 33
  34. 34. Mounting from the host machine NomadPHP EU April 2016 34
  35. 35. Mounting from the host machine NomadPHP EU April 2016 35
  36. 36. Mounting from the host isn’t perfect •  The container now has a window into your host machine •  Permissions can get screwy if you are modifying in the container •  Most things it creates will be root by default, and you probably aren’t root on the host machine •  Host-mounted volumes are not portable at all •  Docker Toolbox’s VM only allows mounXng from within your home directory NomadPHP EU April 2016 36
  37. 37. Container Data Volumes •  Uses a small container that does nothing but stores data •  Have our app containers use the data volume to store data •  Use ‘editor containers’ to go in and modify data when needed NomadPHP EU April 2016 37
  38. 38. Mounting Data Volumes NomadPHP EU April 2016 38
  39. 39. Mounting Data Volumes NomadPHP EU April 2016 39
  40. 40. Mounting Data Volumes NomadPHP EU April 2016 40
  41. 41. Mounting Data Volumes NomadPHP EU April 2016 41
  42. 42. Mounting Data Volumes NomadPHP EU April 2016 42
  43. 43. Mounting Data Volumes NomadPHP EU April 2016 43
  44. 44. Mounting Data Volumes NomadPHP EU April 2016 44
  45. 45. Mounting Data Volumes NomadPHP EU April 2016 45
  46. 46. Why not run SSH inside of the container? •  Well, you can… •  Docker is designed for one command per container •  If you need to modify data, then you need to change your setup •  If you have to run SSH, then you need a way to run SSH and your command NomadPHP EU April 2016 46
  47. 47. Why go through the hassle? •  Data volumes are portable •  Data volumes are safer •  Separates the app containers from data •  ProducXon can use a data volume, dev can use a host volume •  Our app containers stay small NomadPHP EU April 2016 47
  48. 48. Network Linking NomadPHP EU April 2016 48
  49. 49. Docker Links •  Allows containers to ‘see’ each other over the network •  Each container thinks the other one is just another machine •  Containers all have an internal network address, so we don’t need to expose everything through the host •  Currently only works if all the containers are on one machine, Docker 1.10 should fix that NomadPHP EU April 2016 49
  50. 50. More Traditional Setup NomadPHP EU April 2016 50 INTARWEBS Nginx PHP-FPM Data Volume Port 9000 Editor
  51. 51. Let’s Build It NomadPHP EU April 2016 51
  52. 52. Let’s Build It NomadPHP EU April 2016 52
  53. 53. Let’s Build It NomadPHP EU April 2016 53
  54. 54. Let’s Build It NomadPHP EU April 2016 54
  55. 55. Let’s Build It NomadPHP EU April 2016 55
  56. 56. Let’s Build It NomadPHP EU April 2016 56
  57. 57. More Notes! •  We can now rebuild secXons of the app as needed •  We can restart nginx without impacXng PHP •  We can extend much easier •  Linked containers will not update if they are stopped/started •  If we upgrade PHP, we have to destroy/create the web_server container again NomadPHP EU April 2016 57
  58. 58. Creating your own Images NomadPHP EU April 2016 58
  59. 59. Dockerfile •  Dockerfile is the configuraXon steps for an image •  Can be created from scratch, or based on another image •  Allows you to add files, create default volumes, ports, etc •  Can be used privately or pushed to Docker Hub NomadPHP EU April 2016 59
  60. 60. FROM phusion/baseimage:0.9.10 # … CMD ["/sbin/my_init"] # Nginx-PHP Installation RUN apt-get update RUN apt-get install -y vim git curl wget build-essential python-software-properties php5-cli php5-fpm php5-mysql php5-pgsql php5-sqlite php5-curl php5-gd php5-mcrypt php5-intl php5-imap php5-tidy mysql-client # … RUN mkdir /var/www ADD build/default /etc/nginx/sites-available/default # … EXPOSE 80 22 VOLUME /var/www VOLUME /etc/nginx VOLUME /etc/php/ VOLUME /var/log RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* NomadPHP EU April 2016 60
  61. 61. Build it docker build -t tag_name ./ •  This runs through the Dockerfile and generates the image •  We can now use the tag name to run the image NomadPHP EU April 2016 61
  62. 62. Other Helpful Commands NomadPHP EU April 2016 62
  63. 63. Inspect a container docker inspect [opXons] CONTAINER_NAME •  Returns a JSON string with data about the container •  Can also query •  docker inspect -f “{{ .NetworkSe{ngs.IPAddres }}” web_server •  Really handy for scripXng out things like reverse proxies NomadPHP EU April 2016 63
  64. 64. Work with images •  docker pull IMAGE – Pulls down an image before using •  docker images – Lists all the images that are downloaded •  docker rmi IMAGE – Deletes an image if it’s not being used NomadPHP EU April 2016 64
  65. 65. Docker Machine NomadPHP EU April 2016 65
  66. 66. What is Docker Machine? •  A provisioning tool that is used to set up a box with Docker •  Used in Docker Toolbox to create the VM •  Supports: •  EC2 •  Azure •  Digital Ocean •  Hyper-V •  OpenStack •  Virtualbox •  VMWare NomadPHP EU April 2016 66
  67. 67. Why use it? •  Makes it very easy to spin up new boxes •  Docker Machine handles all of the dirty stuff for you •  Docker Toolbox users are already using it •  Integrates with Docker Swarm •  It is not necessarily portable NomadPHP EU April 2016 67
  68. 68. Docker Swarm NomadPHP EU April 2016 68
  69. 69. What is Docker Swarm? •  Cluster management tool developed by Docker •  Looks like a machine running docker, but is actually many machines NomadPHP EU April 2016 69
  70. 70. Docker Compose NomadPHP EU April 2016 70
  71. 71. What is Docker Compose? •  MulX-container orchestraXon •  A single config file holds all of your container info •  Works with Docker Swarm and a few other tools, like Rancher NomadPHP EU April 2016 71
  72. 72. Sample docker-compose.yml phpserver: build: ./docker/php volumes: - /home/ctankersley/Projects/dockerfordevs:/var/www/ links: - mysqlserver mysqlserver: image: mysql environment: MYSQL_DATABASE: dockerfordevs MYSQL_ROOT_PASSWORD: docker volumes: - /var/lib/mysql nginx: build: ./docker/nginx ports: - "80:80" - "443:443" links: - phpserver NomadPHP EU April 2016 72
  73. 73. Deploying NomadPHP EU April 2016 73
  74. 74. I can’t answer this for you NomadPHP EU April 2016 74 ¯_(ツ)_/¯
  75. 75. Questions? NomadPHP EU April 2016 75
  76. 76. Each situation is different •  You will probably build something custom, using exisXng tools •  Do you use data volumes? •  Do you just package the enXre compiled app? •  Does it need to be distributed? •  Is it going on Swarm, or Amazon ECS? NomadPHP EU April 2016 76
  77. 77. Things to consider •  Docker Compose will only deploy an app to one server •  Docker Swarm is preJy low-level and bare-bones •  Volumes on Swarm cannot be shared across hosts •  Host mounXng is 99.99999% of the Xme not what you want to do NomadPHP EU April 2016 77
  78. 78. Rancher is a good start •  Provides a nice GUI to manage everything •  Allows volume sharing and networking across hosts •  Works with docker-compose.yml files •  These files can be supplemented with environment variables NomadPHP EU April 2016 78
  79. 79. Rancher in action NomadPHP EU April 2016 79
  80. 80. Questions? NomadPHP EU April 2016 80
  81. 81. http://ctankersley.com chris@ctankersley.com @dragonmantank https://joind.in/talk/42cba NomadPHP EU April 2016 81

×