Focus on Services, Not on Containers
Containers may be super cool, but at the end of the day, they’re just
another kind of infrastructure. A seasoned developer is probably already
familiar with several other kinds of infrastructure and approaches to
deploying applications. Another is not really that big of a deal.
However, when the infrastructure creates new possibilities with the way
an application is architected—as containers do—that’s a huge
deal. That is why the services in a microservice application are far
more important than the containerized infrastructure they run on.
Modularity has always been a goal of application architectures, and now
that the concept of microservices is possible, how you build those
services end up dictating where they run and how they are deployed.
Services are where application functionality meets the user, and where
the value your application can provide is realized. That’s why if you
want to make the most of containers, you should be thinking about more
than just containers. You have to focus on services, because they’re the
really cool thing that containers enable.
Services v. Containers
For conversation’s sake, using services and containers interchangeably
is fine—because the ideal use case for a containerized application is
one that is deconstructed into services, where each service is deployed
as a container (or containers). However, the tactics cannot be
synonymous. Services are an implied infrastructure, but more
importantly, an application architecture. When you talk about a service
that is part of your application, that service is persistent. You can’t
suddenly have an application without a login page or a shopping cart,
for example, and expect things to go well. Containers, on the other
hand, are designed to live and die in very short time frames. Ideally,
with every deployment or revert, the container is killed as soon as the
new deployment is live and the traffic is routed to it. So containers
are not persistent. And if the delivery chain is working correctly, that
should not matter at all. Microservices, as both an application and an
infrastructure term, does have some unique elements associated with it,
which diverge the relationship even further.
- A single service can be deployed in multiple regions.
- Each region could have multiple versions—for example, for A/B
testing or canary releases.
- Each service might have different lifecycles. Services tied
specifically to the backend may be deployed less frequently than
It doesn’t even necessarily mean that one service = one container, or
one host. The service is the logical abstraction of functionality from
your application, and not directly correlated to any infrastructure.
What does it mean to be service-focused?
Focusing on your services means that developers do not spend time
optimizing or tinkering with container orchestration or configuration.
If a gold master image is ready to go, an EDGAR vessel for code, then
the developer should only be concerned about committing their code to
it. If the developer is thinking about containers, then something is
broken. Where the developer will need to think about containers is their
development environment. A parity between their development environment
and production is important. Making sure developers are testing on the
right Docker image and have access to the other services and shift-left
quality assurance (QA) are the only way to mitigate the “worked on my
machine” issue. This is accomplished by leveraging strong container
registries. However, even the development environment should be
cookie-cutter, with minimal consideration.
How to accomplish a service-centric workflow
I wish I could say that being service-focused was an individual
developer task. It’s not. The developer already wants to be
hyper-focused on the functionality they are building, and if and when
they get distracted by containers and their orchestration, it’s because
they are nerds and want to tinker, not because they feel it’s their core
responsibility. Maintaining a service focus is the responsibility of the
entire team. It includes how the delivery chain is architected—not
only to be fast, but to avoid the broader team’s need to interact with
it. So service focus starts from management and trickles down to the
delivery chain, or DevOps, to tooling, and the developer is either
finally left holding the infrastructure bag, or is free to work. Here
are the three key tenets of service focus:
- Standardize development environments. You do this by finding a
robust container registry, vetting images, and standardizing the
tooling that developers have in their boxes. Because services are
developed independently, one of the challenges is seeing new
functionality in a service with the application at large. So
on-demand integration environments that developers can deploy per
commit are extremely useful.
- Be immutable, don’t just say you are. To even think about being
service-focused, you have to practice immutable infrastructure, not
just talk about it. This means no changes to containers after they
are deployed. Your option is run or delete. That’s it. Snowflake
images or configurations are strictly forbidden, and there is no
real reason to give access to individual containers beyond the
functionality required by the service itself.
- Create visibility. Service-based applications do have many times
the moving parts of a monolithic application. This means that
creating visibility and providing access to it for all relevant
stakeholders is critical. Visibility should support infrastructure
and application visibility as well. The team should be able to see
the entire application and all the services in it, with inspection
of individual containers. For the development team, application
visibility is most important.
DevOps teams also need to do whatever they can to minimize the impact of
things like networking and security, as these can be huge hurdles. The
objective would be to offload as much as possible to orchestration
tools. The service obsession goal is to avoid distractions, and focus on
service functionality. If developers focus on building a great product,
and DevOps focuses on building the best delivery chain, then the
toolchain and processes will fall into place to support that—which,
today, means containers and great orchestration. The outcome of better
quality applications in the user’s hands, sooner rather than later, is
what impacts your company’s bottom line. The mechanism to get there is
not as critical. So the next time you talk about containers, consider
turning the focus to how you can build better services. Chris Riley
(@HoardingInfo) is a technologist
who has spent 12 years helping organizations transition from traditional
development practices to a modern set of culture, processes and tooling.
In addition to being a research analyst, he is an O’Reilly author,
regular speaker, and subject matter expert in the areas of DevOps
strategy and culture. Chris believes the biggest challenges faced in the
tech market are not tools, but rather people and planning.