Edit the providers
section in the main.tf
file to correctly connect to your Swarm
Then run me with:
$ terraform init
$ terraform plan
$ terraform apply
Ports 80, 8080, and 5001 are published on all node of the swarm.
provider "docker" { | |
host = "<put your host here>" | |
} | |
# Volumes | |
resource "docker_volume" "db-data" { | |
name = "db-data" | |
} | |
# Networks | |
resource "docker_network" "backend" { | |
name = "backend" | |
driver = "overlay" | |
} | |
resource "docker_network" "frontend" { | |
name = "frontend" | |
driver = "overlay" | |
} | |
# The vote app | |
resource "docker_service" "vote" { | |
name = "vote" | |
task_spec { | |
container_spec { | |
image = "bretfisher/examplevotingapp_vote" | |
} | |
networks = [docker_network.frontend.id] | |
} | |
mode { | |
replicated { | |
replicas = 2 | |
} | |
} | |
endpoint_spec { | |
mode = "vip" | |
ports { | |
target_port = "80" | |
published_port = "80" | |
publish_mode = "ingress" | |
} | |
} | |
} | |
# The Redis app | |
resource "docker_service" "redis" { | |
name = "redis" | |
task_spec { | |
container_spec { | |
image = "redis:3.2" | |
} | |
networks = [docker_network.frontend.id] | |
} | |
mode { | |
replicated { | |
replicas = 1 | |
} | |
} | |
} | |
# The worker | |
resource "docker_service" "worker" { | |
name = "worker" | |
task_spec { | |
container_spec { | |
image = "bretfisher/examplevotingapp_worker:java" | |
} | |
networks = [docker_network.frontend.id, docker_network.backend.id] | |
} | |
mode { | |
replicated { | |
replicas = 1 | |
} | |
} | |
} | |
# The DB | |
resource "docker_service" "db" { | |
name = "db" | |
task_spec { | |
container_spec { | |
image = "postgres:9.4" | |
env = { | |
POSTGRES_HOST_AUTH_METHOD = "trust" | |
} | |
mounts { | |
target = "/var/lib/postgresql/data" | |
source = docker_volume.db-data.name | |
type = "volume" | |
} | |
} | |
networks = [docker_network.backend.id] | |
} | |
mode { | |
replicated { | |
replicas = 1 | |
} | |
} | |
} | |
# The result | |
resource "docker_service" "result" { | |
name = "result" | |
task_spec { | |
container_spec { | |
image = "bretfisher/examplevotingapp_result" | |
} | |
networks = [docker_network.backend.id] | |
} | |
mode { | |
replicated { | |
replicas = 1 | |
} | |
} | |
endpoint_spec { | |
mode = "vip" | |
ports { | |
target_port = "80" | |
published_port = "5001" | |
publish_mode = "ingress" | |
} | |
} | |
} | |
# viz | |
resource "docker_service" "viz" { | |
name = "viz" | |
task_spec { | |
container_spec { | |
image = "dockersamples/visualizer" | |
mounts { | |
target = "/var/run/docker.sock" | |
source = "/var/run/docker.sock" | |
type = "bind" | |
} | |
} | |
placement { | |
constraints = [ | |
"node.role==manager", | |
] | |
} | |
} | |
mode { | |
replicated { | |
replicas = 1 | |
} | |
} | |
endpoint_spec { | |
mode = "vip" | |
ports { | |
target_port = "8080" | |
published_port = "8080" | |
publish_mode = "ingress" | |
} | |
} | |
} |
terraform { | |
required_providers { | |
docker = { | |
source = "terraform-providers/docker" | |
version = "~> 2.7.2" | |
} | |
} | |
required_version = ">= 0.13" | |
} |