1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

DockerとKubernetesを同居させたらcontainerdが競合してDockerが動かなくなった話

Posted at

はじめに

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.iodocker-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クラスターが動作しなくなるのでは?」と懸念されるかもしれません。

しかし、その心配は不要です。containerdcontainerd.ioは、どちらも同じUnixドメインソケット(/run/containerd/containerd.sock)を使用します。そのため、Kubernetes側から見ればコンテナランタイムへの接続先に変更はなく、問題なく動作し続けます。

このように、適切にセットアップを行うことで、一台のマシン上でDockerとKubernetesを共存させることが可能です。

まとめ

本記事では、DockerとKubernetesを同一マシン上で利用する際に発生したcontainerdの競合問題と、その解決策について解説しました。

コンテナランタイムのような共通コンポーネントが、意図しないトラブルを引き起こす可能性があるため、環境を構築する際にはパッケージの依存関係に注意を払うことが重要です。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?