SlideShare a Scribd company logo
1 of 68
Download to read offline
Running your
Dockerized application(s)
on AWS EC2 Container Service
Marco Pas
Philips Lighting
Software geek, hands on
Developer/Architect/DevOps Engineer
@marcopas
Some stuff about me...
● Mostly doing cloud related stuff
○ Java, Groovy, Scala, Spring Boot, IOT, AWS, Terraform, Infrastructure
● Enjoying the good things
● Chef leuke dingen doen == “trying out cool and new stuff”
● Currently involved in a big IOT project
● Wannabe chef, movie & Netflix addict
..Quick Inventory..
From Personal Container Management to ...
Something that runs into production
● Docker
● Security
● Service Discovery
● Logging & Monitoring
● Rolling Deployments
● Networking
● Supervision
● Container hosting
● Docker
Development Production
Learning
cliff
Using Docker Compose != Running production
Agenda
● Containers
● Creating a Container using Spring Boot
● Container Services
● Amazon EC2 Container Service (ECS)
○ Pushing and Pulling containers
○ Deploying containers
○ Scaling your containers
○ Service Discovery
○ Logging
○ Monitoring
Containers
● OS Virtualization
● Process Isolation
● Automation
● Images
What are containers
Portable
Flexible
Fast
Efficient
Creating a Docker Image
# Dockerfile ~ example
FROM alpine:latest
ADD HelloWorld.class HelloWorld.class
RUN apk --update add openjdk8-jre
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "HelloWorld"]
docker build -t <your imagename>:<tag> .
From Docker Image to a Docker Container
Creating a Container
using Spring Boot
// file: DemoApplication.java
package springboot.docker.helloworld;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); }
@RequestMapping("/")
String home() {
return "Hello World!"; → say hello :)
}
}
// file: build.gradle ~ some code intentionally removed
dependencies {
compile('org.springframework.boot:spring-boot-starter-web')
compile('org.springframework.boot:spring-boot-starter-actuator') → add spring boot actuator
testCompile('org.springframework.boot:spring-boot-starter-test')
}
String dockerImageName = "spring-boot-docker-helloworld" → set the image name
task buildDockerImage(type:Exec) { → task to create an image
group = 'docker'
description = 'Build a docker image'
commandLine 'docker', 'build', '-f', 'build/docker/Dockerfile', '-t', "${dockerImageName}", 'build/docker'
doFirst {
println ">> Creating image: ${dockerImageName}"
// some code intentionally removed
}
}
// file: build.gradle ~ some code intentionally removed
doFirst {
println ">> Creating image: ${dockerImageName}"
copy {
// copy files to build location, Dockerfile - Jar file
}
copy {
// process Dockerfile to replace labels (Dockerfile label: @name@, @version@, @build-date@, …
// copy files to build location, Dockerfile - Jar file
from('src/main/docker/') {
include 'Dockerfile'
filter(ReplaceTokens, tokens: [
'version': version,
'build-date': new Date().format("yyyy-MM-dd'T'HH:mm:ss'Z'", TimeZone.getTimeZone("UTC")),
'git-branch': gitBranch(),
'git-commit': gitCommitHash()
])
}
file("build/docker/app/${jar.archiveName}").renameTo("build/docker/app/application.jar")
}
// file: Dockerfile example ~ some code intentionally removed
FROM java:8u66-jdk
LABEL com.acme.build-date="@build-date@" → provide data to the Dockerfile
EXPOSE 8080 → expose port 8080, so the host can map this port
# Create app that holds the application.jar file
RUN mkdir -p /app → do some housekeeping, creating directories
WORKDIR /app
COPY /app/application.jar application.jar → copy the application.jar file into the container
COPY /app/docker-entrypoint.sh docker-entrypoint.sh → copy startup script into the container
# Set file permissions
RUN chmod +x docker-entrypoint.sh → make the shel script executable
# Set start script as default command
CMD ["./docker-entrypoint.sh"] → execute the startup script when we start the container
// file: build.gradle
project.ext.dockerRegistry = System.env.DOCKER_REGISTRY → get the docker registry from environment
String dockerImageName = "spring-boot-docker-helloworld" → set the image name
task pushDockerImage(type: Exec) {
group = 'docker'
description = 'Push a docker image'
commandLine 'docker', 'push', "${project.ext.dockerRegistry}/${dockerImageName}"
doFirst {
println ">> Checking dockerRepository"
if (!project.ext.dockerRegistry) {
throw new GradleException("Unable to push image, please provide correct 'dockerRegistry'")
}
println ">> Pushing image: ${dockerImageName}"
}
}
Running the image using Docker Compose
// file: docker-compose.yml
version: '2'
services:
springboot-demo: → name if container
image: spring-boot-docker-helloworld:latest → the image that is going to be used
ports:
- "8080:8080” → port mapping 8080 host -> 8080 container
Demo:
Build & Run Docker Image using
Spring Boot
But wait… we have images now
how do we run our containers?
We need some help!
Container Storage, Scheduling
& Orchestration
Container Services
Container Services
● Most used Container Services
○ Amazon ECS
○ Kubernetes by Google
○ Docker Swarm
○ Hashicorp Nomad
○ Azure Container Service
All have the some focus:
Run your Services / Containers
Container Services
● Storage
● Clustering support
● Control & Monitoring
● Scale up/down
● Scheduling & Orchestration
○ Flexible Container placement
Placement Strategies
● Strategy name
○ node selected
● Spread
○ has the fewest containers,
disregarding their states
● Binpack
○ most packed (i.e. has the minimum
amount of free CPU/RAM)
● Random
○ chosen randomly
Components of AWS ECS
comparable
to Docker
Hub
Amazon EC2 Container Service (ECS)
“ECR → Pushing and Pulling containers”
● Amazon’s version of a Docker Registry
● Registry contains Repositories
○ unique namespace
● Logins generated on demand with
limited session length
● Images:
○ can be shared with AWS accounts
○ at rest are encrypted and stored in S3
○ transmitted over HTTPS
Container Registry
Publishing
to ECR
Demo:
Push/Pull image(s) to/from ECR
Amazon EC2 Container Service (ECS)
“ECS → Deploying containers”
Container
Service
Detail
Docker Container
The result of starting a
Docker Image by the
Scheduler
Container
Service
Detail
EC2 Container Instance
EC2 instance with Docker &
the ECS Agent installed
ECS Agent
Allows EC2 container
instances to connect to a
cluster
Container
Service
Detail
ECS Cluster
A logical grouping of EC2
Container Instances
Container
Service
Detail
Demo Description
● Create the infrastructure
● Deploy “HelloWorld”
container to an
ECS Container Instance
● Make the endpoint
publicly available via
ALB
● Scale the container
instances
How to create the environment?
“Infrastructure as Code”
Terraform
● Provision resources
○ Compute / Storage / Network
● Manage resource lifecycles
● Manage different resource providers (AWS, Google, Azure, …)
● Automate deployments and configurations
Infrastructure as Code
Tip
Considering using TFENV
to manage Terraform versions
// file: main.tf ~ some code intentionally removed
module "vpc" {
source = "github.com/terraform-community-modules/tf_aws_vpc"
name = "my-vpc"
cidr = "10.0.0.0/16"
public_subnets = ["10.0.1.0/24", "10.0.2.0/24"]
private_subnets = ["10.0.101.0/24", "10.0.102.0/24"]
}
module "bastion" { ... }
module "ecs-cluster" {
source = "./ecs-cluster"
cluster_name = "demo"
vpc_id = "${module.vpc.vpc_id}"
subnet_ids = "${module.vpc.private_subnets}"
}
Demo:
Overview of AWS Infrastructure
All fine, we have the infrastructure
Now get some apps deployed :)
Deployment of a Dockerized
app on ECS
Describing your Docker deployment
Describes one or more Docker
Containers that form your
application (blueprint)
Runs and maintains a desired
number of tasks from a
specified task definition
Running container with
the settings defined in
the Task Definition
Example: Task Definition
45
{ "family": "webserver", → family of containers
"containerDefinitions": [{
"name": "web", → name of the container
"image": "nginx", → the image used for the container
"cpu": 99, → cpu + memory credits
"memory": 100,
"portMappings": [{ → port mappings (expose port 80 in container to port 80 on host)
"containerPort": 80,
"hostPort": 80
}],
"environment": [{ → environment variables, used in the container
"name": "MYSQL_ROOT_PASSWORD",
"value": "password"
}]
}]
}
Can you spot the problem?
Host <> Container Port mapping
Host <> Container Port mapping
Run a task/service on ECS Container Service
● AWS Console
○ Use the AWS console and use the UI
● Manual
○ Using the AWS CLI / ECS CLI
● Automated
○ Using Cloudwatch or Terraform
Demo Description
● Create the infrastructure
● Deploy “HelloWorld”
container to an
ECS Container Instance
● Make the endpoint
publicly available via
ALB
● Scale the container
instances
// file: main.tf ~ some code intentionally removed
module "vpc" { ... }
module "bastion" { ... }
module "ecs-cluster" { ... }
module "helloworld-service" {
source = "./helloworld-service"
environment = "test-env"
vpc_id = "${module.vpc.vpc_id}"
ecs_cluster_id = "${module.ecs-cluster.ecs_cluster_id}"
docker_repository = "163079528612.dkr.ecr.us-east-1.amazonaws.com"
public_subnet_ids = "${module.vpc.public_subnets}"
iam_role = "${module.ecs-cluster.ecs_aws_iam_role_name}"
desired_count = 1
}
// file: task-definition.tpl
[
{
"name": "helloworld-service",
"essential": true,
"image": "${docker_repository}/springboot-docker-helloworld:${version}",
"memoryReservation": 256,
"portMappings": [
{ "ContainerPort": 8080 }
]
}
]
Demo:
Deploy Docker Container on ECS
Container Service using Terraform
Service Autoscaling
Autoscaling your containers
● Scaling is based upon metrics → Application Autoscaling
○ Metrics on ECS/Service
■ cpu load, memory usage, io, …
● CloudWatch Alarm
○ cpu > 80% for 1 minute
○ cpu < 50% for 1 minute
● Scaling Policy → “ChangeInCapacity”
○ up +1 instance
○ down -1 instance
Demo Description
● Create the infrastructure
● Deploy “HelloWorld”
container to an
ECS Container Instance
● Make the endpoint
publicly available via
ALB
● Scale the container
instances
Demo:
Autoscaling based on CPU
Service Discovery
Service Discovery
● DNS based Discovery
● Consul Service Discovery
Logging
Logging
Multiple Log Drivers
available
Configuring the Log Driver
62
{ "family": "webserver", → family of containers
"containerDefinitions": [{
"name": "web", → name of the container
"image": "nginx", → the image used for the container
// some intentionally omitted
"logConfiguration": { → log configuration
"logDriver": "awslogs", → to be used logdriver
"options": { → logdriver options
"awslogs-group": "awslogs-nginx",
"awslogs-region": "ap-northeast-1",
"awslogs-stream-prefix": "awslogs-example"
}
}
}]
}
Monitoring
● Cloudwatch / InfluxDB / Prometheus / SysDig
Monitoring
Prometheus Overview
Demo:
Monitoring using Prometheus
Recap
● Running Docker containers on ECS is not hard
○ Build your Dockerized Spring Boot applications and push them to ECS
○ ECS Cluster with EC2 instances
● Use a “Infrastructure as Code” approach to keep a grasp on what needs to
be deployed
● Do not forget about Logging and Monitoring these steps are important
○ use CloudWatch or other monitoring tools to keep an eye on your infrastructure
● Service Discovery using DNS or Consul
That’s a wrap!
Question?
https://github.com/mpas/running-your-dockerized-application-on-aws-ec2-container-service
Marco Pas
Philips Lighting
Software geek, hands on
Developer/Architect/DevOps Engineer
@marcopas

