dockerizing php apps - aurelijus banelis · how to dockerize introduction development production...

60
Aurelijus Banelis Dockerizing PHP Apps ŠiauliaiPHP 2019-01-31

Upload: others

Post on 26-Sep-2020

5 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Dockerizing PHP Apps - Aurelijus Banelis · How to dockerize Introduction Development Production Context/Alternatives What I really liked What I do not like Deploying to AWS Logging

Aurelijus Banelis

Dockerizing PHP Apps

ŠiauliaiPHP2019-01-31

Page 3: Dockerizing PHP Apps - Aurelijus Banelis · How to dockerize Introduction Development Production Context/Alternatives What I really liked What I do not like Deploying to AWS Logging

AdaptingPHP applicationsto be used with

docker

Page 4: Dockerizing PHP Apps - Aurelijus Banelis · How to dockerize Introduction Development Production Context/Alternatives What I really liked What I do not like Deploying to AWS Logging

Why to dockerizeWhat is dockerHow to dockerize

Introduction

Development

Production

Context/AlternativesWhat I really likedWhat I do not like

Deploying to AWSLogging challenges

Page 5: Dockerizing PHP Apps - Aurelijus Banelis · How to dockerize Introduction Development Production Context/Alternatives What I really liked What I do not like Deploying to AWS Logging

Why to dockerizeWhat is dockerHow to dockerize

Introduction

Development

Production

Context/AlternativesWhat I really likedWhat I do not like

Deploying to AWSLogging challenges

Page 6: Dockerizing PHP Apps - Aurelijus Banelis · How to dockerize Introduction Development Production Context/Alternatives What I really liked What I do not like Deploying to AWS Logging

Development bottleneck

Confidence/tooling bottleneck

Provisioning speed bottleneck

Illustration: https://home24.tech.blog/2018/05/28/home24-presenting-at-tableau-cinema-tour/

Page 7: Dockerizing PHP Apps - Aurelijus Banelis · How to dockerize Introduction Development Production Context/Alternatives What I really liked What I do not like Deploying to AWS Logging

Monolith (VirtualBox) → SplitDevelopment bottleneck

Confidence/tooling bottleneck

Provisioning speed bottleneck

Page 8: Dockerizing PHP Apps - Aurelijus Banelis · How to dockerize Introduction Development Production Context/Alternatives What I really liked What I do not like Deploying to AWS Logging

Development bottleneck

Jenkins (time based) → CircleCIConfidence/tooling bottleneck

Provisioning speed bottleneck

Page 9: Dockerizing PHP Apps - Aurelijus Banelis · How to dockerize Introduction Development Production Context/Alternatives What I really liked What I do not like Deploying to AWS Logging

Development bottleneck

Confidence/tooling bottleneck

Release coordination → AWS servicesProvisioning speed bottleneck

Page 10: Dockerizing PHP Apps - Aurelijus Banelis · How to dockerize Introduction Development Production Context/Alternatives What I really liked What I do not like Deploying to AWS Logging

Monolith (VirtualBox) → SplitDevelopment bottleneck

Jenkins (time based) → CircleCIConfidence/tooling bottleneck

Release coordination → AWS servicesProvisioning speed bottleneck

Bottleneck to grow

Page 11: Dockerizing PHP Apps - Aurelijus Banelis · How to dockerize Introduction Development Production Context/Alternatives What I really liked What I do not like Deploying to AWS Logging

Monolith (VirtualBox) → SplitDevelopment bottleneck

Jenkins (time based) → CircleCIConfidence/tooling bottleneck

Release coordination → AWS servicesProvisioning speed bottleneck

The need for better virtualization tools

Page 12: Dockerizing PHP Apps - Aurelijus Banelis · How to dockerize Introduction Development Production Context/Alternatives What I really liked What I do not like Deploying to AWS Logging

Monolith (VirtualBox) → SplitDevelopment bottleneck

Jenkins (time based) → CircleCIConfidence/tooling bottleneck

Release coordination → AWS servicesProvisioning speed bottleneck

