On one of my systems, dockerd is using the systemd-managed containerd (via a socket /run/containerd/containerd.sock). On another system it’s using its own instance via a socket /run/docker/containerd/containerd.sock.
Docker was not started with --containerd argument and it hasn’t got a /etc/docker/dameon.json file.
So I’m puzzled why it’s using the system containerd rather than its own. The docs suggest that the --containerd option is required to make it work like that. Or does it see there’s a systemwide instance and choose to use it without being told?
What is the difference between those systems? What are the docker versions? Can you check the path of the running containerd? is that also different or only the socket? I would also check the packages like this way on a debian based system:
ArchLinux is not a supported platform. I suppose you used “pacman” to install Docker. Am I right? I don’t have an ArchLinux to try so I don’t know how it installs Docker and when and why the installation can be different.
I can see that on your workstation containerd is disabled and inactive. It is possible that Docker on ArchLinux starts its own containerd, because the system wide containerd could not be started for some reason. I wanted to try it before I saw your response, but I realized, I can’t deletecontainerd without deleting Docker and I can’t stop and disable containerd, because systemd starts it when I start Docker or run a container (in case I stop containerd after starting Docker).
It is also possible that it works differently because the Docker versions are different and the newer release (not created by Docker) is just works differently.
I did some digging around today and dockerd does not start containerd if it is already running (from what I can tell, this is determined by the existence of the socket /run/containerd/containerd.sock).
You can see this in debug log:
Containerd not running, starting daemon managed containerd
libcontainerd: started new containerd process" pid=615962
ccResolverWrapper: sending update to cc: {[{unix:///var/run/docker/containerd/containerd.sock <nil> 0 <nil>}] <nil> <nil>}" module=grpc
whereas, if containerd is already running only the last line appears but with different socket path: