rails_frontend:
image: brikis98/rails-frontend
ports:
- "3000:3000"
links:
- sinatra_backend:sinatra_backend
sinatra_backend:
image: brikis98/sinatra-backend
ports:
- "4567:4567"
Define your entire dev stack as
code with docker-compose
rails_frontend:
image: brikis98/rails-frontend
ports:
- "3000:3000"
links:
- sinatra_backend
sinatra_backend:
image: brikis98/sinatra-backend
ports:
- "4567:4567"
Docker links provide a simple
service discovery mechanism
> docker-compose up
Starting infrastructureascodetalk_sinatra_backend_1
Recreating infrastructureascodetalk_rails_frontend_1
sinatra_backend_1 | INFO WEBrick 1.3.1
sinatra_backend_1 | INFO ruby 2.2.4 (2015-12-16)
sinatra_backend_1 | Sinatra has taken the stage on 4567
rails_frontend_1 | INFO WEBrick 1.3.1
rails_frontend_1 | INFO ruby 2.3.0 (2015-12-25)
rails_frontend_1 | INFO WEBrick::HTTPServer#start: port=3000
Run your entire dev stack with one
command
Advantages of Docker:
1. Easy to create & share images
2. Images run the same way in all
environments (dev, test, prod)
3. Easily run the entire stack in dev
4. Minimal overhead
5. Better resource utilization
Disadvantages of Docker:
1. Maturity. Ecosystem developing
very fast, but still a ways to go
2. Tricky to manage persistent data in
a container
3. Tricky to pass secrets to containers
Outline
1. Microservices
2. Docker
3. Terraform
4. ECS
5. Recap
Terraform is a tool for
provisioning infrastructure
Terraform supports many
providers (cloud agnostic)
And many resources for each
provider
You define infrastructure as code
in Terraform templates
provider "aws" {
region = "us-east-1"
}
resource "aws_instance" "example" {
ami = "ami-408c7f28"
instance_type = "t2.micro"
}
This template creates a single EC2
instance in AWS
> terraform plan
+ aws_instance.example
ami: "" => "ami-408c7f28"
instance_type: "" => "t2.micro"
key_name: "" => "<computed>"
private_ip: "" => "<computed>"
public_ip: "" => "<computed>"
Plan: 1 to add, 0 to change, 0 to destroy.
Use the plan command to see
what you’re about to deploy
> terraform apply
aws_instance.example: Creating...
ami: "" => "ami-408c7f28"
instance_type: "" => "t2.micro"
key_name: "" => "<computed>"
private_ip: "" => "<computed>"
public_ip: "" => "<computed>”
aws_instance.example: Creation complete
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
Use the apply command to apply
the changes
Now our EC2 instance is running!
resource "aws_instance" "example" {
ami = "ami-408c7f28"
instance_type = "t2.micro"
tags {
Name = "terraform-example"
}
}
Let’s give the EC2 instance a tag
with a readable name
> terraform plan
~ aws_instance.example
tags.#: "0" => "1"
tags.Name: "" => "terraform-example"
Plan: 0 to add, 1 to change, 0 to destroy.
Use the plan command again to
verify your changes
> terraform apply
aws_instance.example: Refreshing state...
aws_instance.example: Modifying...
tags.#: "0" => "1"
tags.Name: "" => "terraform-example"
aws_instance.example: Modifications complete
Apply complete! Resources: 0 added, 1 changed, 0 destroyed.
Use the apply command again to
deploy those changes
Now our EC2 instance has a tag!