The need for better virtualization tools

docker?

Page 13: Dockerizing PHP Apps - Aurelijus Banelis · How to dockerize Introduction Development Production Context/Alternatives What I really liked What I do not like Deploying to AWS Logging

We migrated to dockerUsing docker extensively at

Page 14: Dockerizing PHP Apps - Aurelijus Banelis · How to dockerize Introduction Development Production Context/Alternatives What I really liked What I do not like Deploying to AWS Logging

We migrated to dockerUsing docker extensively at

I would do the same againRight decision for current scaleFuture opportunities

Page 15: Dockerizing PHP Apps - Aurelijus Banelis · How to dockerize Introduction Development Production Context/Alternatives What I really liked What I do not like Deploying to AWS Logging

Why to dockerizeWhat is dockerHow to dockerize

Introduction

Development

Production

Context/AlternativesWhat I really likedWhat I do not like

Deploying to AWSLogging challenges

Page 16: Dockerizing PHP Apps - Aurelijus Banelis · How to dockerize Introduction Development Production Context/Alternatives What I really liked What I do not like Deploying to AWS Logging

Tool to run in isolated environmentMany ifs in kernel = cgroupsNot VirtualBox, not unikernel

Open source tool backed by Docker IncContainer hosting and premium serviceImproved by community (AWS, K8s)

Page 17: Dockerizing PHP Apps - Aurelijus Banelis · How to dockerize Introduction Development Production Context/Alternatives What I really liked What I do not like Deploying to AWS Logging

Why to dockerizeWhat is dockerHow to dockerize

Introduction

Development

Production

Context/AlternativesWhat I really likedWhat I do not like

Deploying to AWSLogging challenges

Page 18: Dockerizing PHP Apps - Aurelijus Banelis · How to dockerize Introduction Development Production Context/Alternatives What I really liked What I do not like Deploying to AWS Logging
Page 19: Dockerizing PHP Apps - Aurelijus Banelis · How to dockerize Introduction Development Production Context/Alternatives What I really liked What I do not like Deploying to AWS Logging
Page 20: Dockerizing PHP Apps - Aurelijus Banelis · How to dockerize Introduction Development Production Context/Alternatives What I really liked What I do not like Deploying to AWS Logging

docker build . -t siauliaiphp-exampledocker run -p 8080:80 siauliaiphp-example

Page 21: Dockerizing PHP Apps - Aurelijus Banelis · How to dockerize Introduction Development Production Context/Alternatives What I really liked What I do not like Deploying to AWS Logging

https://gist.github.com/aurelijusb/6f6b1c86c440ce527250193ffcae62d7

docker build . -t siauliaiphp-exampledocker run -p 8080:80 siauliaiphp-example

Page 22: Dockerizing PHP Apps - Aurelijus Banelis · How to dockerize Introduction Development Production Context/Alternatives What I really liked What I do not like Deploying to AWS Logging

https://gist.github.com/aurelijusb/6f6b1c86c440ce527250193ffcae62d7

docker build . -t siauliaiphp-exampledocker run -p 8080:80 siauliaiphp-exampleSimple?

Page 23: Dockerizing PHP Apps - Aurelijus Banelis · How to dockerize Introduction Development Production Context/Alternatives What I really liked What I do not like Deploying to AWS Logging

https://gist.github.com/aurelijusb/6f6b1c86c440ce527250193ffcae62d7

docker build . -t siauliaiphp-exampledocker run -p 8080:80 siauliaiphp-exampleSimple?But for simple cases

Page 24: Dockerizing PHP Apps - Aurelijus Banelis · How to dockerize Introduction Development Production Context/Alternatives What I really liked What I do not like Deploying to AWS Logging

Multiple containers

Development tools

PHP extensions

xDebug support

...https://github.com/nfqakademija/docker/blob/master/php/Dockerfile

Page 25: Dockerizing PHP Apps - Aurelijus Banelis · How to dockerize Introduction Development Production Context/Alternatives What I really liked What I do not like Deploying to AWS Logging

Multiple containers

