Show HN: Wormhole – A smart proxy that connects docker containers
github.com
github.com
The potential use of a container-initiated networking event (socket open) to trigger responses at the infrastructure-level is the key architectural novelty here. This is essentially a suggestion for 'implicit infrastructure' as opposed to 'explicit infrastructure'; with all of the benefits and drawbacks you would expect from such a paradigm shift.
Personally I believe that the implicit paradigm is mostly useful in specific, relatively controlled use cases, such as service testing or behavioral profiling prior to live deployment.
More thoughts on the same: http://stani.sh/walter/pfcts
It is interesting to note that most of the frameworks that are trying to solve the the rest of the problem have moved along similar lines. For example Kubernetes provides both the ability to launch containers in the same namespace and also provides a proxy. Openshift uses iptables rewriting via GearD.
[1] https://medium.com/@vishvananda/standard-components-not-stan...
This is particularly the case if portability is required, because different business-level requirements call for different service and infrastructure topologies utilizing different technologies, not all of which actually support any single approach. Think hypervisor-based VMs, containers, bare-metal clusters, etc.
Therefore I believe that solutions like docker and kubernetes are - given present architecture as I understand them - critically misaligned, in that they do not go far enough to abstract some target infrastructure related questions away from services. To do so would require reshuffling their APIs significantly and is thus unlikely to spontaneously occur in the near-term without concerted effort.
More recent iterations of the approach I have been taking assume that hypervisors, containers, jails, JVM guests or embedded systems firmware (eg. Android) should all be conceptually in-scope at the level of service authors. When considering the target deployment environment, networking is optionally in scope, and then only optionally TCP/IP. Given this redefined perspective, I believe that if a minimalist, process-oriented solution developed to facilitate the SaaS/unix SOA market is not robust enough to serve at least this range of alternative development trajectories, then in my view it is probably making invalid assumptions somewhere along the line. Of course, providing so general a tool usefully and without irritating developers or throwing up barriers to adoption is a real challenge.
One approach is to build something that solves the small problem but keeps enough options open in order to eventually grow to encompass the larger issues. I think this generally superior to the reverse approach, which tends to die from lack of adoption.
I don't know if docker, kubernetes, et. al. will actually get there. I agree that they will have to reshuffle and rethink to make it happen, but I hope that they can.
Implicit infrastructure is constructed reactively, over time, in response to evolving stimuli but also based upon dependencies or requirements specified or assumed. For instance, today this occurs in automated scale-out on some cloud systems. The author describes a conceptually similar (from the infrastructure specification and management standpoint) mode of operation here by suggesting the creation of new nodes in response to socket opens (networking events) on individual containers.
Ultimately, in the latter case you are giving up some degree of control and known state in favour of flexibility. This makes sense for some scenarios, but greatly complicates things in others. Both are valid but the viable domain of the latter is more limited.
Containers are giving us another opportunity to revisit these choices. I'm hoping we don't miss the opportunity again.
I think this is a key point to bring to light, because most of the hype around using containers seems to focus on the fact that you can replace the hypervisor layer with a container manager (docker) and achieve a ton of benefit. For most use cases there isn't a significant enough difference to matter.
Changing the paradigm for how applications are built and deployed is the key innovation that docker is offering us, but as you point out, there are still plenty of problems to solve in this area.
I've read some of the stuff on your website, it's very closely aligned to what I'm working on. We should talk in more detail.
I've been thinking about what we need to simplify distributed applications for the past few years, and we really need reusable components[1]. Anything we can do to make containers more consistent and easier to build is important.
[1] https://medium.com/@vishvananda/standard-components-not-stan...