More Related Content

What's hot

Deliver Docker Containers Continuously on AWS - QCon 2017
Deliver Docker Containers Continuously on AWS - QCon 2017Deliver Docker Containers Continuously on AWS - QCon 2017
Deliver Docker Containers Continuously on AWS - QCon 2017Philipp Garbe
 
Continous Delivery to Kubernetes using Helm
Continous Delivery to Kubernetes using HelmContinous Delivery to Kubernetes using Helm
Continous Delivery to Kubernetes using HelmBitnami
 
Building a Cloud Native Service - Docker Meetup Santa Clara (July 20, 2017)
Building a Cloud Native Service - Docker Meetup Santa Clara (July 20, 2017)Building a Cloud Native Service - Docker Meetup Santa Clara (July 20, 2017)
Building a Cloud Native Service - Docker Meetup Santa Clara (July 20, 2017)Yong Tang
 
Docker Container automatisiert nach AWS deployen - Continuous Lifecycle 2016
Docker Container automatisiert nach AWS deployen  - Continuous Lifecycle 2016Docker Container automatisiert nach AWS deployen  - Continuous Lifecycle 2016
Docker Container automatisiert nach AWS deployen - Continuous Lifecycle 2016Philipp Garbe
 
GlobalAzureBootCamp 2018
GlobalAzureBootCamp 2018GlobalAzureBootCamp 2018
GlobalAzureBootCamp 2018girish goudar
 