Development tools

PHP extensions

xDebug support

...https://github.com/nfqakademija/docker/blob/master/php/Dockerfile

More configuration

Page 26: Dockerizing PHP Apps - Aurelijus Banelis · How to dockerize Introduction Development Production Context/Alternatives What I really liked What I do not like Deploying to AWS Logging

Multiple containers

Development tools

PHP extensions

xDebug support

...https://github.com/nfqakademija/docker/blob/master/php/Dockerfile

More configurationBut infrastructure

as a code

Page 28: Dockerizing PHP Apps - Aurelijus Banelis · How to dockerize Introduction Development Production Context/Alternatives What I really liked What I do not like Deploying to AWS Logging

Multiple containers

Development tools

PHP extensions

xDebug support

...https://github.com/nfqakademija/docker/blob/master/php/Dockerfile

Docker wayLogging stdout/stderrConfiguration via ENV

Kill-it-not-heal-it….

Page 29: Dockerizing PHP Apps - Aurelijus Banelis · How to dockerize Introduction Development Production Context/Alternatives What I really liked What I do not like Deploying to AWS Logging

Why to dockerizeWhat is dockerHow to dockerize

Introduction

Development

Production

Context/AlternativesWhat I really likedWhat I do not like

Deploying to AWSLogging challenges

Page 30: Dockerizing PHP Apps - Aurelijus Banelis · How to dockerize Introduction Development Production Context/Alternatives What I really liked What I do not like Deploying to AWS Logging

Why to dockerizeWhat is dockerHow to dockerize

Introduction

Development

Production

Context/AlternativesWhat I really likedWhat I do not like

Deploying to AWSLogging challenges

Page 31: Dockerizing PHP Apps - Aurelijus Banelis · How to dockerize Introduction Development Production Context/Alternatives What I really liked What I do not like Deploying to AWS Logging

Docker Featuretoggle

IDE in cloud

Run & pray

Virtual box

Not many alternativesFor isolated environments

Page 32: Dockerizing PHP Apps - Aurelijus Banelis · How to dockerize Introduction Development Production Context/Alternatives What I really liked What I do not like Deploying to AWS Logging

Why to dockerizeWhat is dockerHow to dockerize

Introduction

Development

Production

Context/AlternativesWhat I really likedWhat I do not like

Deploying to AWSLogging challenges

Page 33: Dockerizing PHP Apps - Aurelijus Banelis · How to dockerize Introduction Development Production Context/Alternatives What I really liked What I do not like Deploying to AWS Logging

Person

Team

Community

Page 34: Dockerizing PHP Apps - Aurelijus Banelis · How to dockerize Introduction Development Production Context/Alternatives What I really liked What I do not like Deploying to AWS Logging

Sandboxed development environmentHigh quality mocks (real MySql, wireshark)True integration/acceptance testsDockerfile→docker-compose→custom tooling

Experimenting with new software saferNo trash, no sensitive informationEasy to swap (DynamoDB local vs dynalite)Install/compile on your machine? Seriously?

Page 35: Dockerizing PHP Apps - Aurelijus Banelis · How to dockerize Introduction Development Production Context/Alternatives What I really liked What I do not like Deploying to AWS Logging
Page 36: Dockerizing PHP Apps - Aurelijus Banelis · How to dockerize Introduction Development Production Context/Alternatives What I really liked What I do not like Deploying to AWS Logging

Switching between branches/tasksLess issues with cache invalidationKill-it-not-heal-itData volumes = test data in branch

Infrastructure as a codeFixed versions, fixed php.ini+extensionsLess “works on my machine” = reproducibleMany bash scripts, configuration via ENV

Page 38: Dockerizing PHP Apps - Aurelijus Banelis · How to dockerize Introduction Development Production Context/Alternatives What I really liked What I do not like Deploying to AWS Logging

Huge ecosystemPioniers are using and improvingAmazon, Google (K8s) is investingKnown issues and solutions in StackOverflow

