🐳

ProxmoxのLXCコンテナでDockerコンテナが起動しなくなる問題の対処法

に公開

この記事は

ProxmoxのLXCコンテナでUbuntuサーバーを運用している際、apt upgradeを実行したところDockerコンテナが起動できなくなる問題が発生しました。

この問題の解決方法と原因について解説します。

参考:

https://github.com/opencontainers/runc/issues/4968

問題の症状

apt upgrade実行後にDockerコンテナを起動しようとすると、起動に失敗する状態になりました。

具体的には以下のようなエラーが発生します。

$ docker run hello-world
docker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: open sysctl net.ipv4.ip_unprivileged_port_start file: reopen fd 8: permission denied

Run 'docker run --help' for more information

解決方法

Proxmoxホストの/etc/pve/lxc/<コンテナID>.confに以下の2行を追加します。

/etc/pve/lxc/<コンテナID>.conf
lxc.apparmor.profile: unconfined
lxc.mount.entry: /dev/null sys/module/apparmor/parameters/enabled none bind 0 0

たとえばコンテナIDが100の場合、/etc/pve/lxc/100.confを編集します。

編集後、LXCコンテナを再起動すると、以下のようにDockerコンテナが正常に起動するようになります。

$ docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

原因の詳細

この問題は、runcのセキュリティアップデート(CVE-2025-52881対応)とLXCのAppArmorプロファイルの相互作用によって発生しています。

問題の核心

  1. runcの変更点
    セキュリティ強化のため、runcがprocfsへのアクセス方法を変更(分離されたマウントを使用するように)

  2. AppArmorの誤認識
    この変更により、AppArmorが/proc/sys/net/ipv4/ip_unprivileged_port_startなどへのアクセスを誤って/sys/net/ipv4/...へのアクセスと判定

  3. アクセス拒否
    LXCのAppArmorプロファイルには/sysディレクトリへの書き込みを制限するルールがあるため、Dockerコンテナの起動時にアクセスが拒否される。

なお、Proxmox開発チームは既にこの問題を認識しており、パッチの開発が進められています。
https://bugzilla.proxmox.com/show_bug.cgi?id=7006

設定内容の詳細

追加した2行についての解説。

1行目: lxc.apparmor.profile: unconfined

何をするか

LXCコンテナのAppArmorプロファイルを「無制限(unconfined)」に設定します。

なぜ必要か

  • 問題の根本原因は、AppArmorが /proc/sys/... へのアクセスを /sys/... へのアクセスと誤認識すること
  • LXCのデフォルトAppArmorプロファイルには /sys ディレクトリへの書き込みを禁止するルールがある
  • unconfined にすることで、AppArmorによるアクセス制限が完全に無効化され、誤認識による拒否が起きなくなる

2行目: lxc.mount.entry: /dev/null sys/module/apparmor/parameters/enabled none bind 0 0

何をするか

/dev/null(空のデバイスファイル)を/sys/module/apparmor/parameters/enabledにバインドマウントします。

なぜ必要か

  • Docker自身もAppArmorを使用してコンテナをセキュア化しようとする
  • Dockerは起動時に/sys/module/apparmor/parameters/enabledをチェックして、システムでAppArmorが有効かどうか確認する
  • LXCコンテナ内からは実際のカーネルのAppArmor状態にアクセスできない(権限不足)
  • /dev/nullをマウントすることで、このファイルが「存在するが中身が空」という状態になり、DockerはAppArmorが無効と判断する
  • これにより、Dockerが独自のAppArmorプロファイル(docker-default)を適用しようとして失敗することを防ぐ

セキュリティ上の注意

まとめ

ProxmoxのLXCコンテナでapt upgrade後にDockerが起動しなくなる問題の対処法を紹介しました。

同様の問題に直面した場合は、ぜひ試してみてください。

Discussion