Netflix0SS Services on Docker
Netflix0SS Services on DockerNetflix0SS Services on Docker
Netflix0SS Services on DockerDocker, Inc.
 
Docker 1.12 (dockercon recap)
Docker 1.12 (dockercon recap)Docker 1.12 (dockercon recap)
Docker 1.12 (dockercon recap)Nguyen Anh Tu
 
Using amazon web services with cold fusion 11
Using amazon web services with cold fusion 11Using amazon web services with cold fusion 11
Using amazon web services with cold fusion 11ColdFusionConference
 
DevOps Days Tel Aviv - Serverless Architecture
DevOps Days Tel Aviv - Serverless ArchitectureDevOps Days Tel Aviv - Serverless Architecture
DevOps Days Tel Aviv - Serverless ArchitectureAntons Kranga
 
Sf bay area Kubernetes meetup dec8 2016 - deployment models
Sf bay area Kubernetes meetup dec8 2016 - deployment modelsSf bay area Kubernetes meetup dec8 2016 - deployment models
Sf bay area Kubernetes meetup dec8 2016 - deployment modelsPeter Ss
 
Load Balancing in the Cloud using Nginx & Kubernetes
Load Balancing in the Cloud using Nginx & KubernetesLoad Balancing in the Cloud using Nginx & Kubernetes
Load Balancing in the Cloud using Nginx & KubernetesLee Calcote
 
Serverless and Servicefull Applications - Where Microservices complements Ser...
Serverless and Servicefull Applications - Where Microservices complements Ser...Serverless and Servicefull Applications - Where Microservices complements Ser...
Serverless and Servicefull Applications - Where Microservices complements Ser...Red Hat Developers
 
Kubernetes best practices
Kubernetes best practicesKubernetes best practices
Kubernetes best practicesBill Liu
 
Building a Global-Scale Multi-Tenant Cloud Platform on AWS and Docker: Lesson...
Building a Global-Scale Multi-Tenant Cloud Platform on AWS and Docker: Lesson...Building a Global-Scale Multi-Tenant Cloud Platform on AWS and Docker: Lesson...
Building a Global-Scale Multi-Tenant Cloud Platform on AWS and Docker: Lesson...Felix Gessert
 
Deliver Docker Containers Continuously On AWS - DevOpsCon Munich 2016
Deliver Docker Containers Continuously On AWS - DevOpsCon Munich 2016Deliver Docker Containers Continuously On AWS - DevOpsCon Munich 2016
Deliver Docker Containers Continuously On AWS - DevOpsCon Munich 2016Philipp Garbe
 
Setting up Kubernetes with tectonic
Setting up Kubernetes with tectonicSetting up Kubernetes with tectonic
Setting up Kubernetes with tectonicVishal Biyani
 
