docker for developers

78
Docker for Developers Chris Tankersley @dragonmantank Lonestar PHP 2016 Lonestar PHP 2016 1

Upload: chris-tankersley

Post on 09-Feb-2017

359 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Docker for Developers

Docker for Developers

ChrisTankersley@dragonmantankLonestarPHP2016

LonestarPHP2016 1

Page 2: Docker for Developers

Who Am I

• PHPProgrammerforover11years•  Sysadmin/DevOpsforaround9years• UsingLinuxformorethan15years• hGps://github.com/dragonmantank

• Authorof“DockerforDevelopers”• Reigning,Defending,UndisputedPHPMTGChampionoftheWorld

LonestarPHP2016 2

Page 3: Docker for Developers

Docker

LonestarPHP2016 3

Page 4: Docker for Developers

What Is Docker?

“DockerisanopenplaUormfordevelopersandsysadminstobuild,ship,andrundistributedapplicaVons.ConsisVngofDockerEngine,aportable,lightweightrunVmeandpackagingtool,andDockerHub,acloudserviceforsharingapplicaVonsandautomaVngworkflows,DockerenablesappstobequicklyassembledfromcomponentsandeliminatesthefricVonbetweendevelopment,QA,andproducVonenvironments.”

LonestarPHP2016 4

hGps://www.docker.com/whaVsdocker/

Page 5: Docker for Developers

What is it from a technical standpoint?

• DockerisawrapperaroundContainers• DockerEngineisthepackagingporVonthatbuildsandrunsthecontainers• DockerHuballowsyoutopublishimagesforotherstouse• DockerMachineisabare-metalprovisioningtool• DockerSwarmisanload-balancingdeploymenttool• DockerComposeisamulV-containerbuildsystem

LonestarPHP2016 5

Page 6: Docker for Developers

Containers

LonestarPHP2016 6

Page 7: Docker for Developers

Normal Bare-Metal Server

LonestarPHP2016 7

CPU RAM HD Network

OperaVngSystem

nginx PHP DB

Page 8: Docker for Developers

Virtual Machines

LonestarPHP2016 8

CPU RAM HD Network

OperaVngSystem

nginx PHP DB

OperaVngSystem

nginx PHP DB

OperaVngSystem

Hypervisor

Page 9: Docker for Developers

Containers

LonestarPHP2016 9

CPU RAM HD Network

OperaVngSystem

nginxnginx PHP DB PHP DB

Page 10: Docker for Developers

Docker can use many different containers

•  Since0.9.0itsupports:•  LXC(LinuxContainers)–StartedwithLXCwhenitwasreleased•  OpenVZ•  Systemd-nspawn•  libvert-sandbox•  Qemu/kvm•  BSDJails•  SolarisZones•  chroot

LonestarPHP2016 10

Page 11: Docker for Developers

Runs on *nix and Windows Hyper-V

• NonaVvecontainerdriversforOSX*• AmazonhasElasVcContainerService,andMicrosokAzurehasAzureContainerService

LonestarPHP2016 11

Page 12: Docker for Developers

Sorry OSX Users

• DockersupportisofficiallymaintainedthroughDockerToolbox

LonestarPHP2016 12

Page 13: Docker for Developers

Docker Toolbox also is for Windows

LonestarPHP2016 13

Page 14: Docker for Developers

Let’s use Docker

LonestarPHP2016 14

Page 15: Docker for Developers

Running a container

•  `dockerrun`willrunacontainer•  ThiswillnotrestartanexisVngcontainer,justcreateanewone• dockerrun[opVons]IMAGE[command][arguments]

•  [opVons]modifythedockerprocessforthiscontainer•  IMAGEistheimagetouse•  [command]isthecommandtoruninsidethecontainer•  [arguments]areargumentsforthecommand

LonestarPHP2016 15

Page 16: Docker for Developers

Running a simple shell

LonestarPHP2016 16

Page 17: Docker for Developers

Running Two Webservers

LonestarPHP2016 17

Page 18: Docker for Developers

Some Notes

• Allthreecontainersare100%selfcontained• Dockercontainerssharecommonancestors,butkeeptheirownfiles•  `dockerrun`parameters:

•  --rm–Destroyacontaineronceitexits•  -d–Runinthebackground(daemonmode)•  -i–RunininteracVvemode•  --name–Givethecontaineraname•  -p[localport]:[containerport]–Forwardthelocalporttothecontainerport

LonestarPHP2016 18

