After reading this post plus all the discussion around people confusing lxc and lxd and after struggling myself to distinguish between the two, please allow me to make a suggestion as to why.
First, lxd depends on lxc libraries. On some distros (such as Gentoo, my home distro, which compiles every package) you have to install the package in order to get the libraries. So already there, it’s impossible to follow the advice “It’s generally a bad idea to mix and match LXC and LXD on the same system, in my opinion, because you are likely to get confused, or LXC and LXD might get themselves confused with sharing resources like namespaces, etc. I am not aware of any good use case for using both, so you should really decide on which one to use, and stick with it.”
Second, the choice of names for the command-line tools in lxd is unfortunate. We have ‘lxc- <function’ in lxc, and the command line tool ‘lxc <function’ in a package called lxd (which also happens to have a command-line tool called ‘lxd’!). Worse, the functionality is often very similar. I understand the thinking that went behind the naming (i.e. ‘client vs. daemon’) but it does not look like much thought went into avoiding name collisions with the established package.
Given this, is it really surprising that people confuse the two?
I know making naming changes in software projects is like turning a container ship. But perhaps we could think about consolidating lxc and lxd in a monolithic package in future, as it’s not clear what benefit keeping them separate has, and in any case, for some distros, the dependency of lxd on liblxc makes keeping them separate in any clean, supportable way almost impossible.