Page 39: Dockerizing PHP Apps - Aurelijus Banelis · How to dockerize Introduction Development Production Context/Alternatives What I really liked What I do not like Deploying to AWS Logging

Why to dockerizeWhat is dockerHow to dockerize

Introduction

Development

Production

Context/AlternativesWhat I really likedWhat I do not like

Deploying to AWSLogging challenges

Page 40: Dockerizing PHP Apps - Aurelijus Banelis · How to dockerize Introduction Development Production Context/Alternatives What I really liked What I do not like Deploying to AWS Logging

High learning curve = blame dockerMisuse of the tool – isn’t docker silver bullet?Docker wraps – everyone blames the wrapperMany ways to install docker incorrectlyMounting vs copy-on-write operationNo Windows, more tooling/docs around

Page 41: Dockerizing PHP Apps - Aurelijus Banelis · How to dockerize Introduction Development Production Context/Alternatives What I really liked What I do not like Deploying to AWS Logging
Page 42: Dockerizing PHP Apps - Aurelijus Banelis · How to dockerize Introduction Development Production Context/Alternatives What I really liked What I do not like Deploying to AWS Logging

Not mature tooling / edge casesDownload private dependency: github token?Password protected SSH key? (Mac+Linux)CircleCI limited “remote docker”Host IP for xDebugEven more bash scripts/docs

Page 43: Dockerizing PHP Apps - Aurelijus Banelis · How to dockerize Introduction Development Production Context/Alternatives What I really liked What I do not like Deploying to AWS Logging
Page 44: Dockerizing PHP Apps - Aurelijus Banelis · How to dockerize Introduction Development Production Context/Alternatives What I really liked What I do not like Deploying to AWS Logging

Cache everything by designFull HDD because of docker imagesMissing log rotation (no “log-opts” by default)“Latest” tag, that is not immutableNetwork unreachable, since used by dockerDocker-clean sh, docker pull, RTFM

Page 45: Dockerizing PHP Apps - Aurelijus Banelis · How to dockerize Introduction Development Production Context/Alternatives What I really liked What I do not like Deploying to AWS Logging

Why to dockerizeWhat is dockerHow to dockerize

Introduction

Development

Production

Context/AlternativesWhat I really likedWhat I do not like

Deploying to AWSLogging challenges

Page 46: Dockerizing PHP Apps - Aurelijus Banelis · How to dockerize Introduction Development Production Context/Alternatives What I really liked What I do not like Deploying to AWS Logging

Why to dockerizeWhat is dockerHow to dockerize

Introduction

Development

Production

Context/AlternativesWhat I really likedWhat I do not like

Deploying to AWSLogging challenges

Page 47: Dockerizing PHP Apps - Aurelijus Banelis · How to dockerize Introduction Development Production Context/Alternatives What I really liked What I do not like Deploying to AWS Logging

○ ECS (not yet K8s, AWS backed infrastructure/improvements, canary deployment by default)

○ ECR – uptime for downloads. Docker hub for development○ Task definition = docker-compose.yml○ PHP+Apache = PHP+Nginx (no big difference)○ Custom tooling for credentials via environment○ Spot-instances (currently for staging, targeting production)

PHP + Docker in productionMigrated Tier1 service – nobody noticed

AWS ECS PHP 7.2

Docker Apache

Page 48: Dockerizing PHP Apps - Aurelijus Banelis · How to dockerize Introduction Development Production Context/Alternatives What I really liked What I do not like Deploying to AWS Logging

○ ECS (not yet K8s, AWS backed infrastructure/improvements, canary deployment by default)

○ ECR – uptime for downloads. Docker hub for development○ Task definition = docker-compose.yml○ PHP+Apache = PHP+Nginx (no big difference)○ Custom tooling for credentials via environment○ Spot-instances (currently for staging, targeting production)

PHP + Docker in productionMigrated Tier1 service – nobody noticed

AWS ECS PHP 7.2

Docker Apache

Page 49: Dockerizing PHP Apps - Aurelijus Banelis · How to dockerize Introduction Development Production Context/Alternatives What I really liked What I do not like Deploying to AWS Logging