Spinnaker 파트 1
Spinnaker 파트 1Spinnaker 파트 1
Spinnaker 파트 1Steven Shim
 
Building a multi-tenant cloud service from legacy code with Docker containers
Building a multi-tenant cloud service from legacy code with Docker containersBuilding a multi-tenant cloud service from legacy code with Docker containers
Building a multi-tenant cloud service from legacy code with Docker containersaslomibm
 

What's hot (20)

Deliver Docker Containers Continuously on AWS - QCon 2017
Deliver Docker Containers Continuously on AWS - QCon 2017Deliver Docker Containers Continuously on AWS - QCon 2017
Deliver Docker Containers Continuously on AWS - QCon 2017
 
Continous Delivery to Kubernetes using Helm
Continous Delivery to Kubernetes using HelmContinous Delivery to Kubernetes using Helm
Continous Delivery to Kubernetes using Helm
 
Scala at Netflix
Scala at NetflixScala at Netflix
Scala at Netflix
 
Building a Cloud Native Service - Docker Meetup Santa Clara (July 20, 2017)
Building a Cloud Native Service - Docker Meetup Santa Clara (July 20, 2017)Building a Cloud Native Service - Docker Meetup Santa Clara (July 20, 2017)
Building a Cloud Native Service - Docker Meetup Santa Clara (July 20, 2017)
 
Docker Container automatisiert nach AWS deployen - Continuous Lifecycle 2016
Docker Container automatisiert nach AWS deployen  - Continuous Lifecycle 2016Docker Container automatisiert nach AWS deployen  - Continuous Lifecycle 2016
Docker Container automatisiert nach AWS deployen - Continuous Lifecycle 2016
 
GlobalAzureBootCamp 2018
GlobalAzureBootCamp 2018GlobalAzureBootCamp 2018
GlobalAzureBootCamp 2018
 
Netflix0SS Services on Docker
Netflix0SS Services on DockerNetflix0SS Services on Docker
Netflix0SS Services on Docker
 
Docker 1.12 (dockercon recap)
Docker 1.12 (dockercon recap)Docker 1.12 (dockercon recap)
Docker 1.12 (dockercon recap)
 
Using amazon web services with cold fusion 11
Using amazon web services with cold fusion 11Using amazon web services with cold fusion 11
Using amazon web services with cold fusion 11
 
DevOps Days Tel Aviv - Serverless Architecture
DevOps Days Tel Aviv - Serverless ArchitectureDevOps Days Tel Aviv - Serverless Architecture
DevOps Days Tel Aviv - Serverless Architecture
 
Sf bay area Kubernetes meetup dec8 2016 - deployment models
Sf bay area Kubernetes meetup dec8 2016 - deployment modelsSf bay area Kubernetes meetup dec8 2016 - deployment models
Sf bay area Kubernetes meetup dec8 2016 - deployment models
 
Load Balancing in the Cloud using Nginx & Kubernetes
Load Balancing in the Cloud using Nginx & KubernetesLoad Balancing in the Cloud using Nginx & Kubernetes
Load Balancing in the Cloud using Nginx & Kubernetes
 
Serverless and Servicefull Applications - Where Microservices complements Ser...
Serverless and Servicefull Applications - Where Microservices complements Ser...Serverless and Servicefull Applications - Where Microservices complements Ser...
Serverless and Servicefull Applications - Where Microservices complements Ser...
 
Kubernetes best practices
Kubernetes best practicesKubernetes best practices
Kubernetes best practices
 
Building a Global-Scale Multi-Tenant Cloud Platform on AWS and Docker: Lesson...
Building a Global-Scale Multi-Tenant Cloud Platform on AWS and Docker: Lesson...Building a Global-Scale Multi-Tenant Cloud Platform on AWS and Docker: Lesson...
Building a Global-Scale Multi-Tenant Cloud Platform on AWS and Docker: Lesson...
 
Deliver Docker Containers Continuously On AWS - DevOpsCon Munich 2016
Deliver Docker Containers Continuously On AWS - DevOpsCon Munich 2016Deliver Docker Containers Continuously On AWS - DevOpsCon Munich 2016
Deliver Docker Containers Continuously On AWS - DevOpsCon Munich 2016
 
Multi tenancy for docker
Multi tenancy for dockerMulti tenancy for docker
Multi tenancy for docker
 
Setting up Kubernetes with tectonic
Setting up Kubernetes with tectonicSetting up Kubernetes with tectonic
Setting up Kubernetes with tectonic
 
Spinnaker 파트 1
Spinnaker 파트 1Spinnaker 파트 1
Spinnaker 파트 1
 
Building a multi-tenant cloud service from legacy code with Docker containers
Building a multi-tenant cloud service from legacy code with Docker containersBuilding a multi-tenant cloud service from legacy code with Docker containers
Building a multi-tenant cloud service from legacy code with Docker containers
 

Similar to Running your dockerized application(s) on AWS Elastic Container Service

AWS Workshop 102
AWS Workshop 102AWS Workshop 102
AWS Workshop 102lynn80827
 
Docker in practice
Docker in practiceDocker in practice
Docker in practiceGeert Pante
 
Introduction to Docker and Monitoring with InfluxData
Introduction to Docker and Monitoring with InfluxDataIntroduction to Docker and Monitoring with InfluxData
Introduction to Docker and Monitoring with InfluxDataInfluxData
 