Page 19: Docker for Developers

Volumes

LonestarPHP2016 19

Page 20: Docker for Developers

Modifying a running container

•  `dockerexec`canrunacommandinsideofanexisVngcontainer• UseVolumestosharedata

LonestarPHP2016 20

Page 21: Docker for Developers

Persistent Data with Volumes

•  Youcandesignateavolumewith-v• Volumescanbesharedamongstcontainers• Volumescanmountdatafromthehostsystem

LonestarPHP2016 21

Page 22: Docker for Developers

Mounting from the host machine

LonestarPHP2016 22

Page 23: Docker for Developers

Mounting from the host isn’t perfect

•  Thecontainernowhasawindowintoyourhostmachine• Permissionscangetscrewyifyouaremodifyinginthecontainer

•  Mostthingsitcreateswillberootbydefault,andyouprobablyaren’trootonthehostmachine

• Host-mountedvolumesarenotportableatall• DockerToolbox’sVMonlyallowsmounVngfromwithinyourhomedirectory

LonestarPHP2016 23

Page 24: Docker for Developers

Container Data Volumes

• Usesasmallcontainerthatdoesnothingbutstoresdata• Haveourappcontainersusethedatavolumetostoredata• Use‘editorcontainers’togoinandmodifydatawhenneeded

LonestarPHP2016 24

Page 25: Docker for Developers

Mounting Data Volumes

LonestarPHP2016 25

Page 26: Docker for Developers

Why not run SSH inside of the container?

• Well,youcan…• Dockerisdesignedforonecommandpercontainer•  Ifyouneedtomodifydata,thenyouneedtochangeyoursetup•  IfyouhavetorunSSH,thenyouneedawaytorunSSHandyourcommand

LonestarPHP2016 26

Page 27: Docker for Developers

Why go through the hassle?

• Datavolumesareportable• Datavolumesaresafer•  Separatestheappcontainersfromdata

•  ProducVoncanuseadatavolume,devcanuseahostvolume

• Ourappcontainersstaysmall

LonestarPHP2016 27

Page 28: Docker for Developers

Network Linking

LonestarPHP2016 28

Page 29: Docker for Developers

Docker Links

• Allowscontainersto‘see’eachotheroverthenetwork•  Eachcontainerthinkstheotheroneisjustanothermachine• Containersallhaveaninternalnetworkaddress,sowedon’tneedtoexposeeverythingthroughthehost• Currentlyonlyworksifallthecontainersareononemachine,Docker1.10shouldfixthat

LonestarPHP2016 29

Page 30: Docker for Developers

More Traditional Setup

LonestarPHP2016 30

INTARWEBS Nginx PHP-FPM

DataVolume

Port9000

Editor

Page 31: Docker for Developers

Let’s Build It

LonestarPHP2016 31

Page 32: Docker for Developers

More Notes!

• WecannowrebuildsecVonsoftheappasneeded• WecanrestartnginxwithoutimpacVngPHP• Wecanextendmucheasier

•  Linkedcontainerswillnotupdateiftheyarestopped/started•  IfweupgradePHP,wehavetodestroy/createtheweb_servercontaineragain

LonestarPHP2016 32

Page 33: Docker for Developers

Creating your own Images

LonestarPHP2016 33

Page 34: Docker for Developers

Dockerfile

• DockerfileistheconfiguraVonstepsforanimage• Canbecreatedfromscratch,orbasedonanotherimage• Allowsyoutoaddfiles,createdefaultvolumes,ports,etc• CanbeusedprivatelyorpushedtoDockerHub

LonestarPHP2016 34

Page 35: Docker for Developers

FROMphusion/baseimage:0.9.10#…CMD["/sbin/my_init"]#Nginx-PHPInstallationRUNapt-getupdateRUNapt-getinstall-yvimgitcurlwgetbuild-essentialpython-software-properties\

php5-cliphp5-fpmphp5-mysqlphp5-pgsqlphp5-sqlitephp5-curl\ php5-gdphp5-mcryptphp5-intlphp5-imapphp5-tidymysql-client

#…RUNmkdir/var/wwwADDbuild/default/etc/nginx/sites-available/default#…EXPOSE8022VOLUME/var/wwwVOLUME/etc/nginxVOLUME/etc/php/VOLUME/var/logRUNapt-getclean&&rm-rf/var/lib/apt/lists/*/tmp/*/var/tmp/*

LonestarPHP2016 35

Page 36: Docker for Developers

