In the course of building our hosted CI offering, we've had a chance to experiment with some different deployment strategies for our services. We use Docker for our code isolation in Strider, so it made sense to design a system that could Docker for internal services.
At a high level, we've written a suite of fabric scripts that orchestrate the provisioning of EC2 boxes (or using vagrant for dev), using puppet to setup the environment, including node, docker and Hipache. We then use a docker container for each service. We wait until a container is running, before adding our zero-downtime updating the subdomain to port mapping within the Redis table used by Hipache.
The zero-downtime use case is pretty interesting - because Docker containers are so cheap, we can essentially treat them as disposable caches of operating system state. Thus bringing up extra resources for scale is incredibly cheap, allowing us to have very elastic scaling in terms of horizontally scaled services.
At the moment, our services are entirely stateless - we use mongolab for most of our database needs, so we don't have to worry about data-integrity within our deployment. This obviously makes our use case a lot simpler, so we can experiment with more transient service designs.
We'll probably go into more depth on this in further posts - having the ability to add new services to our deployment with very-low friction has enabled us to iterate quickly and we think that this is a pretty good set of choices for a SOA deployment.
What are you guys using for your DevOps stacks? We'd love to hear from you.