Containers are a simpler solution than Operating Systems. Operating Systems is a tightly bound non-simplistic system that breeds complexity, just as you state npm does. Because those interfaces are tightly bound, we were not about to build on top of them. Almost immediately after we got Docker, we got K8s. Once we got Docker we got the ability to manage these things at a higher level. That's the mark of a more simple solution.
Are there things that Docker can't do? Are there things that require so much performance that Docker can't handle it? Only then should you step back to the more powerful solution.
Not to say that there aren't problems with Docker. Dockerfiles have a lot to improve. Running containers has a lot to improve.
I think. I'm still at a state where I might change my mind. It's partially why I'm posting this.
[0]: https://blog.codinghorror.com/the-principle-of-least-power/