Build it

dockerbuild-ttag_name./

•  ThisrunsthroughtheDockerfileandgeneratestheimage• Wecannowusethetagnametoruntheimage

LonestarPHP2016 36

Page 37: Docker for Developers

Other Helpful Commands

LonestarPHP2016 37

Page 38: Docker for Developers

Inspect a container

dockerinspect[opVons]CONTAINER_NAME

• ReturnsaJSONstringwithdataaboutthecontainer• Canalsoquery

•  dockerinspect-f“{{.NetworkSe{ngs.IPAddres}}”web_server

• ReallyhandyforscripVngoutthingslikereverseproxies

LonestarPHP2016 38

Page 39: Docker for Developers

Work with images

• dockerpullIMAGE–Pullsdownanimagebeforeusing• dockerimages–Listsalltheimagesthataredownloaded• dockerrmiIMAGE–Deletesanimageifit’snotbeingused

LonestarPHP2016 39

Page 40: Docker for Developers

Docker Machine

LonestarPHP2016 40

Page 41: Docker for Developers

What is Docker Machine?

• AprovisioningtoolthatisusedtosetupaboxwithDocker• UsedinDockerToolboxtocreatetheVM•  Supports:

•  EC2•  Azure•  DigitalOcean•  Hyper-V•  OpenStack•  Virtualbox•  VMWare

LonestarPHP2016 41

Page 42: Docker for Developers

Creating a new machine

LonestarPHP2016 42

Page 43: Docker for Developers

Why use it?

• Makesitveryeasytospinupnewboxes• DockerMachinehandlesallofthedirtystuffforyou• DockerToolboxusersarealreadyusingit•  IntegrateswithDockerSwarm

•  Itisnotnecessarilyportable

LonestarPHP2016 43

Page 44: Docker for Developers

Docker Swarm

LonestarPHP2016 44

Page 45: Docker for Developers

What is Docker Swarm?

• ClustermanagementtooldevelopedbyDocker•  Lookslikeamachinerunningdocker,butisactuallymanymachines

LonestarPHP2016 45

Page 46: Docker for Developers

Create a Swarm token

$dockerrun--rmswarmcreate2//...340122bb69c98825b4ac7094c87a07e21

LonestarPHP2016 46

Page 47: Docker for Developers

Create a Swarm Master

$docker-machinecreate-dvirtualbox\--swarm\--swarm-master\--swarm-discoverytoken://40122bb69c98825b4ac7094c87a07e21\swarm-master

LonestarPHP2016 47

Page 48: Docker for Developers

Add nodes to the swarm

docker-machinecreate-dvirtualbox\--swarm\--swarm-discoverytoken://40122bb69c98825b4ac7094c87a07e21\swarm-node-1docker-machinecreate-dvirtualbox\--swarm\--swarm-discoverytoken://40122bb69c98825b4ac7094c87a07e21\swarm-node-2

LonestarPHP2016 48

Page 49: Docker for Developers

Switch to the master

eval$(docker-machineenv--swarmswarm-master)

LonestarPHP2016 49

Page 50: Docker for Developers

Add some containers

LonestarPHP2016 50

Page 51: Docker for Developers

Docker Compose

LonestarPHP2016 51

Page 52: Docker for Developers

What is Docker Compose?

• MulV-containerorchestraVon• Asingleconfigfileholdsallofyourcontainerinfo• WorkswithDockerSwarmandafewothertools,likeRancher

LonestarPHP2016 52

Page 53: Docker for Developers

Sample docker-compose.yml phpserver:build:./docker/phpvolumes:-/home/ctankersley/Projects/dockerfordevs:/var/www/links:-mysqlservermysqlserver:image:mysqlenvironment:MYSQL_DATABASE:dockerfordevsMYSQL_ROOT_PASSWORD:dockervolumes:-/var/lib/mysqlnginx:build:./docker/nginxports:-"80:80"-"443:443"links:-phpserver

LonestarPHP2016 53

Page 54: Docker for Developers

Docker Compose in Action

LonestarPHP2016 54

Page 55: Docker for Developers

Let’s build an application

LonestarPHP2016 55

Page 56: Docker for Developers

The Goal

• AthreecontainerapplicaVonwithnginx,php,andmysql• ApplicaVonwillreadandwritetothedatabase• CandeploytoaproducVonmachine

LonestarPHP2016 56

Page 57: Docker for Developers

Folder Structure

LonestarPHP2016 57

Page 58: Docker for Developers

A basic docker-compose.yml

phpserver:image:php:7-fpmvolumes:-./application:/var/www/nginx:image:nginxports:-"80:80"-"443:443"volumes:-./nginx:/etc/nginx/conf.d/links:-phpserver

LonestarPHP2016 58

Page 59: Docker for Developers

nginx/nginx.conf server{listen80;root/var/www/html;indexindex.htmlindex.htmindex.php;access_log/dev/stdout;error_log/dev/stderr;location/{try_files$uri$uri//index.html/index.php?$query_string;}location~\.php${fastcgi_split_path_info^(.+\.php)(/.+)$;fastcgi_passphpserver:9000;fastcgi_paramSCRIPT_FILENAME$document_root$fastcgi_script_name;includefastcgi_params;}}

LonestarPHP2016 59

Page 60: Docker for Developers

Hello World

<?phpecho"HelloWorld";

LonestarPHP2016 60

Page 61: Docker for Developers

Bringing it to life

LonestarPHP2016 61

Page 62: Docker for Developers

Adding in MySQL

phpserver:image:php:7-fpmvolumes:-./application:/var/www/links:-mysqlservermysqlserver:image:mysqlenvironment:MYSQL_DATABASE:dockerfordevsMYSQL_ROOT_PASSWORD:dockervolumes:-/var/lib/mysql

LonestarPHP2016 62

Page 63: Docker for Developers

Docker Compose changes aren’t automatic •  Youwillneedtostop,thenbringthesystemagain

•  docker-composestop•  docker-composeup

• DockerComposewillgenerallyonlyrestartboxesthathaveconfigchanges• DockerComposewillnotautomaVcallyfixlinks

LonestarPHP2016 63

Page 64: Docker for Developers

Connecting to the database <?php$hostname='mysqlserver';$database='dockerfordevs';$user='root';$password='docker';$dbh=newPDO('mysql:host='.$hostname.';dbname='.$database.'',$user,$password);echo'HelloWorld';

LonestarPHP2016 64

Page 65: Docker for Developers

Testing it

LonestarPHP2016 65

Page 66: Docker for Developers

Why didn’t it work?

• DefaultPHPimagesshipwithbarelyanyextensionsenabledbydefault• WewillneedacustomPHPImage

LonestarPHP2016 66

Page 67: Docker for Developers

Update our docker-compose.yml

phpserver:build:./docker/phpvolumes:-./application:/var/www/links:-mysqlserver

LonestarPHP2016 67

Page 68: Docker for Developers

Custom Docker File

FROMphp:7-fpm#InstallmodulesRUNapt-getupdate&&apt-getinstall-y\libmcrypt-dev\&&docker-php-ext-installpdo\&&docker-php-ext-installpdo_mysqlCMD["php-fpm"]

LonestarPHP2016 68

Page 69: Docker for Developers

Let’s try that again

LonestarPHP2016 69

Page 70: Docker for Developers

Deploying

LonestarPHP2016 70

Page 71: Docker for Developers

I can’t answer this for you

LonestarPHP2016 71

¯\_(ツ)_/¯

Page 72: Docker for Developers

Questions?

LonestarPHP2016 72

Page 73: Docker for Developers

Each situation is different

•  Youwillprobablybuildsomethingcustom,usingexisVngtools• Doyouusedatavolumes?• DoyoujustpackagetheenVrecompiledapp?• Doesitneedtobedistributed?•  IsitgoingonSwarm,orAmazonECS?

LonestarPHP2016 73

Page 74: Docker for Developers

Things to consider

• DockerComposewillonlydeployanapptooneserver• DockerSwarmispreGylow-levelandbare-bones• VolumesonSwarmcannotbesharedacrosshosts• HostmounVngis99.99999%oftheVmenotwhatyouwanttodo

LonestarPHP2016 74

Page 75: Docker for Developers

Rancher is a good start

• ProvidesaniceGUItomanageeverything• Allowsvolumesharingandnetworkingacrosshosts• Workswithdocker-compose.ymlfiles

•  Thesefilescanbesupplementedwithenvironmentvariables

LonestarPHP2016 75

Page 76: Docker for Developers

Rancher in action

LonestarPHP2016 76

Page 77: Docker for Developers

Questions?

LonestarPHP2016 77

Page 78: Docker for Developers

http://ctankersley.com [email protected]

@dragonmantank

https://joind.in/talk/2d8b6

LonestarPHP2016 78