Amazon Web ServicesElastic Container ServiceAWS integration (E.g. spot-instances)K8s on AWS then was not matureKnow-how (our Go apps in prod)

Page 50: Dockerizing PHP Apps - Aurelijus Banelis · How to dockerize Introduction Development Production Context/Alternatives What I really liked What I do not like Deploying to AWS Logging

Amazon Web ServicesElastic Container ServiceAWS integration (E.g. spot-instances)K8s on AWS then was not matureKnow-how (our Go apps in prod)

Naming in AWSDocker-compose → Task definitionContainer → TaskDocker Hub → ECR

Page 51: Dockerizing PHP Apps - Aurelijus Banelis · How to dockerize Introduction Development Production Context/Alternatives What I really liked What I do not like Deploying to AWS Logging

Apache mod_phpPHP 7.2 log trimming in Nginx+FPMSingle process container – easierNo visible performance impactInternal service (no slow loris attack)

Page 52: Dockerizing PHP Apps - Aurelijus Banelis · How to dockerize Introduction Development Production Context/Alternatives What I really liked What I do not like Deploying to AWS Logging

Why to dockerizeWhat is dockerHow to dockerize

Introduction

Development

Production

Context/AlternativesWhat I really likedWhat I do not like

Deploying to AWSLogging challenges

Page 53: Dockerizing PHP Apps - Aurelijus Banelis · How to dockerize Introduction Development Production Context/Alternatives What I really liked What I do not like Deploying to AWS Logging

Replica Daemon External

ECS Service types

Page 54: Dockerizing PHP Apps - Aurelijus Banelis · How to dockerize Introduction Development Production Context/Alternatives What I really liked What I do not like Deploying to AWS Logging

Daemon

Page 55: Dockerizing PHP Apps - Aurelijus Banelis · How to dockerize Introduction Development Production Context/Alternatives What I really liked What I do not like Deploying to AWS Logging

LogConfiguration: LogDriver: fluentd Options: fluentd-async-connect: "true" fluentd-buffer-limit: "32MB" mode: "non-blocking"

Daemon

Page 57: Dockerizing PHP Apps - Aurelijus Banelis · How to dockerize Introduction Development Production Context/Alternatives What I really liked What I do not like Deploying to AWS Logging

Why to dockerizeWhat is dockerHow to dockerize

Introduction

Development

Production

Context/AlternativesWhat I really likedWhat I do not like

Deploying to AWSLogging challenges

Page 58: Dockerizing PHP Apps - Aurelijus Banelis · How to dockerize Introduction Development Production Context/Alternatives What I really liked What I do not like Deploying to AWS Logging

DockerFeaturetoggle

IDE in cloud

Run & pray

Virtual box

Docker:Good to understand

Use on demand

Page 59: Dockerizing PHP Apps - Aurelijus Banelis · How to dockerize Introduction Development Production Context/Alternatives What I really liked What I do not like Deploying to AWS Logging

Aurelijus Banelis

Dockerizing PHP Apps

ŠiauliaiPHP2019-01-31

Thank youQuestions?

Page 60: Dockerizing PHP Apps - Aurelijus Banelis · How to dockerize Introduction Development Production Context/Alternatives What I really liked What I do not like Deploying to AWS Logging

Further reading/references● https://www.docker.com/● https://hub.docker.com/ ● https://aws.amazon.com/ecs/● https://aws.amazon.com/ecr/ ● https://fluentbit.io/● https://www.home24.de/ ● https://home24.tech.blog/category/aws/● https://aws.amazon.com/blogs/opensource/network-load-balancer-support-in-kubernetes-1-9/ ● https://docs.aws.amazon.com/AmazonECS/latest/developerguide/docker-volumes.html ● https://d1.awsstatic.com/whitepapers/microservices-on-aws.pdf ● https://justi.cz/security/2019/01/22/apt-rce.html ● https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-input-syslog.html ● https://d1.awsstatic.com/whitepapers/DevOps/running-containerized-microservices-on-aws.pdf