From development environments to production deployments with Docker, Compose,...
From development environments to production deployments with Docker, Compose,...From development environments to production deployments with Docker, Compose,...
From development environments to production deployments with Docker, Compose,...Jérôme Petazzoni
 
Introduction of Docker and Docker Compose
Introduction of Docker and Docker ComposeIntroduction of Docker and Docker Compose
Introduction of Docker and Docker ComposeDr. Ketan Parmar
 
Up and running with docker
Up and running with dockerUp and running with docker
Up and running with dockerMichelle Liu
 
ContainerDayVietnam2016: Dockerize a small business
ContainerDayVietnam2016: Dockerize a small businessContainerDayVietnam2016: Dockerize a small business
ContainerDayVietnam2016: Dockerize a small businessDocker-Hanoi
 
Amazon Web Services and Docker: from developing to production
Amazon Web Services and Docker: from developing to productionAmazon Web Services and Docker: from developing to production
Amazon Web Services and Docker: from developing to productionPaolo latella
 
Getting-Started-with-Containers-and-Kubernetes_-March-2020-CNCF-Webinar.pdf
Getting-Started-with-Containers-and-Kubernetes_-March-2020-CNCF-Webinar.pdfGetting-Started-with-Containers-and-Kubernetes_-March-2020-CNCF-Webinar.pdf
Getting-Started-with-Containers-and-Kubernetes_-March-2020-CNCF-Webinar.pdfssuser348b1c
 
ILM - Pipeline in the cloud
ILM - Pipeline in the cloudILM - Pipeline in the cloud
ILM - Pipeline in the cloudAaron Carey
 
Docker and kubernetes
Docker and kubernetesDocker and kubernetes
Docker and kubernetesDongwon Kim
 
Docker for developers z java
Docker for developers z javaDocker for developers z java
Docker for developers z javaandrzejsydor
 
DCEU 18: Docker Containers in a Serverless World
DCEU 18: Docker Containers in a Serverless WorldDCEU 18: Docker Containers in a Serverless World
DCEU 18: Docker Containers in a Serverless WorldDocker, Inc.
 
Powercoders · Docker · Fall 2021.pptx
Powercoders · Docker · Fall 2021.pptxPowercoders · Docker · Fall 2021.pptx
Powercoders · Docker · Fall 2021.pptxIgnacioTamayo2
 
Making Service Deployments to AWS a breeze with Nova
Making Service Deployments to AWS a breeze with NovaMaking Service Deployments to AWS a breeze with Nova
Making Service Deployments to AWS a breeze with NovaGregor Heine
 

Similar to Running your dockerized application(s) on AWS Elastic Container Service (20)

AWS Workshop 102
AWS Workshop 102AWS Workshop 102
AWS Workshop 102
 
Docker From Scratch
Docker From ScratchDocker From Scratch
Docker From Scratch
 
Docker in practice
Docker in practiceDocker in practice
Docker in practice
 
Docker for Developers
Docker for DevelopersDocker for Developers
Docker for Developers
 
Introduction to Docker and Monitoring with InfluxData
Introduction to Docker and Monitoring with InfluxDataIntroduction to Docker and Monitoring with InfluxData
Introduction to Docker and Monitoring with InfluxData
 
From development environments to production deployments with Docker, Compose,...
From development environments to production deployments with Docker, Compose,...From development environments to production deployments with Docker, Compose,...
From development environments to production deployments with Docker, Compose,...
 
Introduction of Docker and Docker Compose
Introduction of Docker and Docker ComposeIntroduction of Docker and Docker Compose
Introduction of Docker and Docker Compose
 
Up and running with docker
Up and running with dockerUp and running with docker
Up and running with docker
 
ContainerDayVietnam2016: Dockerize a small business
ContainerDayVietnam2016: Dockerize a small businessContainerDayVietnam2016: Dockerize a small business
ContainerDayVietnam2016: Dockerize a small business
 
Amazon Web Services and Docker: from developing to production
Amazon Web Services and Docker: from developing to productionAmazon Web Services and Docker: from developing to production
Amazon Web Services and Docker: from developing to production
 
Getting-Started-with-Containers-and-Kubernetes_-March-2020-CNCF-Webinar.pdf
Getting-Started-with-Containers-and-Kubernetes_-March-2020-CNCF-Webinar.pdfGetting-Started-with-Containers-and-Kubernetes_-March-2020-CNCF-Webinar.pdf
Getting-Started-with-Containers-and-Kubernetes_-March-2020-CNCF-Webinar.pdf
 
ILM - Pipeline in the cloud
ILM - Pipeline in the cloudILM - Pipeline in the cloud
ILM - Pipeline in the cloud
 
Docker and kubernetes
Docker and kubernetesDocker and kubernetes
Docker and kubernetes
 
Docker for developers z java
Docker for developers z javaDocker for developers z java
Docker for developers z java
 
DCEU 18: Docker Containers in a Serverless World
DCEU 18: Docker Containers in a Serverless WorldDCEU 18: Docker Containers in a Serverless World
DCEU 18: Docker Containers in a Serverless World
 
Docker Basics
Docker BasicsDocker Basics
Docker Basics
 
Powercoders · Docker · Fall 2021.pptx
Powercoders · Docker · Fall 2021.pptxPowercoders · Docker · Fall 2021.pptx
Powercoders · Docker · Fall 2021.pptx
 
