When you ship batteries, people depend on the batteries and that means you can't really swap them when you want to because things stop fitting. It doesn't help that all of this is baked by default into a single monolithically versioned binary with an API whose documentation isn't nearly rigorous or stable enough to promote alternative implementations.
I like Docker or I wouldn't be here commenting, but you know what would make me love Docker? If every piece was pipeable CLI command.
Like...
docker-listen tcp://,... | docker-run --image-tar=blah --container-tar=blah | docker-monitor --log-file=blah | docker-swarm --orchestrator-socket=orch.sock | docker-link --port=some.other.machine:port
I know this is a crazy rethinking of how Docker's APIs work, but I think that fact perfectly demonstrates my point about how un-modular Docker really is as far as its users are concerned.