はじめに
containerdは、DockerやKubernetesなどで広く利用されている、軽量なコンテナランタイムです。
今回、Dockerがインストール済みのマシンにKubernetesクラスターを構築した際、このcontainerdが原因でDockerデーモンが起動しなくなる、という問題に遭遇しました。
本記事では、この問題が発生した原因と、その具体的な解決方法について詳しく解説します。
発生したトラブル
Ubuntu 22.04で、既にDockerがインストール済の環境に新たにKubernetesクラスターをkubeadmで作ろうとしました。
具体的な手順は、自作のAnsible Playbook(showchan33/k8s-setup)を使用し、以下のコマンドを実行しました。
ansible-playbook site_control-plane.yml
すると、これまで動いていたDockerコンテナが起動しなくなってしまいました...
$ docker ps -a
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
デーモン再起動も失敗します。
$ sudo systemctl start docker
Failed to start docker.service: Unit docker.service is masked.
maskを外して再度起動しても失敗...
$ sudo systemctl unmask docker
Removed /etc/systemd/system/docker.service.
$ sudo systemctl enable docker
docker.service is not a native service, redirecting to systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable docker
$ sudo systemctl start docker
Job for docker.service failed because the control process exited with error code.
See "systemctl status docker.service" and "journalctl -xeu docker.service" for details.
journalを見ると、以下のようにdockerdが存在しないと言っています。
$ sudo journalctl -xeu docker --no-pager -n 32
...
11月 02 08:42:39 my-machine docker[121362]:  * /usr/bin/dockerd not present or not executable
...
原因の特定
調査を進めた結果、原因はAnsible Playbook内でcontainerdパッケージをapt経由でインストールしたことにあると判明しました。具体的には、以下に相当するコマンドを実行していました。
sudo apt -y install containerd
Dockerは、コンテナランタイムとしてcontainerdを利用していますが、aptで提供されるcontainerdパッケージとは別に、Docker社が提供するcontainerd.ioというパッケージに内包された独自のcontainerdを使用します。
Dockerの公式ドキュメントにも記載がある通り、aptでインストールするパッケージはcontainerd.ioであり、containerdとは名称が異なります。
今回のトラブルは、containerdを単独でインストールしたことにより、Dockerが依存するcontainerd.ioと競合し、Dockerデーモンが起動しなくなったものと考えられます。
これに関連する記述は、Dockerのドキュメントの中でも以下のように書かれています。
Docker Engine depends on containerd and runc. Docker Engine bundles these dependencies as one bundle: containerd.io. If you have installed the containerd or runc previously, uninstall them to avoid conflicts with the versions bundled with Docker Engine.
以下は和訳です。
Docker Engine は、containerd と runc に依存しています。
Docker Engine は、これらの依存関係を containerd.io という1つのバンドルとしてまとめています。
もし以前に containerd や runc をインストールしている場合は、Docker Engine に同梱されているバージョンと競合しないように、それらをアンインストールしてください。
改めてDockerがインストールされている状態で sudo apt -y install conteinerd を実行したところ、以下のメッセージが出力されて containerd.io と docker-ce が削除されているのがわかりました...
The following additional packages will be installed:
  runc
The following packages will be REMOVED:
  containerd.io docker-ce
The following NEW packages will be installed:
  containerd runc
0 upgraded, 2 newly installed, 2 to remove and 14 not upgraded.
対処法
この問題を解決するには、競合の原因となっているcontainerdと関連パッケージをアンインストールし、Docker Engineとcontainerd.ioを再インストールする必要があります。
Dockerの公式ドキュメント(2025年11月2日現在)に記載されている、以下のコマンドで関連パッケージを削除します。
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done
その後、ドキュメントの手順に従ってDocker関連のパッケージを再インストールすることで、dockerコマンドが再び利用できるようになります。
Kubernetesクラスターは動く?
「containerdをアンインストールし、containerd.ioをインストールすると、Kubernetesクラスターが動作しなくなるのでは?」と懸念されるかもしれません。
しかし、その心配は不要です。containerdとcontainerd.ioは、どちらも同じUnixドメインソケット(/run/containerd/containerd.sock)を使用します。そのため、Kubernetes側から見ればコンテナランタイムへの接続先に変更はなく、問題なく動作し続けます。
このように、適切にセットアップを行うことで、一台のマシン上でDockerとKubernetesを共存させることが可能です。
まとめ
本記事では、DockerとKubernetesを同一マシン上で利用する際に発生したcontainerdの競合問題と、その解決策について解説しました。
コンテナランタイムのような共通コンポーネントが、意図しないトラブルを引き起こす可能性があるため、環境を構築する際にはパッケージの依存関係に注意を払うことが重要です。