How to _docker
How to _dockerHow to _docker
How to _docker
 
Docker Kubernetes Istio
Docker Kubernetes IstioDocker Kubernetes Istio
Docker Kubernetes Istio
 
Making Service Deployments to AWS a breeze with Nova
Making Service Deployments to AWS a breeze with NovaMaking Service Deployments to AWS a breeze with Nova
Making Service Deployments to AWS a breeze with Nova
 

Recently uploaded

Building Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop SlideBuilding Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop SlideChristina Lin
 
5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdfWave PLM
 
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed DataAlluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed DataAlluxio, Inc.
 
Advancing Engineering with AI through the Next Generation of Strategic Projec...
Advancing Engineering with AI through the Next Generation of Strategic Projec...Advancing Engineering with AI through the Next Generation of Strategic Projec...
Advancing Engineering with AI through the Next Generation of Strategic Projec...OnePlan Solutions
 
cybersecurity notes for mca students for learning
cybersecurity notes for mca students for learningcybersecurity notes for mca students for learning
cybersecurity notes for mca students for learningVitsRangannavar
 
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...MyIntelliSource, Inc.
 
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...MyIntelliSource, Inc.
 
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...stazi3110
 
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptxKnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptxTier1 app
 
What is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need ItWhat is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need ItWave PLM
 
why an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdfwhy an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdfjoe51371421
 
Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝
Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝
Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝soniya singh
 
The Evolution of Karaoke From Analog to App.pdf
The Evolution of Karaoke From Analog to App.pdfThe Evolution of Karaoke From Analog to App.pdf
The Evolution of Karaoke From Analog to App.pdfPower Karaoke
 
Project Based Learning (A.I).pptx detail explanation
Project Based Learning (A.I).pptx detail explanationProject Based Learning (A.I).pptx detail explanation
Project Based Learning (A.I).pptx detail explanationkaushalgiri8080
 
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer DataAdobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer DataBradBedford3
 
XpertSolvers: Your Partner in Building Innovative Software Solutions
XpertSolvers: Your Partner in Building Innovative Software SolutionsXpertSolvers: Your Partner in Building Innovative Software Solutions
XpertSolvers: Your Partner in Building Innovative Software SolutionsMehedi Hasan Shohan
 
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsUnveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsAlberto González Trastoy
 
HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comFatema Valibhai
 
Asset Management Software - Infographic
Asset Management Software - InfographicAsset Management Software - Infographic
Asset Management Software - InfographicHr365.us smith
 

Recently uploaded (20)

Building Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop SlideBuilding Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
 
5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf
 
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed DataAlluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
 
Advancing Engineering with AI through the Next Generation of Strategic Projec...
Advancing Engineering with AI through the Next Generation of Strategic Projec...Advancing Engineering with AI through the Next Generation of Strategic Projec...
Advancing Engineering with AI through the Next Generation of Strategic Projec...
 
cybersecurity notes for mca students for learning
cybersecurity notes for mca students for learningcybersecurity notes for mca students for learning
cybersecurity notes for mca students for learning
 
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
 
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
 
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
 
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptxKnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
 
What is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need ItWhat is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need It
 
why an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdfwhy an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdf
 
Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝
Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝
Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝
 
The Evolution of Karaoke From Analog to App.pdf
The Evolution of Karaoke From Analog to App.pdfThe Evolution of Karaoke From Analog to App.pdf
The Evolution of Karaoke From Analog to App.pdf
 
Project Based Learning (A.I).pptx detail explanation
Project Based Learning (A.I).pptx detail explanationProject Based Learning (A.I).pptx detail explanation
Project Based Learning (A.I).pptx detail explanation
 
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer DataAdobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
 
XpertSolvers: Your Partner in Building Innovative Software Solutions
XpertSolvers: Your Partner in Building Innovative Software SolutionsXpertSolvers: Your Partner in Building Innovative Software Solutions
XpertSolvers: Your Partner in Building Innovative Software Solutions
 
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsUnveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
 
HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.com
 
Call Girls In Mukherjee Nagar 📱 9999965857 🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...
Call Girls In Mukherjee Nagar 📱  9999965857  🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...Call Girls In Mukherjee Nagar 📱  9999965857  🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...
Call Girls In Mukherjee Nagar 📱 9999965857 🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...
 
Asset Management Software - Infographic
Asset Management Software - InfographicAsset Management Software - Infographic
Asset Management Software - Infographic
 

Running your dockerized application(s) on AWS Elastic Container Service

  • 1. Running your Dockerized application(s) on AWS EC2 Container Service Marco Pas Philips Lighting Software geek, hands on Developer/Architect/DevOps Engineer @marcopas
  • 2. Some stuff about me... ● Mostly doing cloud related stuff ○ Java, Groovy, Scala, Spring Boot, IOT, AWS, Terraform, Infrastructure ● Enjoying the good things ● Chef leuke dingen doen == “trying out cool and new stuff” ● Currently involved in a big IOT project ● Wannabe chef, movie & Netflix addict
  • 4.
  • 5. From Personal Container Management to ...
  • 6. Something that runs into production ● Docker ● Security ● Service Discovery ● Logging & Monitoring ● Rolling Deployments ● Networking ● Supervision ● Container hosting ● Docker Development Production Learning cliff
  • 7. Using Docker Compose != Running production
  • 8. Agenda ● Containers ● Creating a Container using Spring Boot ● Container Services ● Amazon EC2 Container Service (ECS) ○ Pushing and Pulling containers ○ Deploying containers ○ Scaling your containers ○ Service Discovery ○ Logging ○ Monitoring
  • 10. ● OS Virtualization ● Process Isolation ● Automation ● Images What are containers Portable Flexible Fast Efficient
  • 11. Creating a Docker Image # Dockerfile ~ example FROM alpine:latest ADD HelloWorld.class HelloWorld.class RUN apk --update add openjdk8-jre ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "HelloWorld"] docker build -t <your imagename>:<tag> .
  • 12. From Docker Image to a Docker Container
  • 14. // file: DemoApplication.java package springboot.docker.helloworld; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } @RequestMapping("/") String home() { return "Hello World!"; → say hello :) } }
  • 15. // file: build.gradle ~ some code intentionally removed dependencies { compile('org.springframework.boot:spring-boot-starter-web') compile('org.springframework.boot:spring-boot-starter-actuator') → add spring boot actuator testCompile('org.springframework.boot:spring-boot-starter-test') } String dockerImageName = "spring-boot-docker-helloworld" → set the image name task buildDockerImage(type:Exec) { → task to create an image group = 'docker' description = 'Build a docker image' commandLine 'docker', 'build', '-f', 'build/docker/Dockerfile', '-t', "${dockerImageName}", 'build/docker' doFirst { println ">> Creating image: ${dockerImageName}" // some code intentionally removed } }
  • 16. // file: build.gradle ~ some code intentionally removed doFirst { println ">> Creating image: ${dockerImageName}" copy { // copy files to build location, Dockerfile - Jar file } copy { // process Dockerfile to replace labels (Dockerfile label: @name@, @version@, @build-date@, … // copy files to build location, Dockerfile - Jar file from('src/main/docker/') { include 'Dockerfile' filter(ReplaceTokens, tokens: [ 'version': version, 'build-date': new Date().format("yyyy-MM-dd'T'HH:mm:ss'Z'", TimeZone.getTimeZone("UTC")), 'git-branch': gitBranch(), 'git-commit': gitCommitHash() ]) } file("build/docker/app/${jar.archiveName}").renameTo("build/docker/app/application.jar") }
  • 17. // file: Dockerfile example ~ some code intentionally removed FROM java:8u66-jdk LABEL com.acme.build-date="@build-date@" → provide data to the Dockerfile EXPOSE 8080 → expose port 8080, so the host can map this port # Create app that holds the application.jar file RUN mkdir -p /app → do some housekeeping, creating directories WORKDIR /app COPY /app/application.jar application.jar → copy the application.jar file into the container COPY /app/docker-entrypoint.sh docker-entrypoint.sh → copy startup script into the container # Set file permissions RUN chmod +x docker-entrypoint.sh → make the shel script executable # Set start script as default command CMD ["./docker-entrypoint.sh"] → execute the startup script when we start the container
  • 18. // file: build.gradle project.ext.dockerRegistry = System.env.DOCKER_REGISTRY → get the docker registry from environment String dockerImageName = "spring-boot-docker-helloworld" → set the image name task pushDockerImage(type: Exec) { group = 'docker' description = 'Push a docker image' commandLine 'docker', 'push', "${project.ext.dockerRegistry}/${dockerImageName}" doFirst { println ">> Checking dockerRepository" if (!project.ext.dockerRegistry) { throw new GradleException("Unable to push image, please provide correct 'dockerRegistry'") } println ">> Pushing image: ${dockerImageName}" } }
  • 19. Running the image using Docker Compose // file: docker-compose.yml version: '2' services: springboot-demo: → name if container image: spring-boot-docker-helloworld:latest → the image that is going to be used ports: - "8080:8080” → port mapping 8080 host -> 8080 container
  • 20. Demo: Build & Run Docker Image using Spring Boot
  • 21. But wait… we have images now how do we run our containers? We need some help! Container Storage, Scheduling & Orchestration
  • 23. Container Services ● Most used Container Services ○ Amazon ECS ○ Kubernetes by Google ○ Docker Swarm ○ Hashicorp Nomad ○ Azure Container Service All have the some focus: Run your Services / Containers
  • 24. Container Services ● Storage ● Clustering support ● Control & Monitoring ● Scale up/down ● Scheduling & Orchestration ○ Flexible Container placement
  • 25. Placement Strategies ● Strategy name ○ node selected ● Spread ○ has the fewest containers, disregarding their states ● Binpack ○ most packed (i.e. has the minimum amount of free CPU/RAM) ● Random ○ chosen randomly
  • 26.
  • 27. Components of AWS ECS comparable to Docker Hub
  • 28. Amazon EC2 Container Service (ECS) “ECR → Pushing and Pulling containers”
  • 29. ● Amazon’s version of a Docker Registry ● Registry contains Repositories ○ unique namespace ● Logins generated on demand with limited session length ● Images: ○ can be shared with AWS accounts ○ at rest are encrypted and stored in S3 ○ transmitted over HTTPS Container Registry
  • 32. Amazon EC2 Container Service (ECS) “ECS → Deploying containers”
  • 33. Container Service Detail Docker Container The result of starting a Docker Image by the Scheduler
  • 34. Container Service Detail EC2 Container Instance EC2 instance with Docker & the ECS Agent installed ECS Agent Allows EC2 container instances to connect to a cluster
  • 35. Container Service Detail ECS Cluster A logical grouping of EC2 Container Instances
  • 37. Demo Description ● Create the infrastructure ● Deploy “HelloWorld” container to an ECS Container Instance ● Make the endpoint publicly available via ALB ● Scale the container instances
  • 38. How to create the environment? “Infrastructure as Code”
  • 39. Terraform ● Provision resources ○ Compute / Storage / Network ● Manage resource lifecycles ● Manage different resource providers (AWS, Google, Azure, …) ● Automate deployments and configurations Infrastructure as Code
  • 40. Tip Considering using TFENV to manage Terraform versions
  • 41. // file: main.tf ~ some code intentionally removed module "vpc" { source = "github.com/terraform-community-modules/tf_aws_vpc" name = "my-vpc" cidr = "10.0.0.0/16" public_subnets = ["10.0.1.0/24", "10.0.2.0/24"] private_subnets = ["10.0.101.0/24", "10.0.102.0/24"] } module "bastion" { ... } module "ecs-cluster" { source = "./ecs-cluster" cluster_name = "demo" vpc_id = "${module.vpc.vpc_id}" subnet_ids = "${module.vpc.private_subnets}" }
  • 42. Demo: Overview of AWS Infrastructure
  • 43. All fine, we have the infrastructure Now get some apps deployed :) Deployment of a Dockerized app on ECS
  • 44. Describing your Docker deployment Describes one or more Docker Containers that form your application (blueprint) Runs and maintains a desired number of tasks from a specified task definition Running container with the settings defined in the Task Definition
  • 45. Example: Task Definition 45 { "family": "webserver", → family of containers "containerDefinitions": [{ "name": "web", → name of the container "image": "nginx", → the image used for the container "cpu": 99, → cpu + memory credits "memory": 100, "portMappings": [{ → port mappings (expose port 80 in container to port 80 on host) "containerPort": 80, "hostPort": 80 }], "environment": [{ → environment variables, used in the container "name": "MYSQL_ROOT_PASSWORD", "value": "password" }] }] } Can you spot the problem?
  • 46. Host <> Container Port mapping
  • 47. Host <> Container Port mapping
  • 48. Run a task/service on ECS Container Service ● AWS Console ○ Use the AWS console and use the UI ● Manual ○ Using the AWS CLI / ECS CLI ● Automated ○ Using Cloudwatch or Terraform
  • 49. Demo Description ● Create the infrastructure ● Deploy “HelloWorld” container to an ECS Container Instance ● Make the endpoint publicly available via ALB ● Scale the container instances
  • 50. // file: main.tf ~ some code intentionally removed module "vpc" { ... } module "bastion" { ... } module "ecs-cluster" { ... } module "helloworld-service" { source = "./helloworld-service" environment = "test-env" vpc_id = "${module.vpc.vpc_id}" ecs_cluster_id = "${module.ecs-cluster.ecs_cluster_id}" docker_repository = "163079528612.dkr.ecr.us-east-1.amazonaws.com" public_subnet_ids = "${module.vpc.public_subnets}" iam_role = "${module.ecs-cluster.ecs_aws_iam_role_name}" desired_count = 1 }
  • 51. // file: task-definition.tpl [ { "name": "helloworld-service", "essential": true, "image": "${docker_repository}/springboot-docker-helloworld:${version}", "memoryReservation": 256, "portMappings": [ { "ContainerPort": 8080 } ] } ]
  • 52. Demo: Deploy Docker Container on ECS Container Service using Terraform
  • 54. Autoscaling your containers ● Scaling is based upon metrics → Application Autoscaling ○ Metrics on ECS/Service ■ cpu load, memory usage, io, … ● CloudWatch Alarm ○ cpu > 80% for 1 minute ○ cpu < 50% for 1 minute ● Scaling Policy → “ChangeInCapacity” ○ up +1 instance ○ down -1 instance
  • 55. Demo Description ● Create the infrastructure ● Deploy “HelloWorld” container to an ECS Container Instance ● Make the endpoint publicly available via ALB ● Scale the container instances
  • 58. Service Discovery ● DNS based Discovery ● Consul Service Discovery
  • 60.
  • 62. Configuring the Log Driver 62 { "family": "webserver", → family of containers "containerDefinitions": [{ "name": "web", → name of the container "image": "nginx", → the image used for the container // some intentionally omitted "logConfiguration": { → log configuration "logDriver": "awslogs", → to be used logdriver "options": { → logdriver options "awslogs-group": "awslogs-nginx", "awslogs-region": "ap-northeast-1", "awslogs-stream-prefix": "awslogs-example" } } }] }
  • 64. ● Cloudwatch / InfluxDB / Prometheus / SysDig Monitoring
  • 67. Recap ● Running Docker containers on ECS is not hard ○ Build your Dockerized Spring Boot applications and push them to ECS ○ ECS Cluster with EC2 instances ● Use a “Infrastructure as Code” approach to keep a grasp on what needs to be deployed ● Do not forget about Logging and Monitoring these steps are important ○ use CloudWatch or other monitoring tools to keep an eye on your infrastructure ● Service Discovery using DNS or Consul
  • 68. That’s a wrap! Question? https://github.com/mpas/running-your-dockerized-application-on-aws-ec2-container-service Marco Pas Philips Lighting Software geek, hands on Developer/Architect/DevOps Engineer @marcopas