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?

More than 3 years have passed since last update.

unprivilegedなLXDコンテナ上でDockerコンテナを動かす

Last updated at Posted at 2020-05-08

LXDコンテナの上でDockerを動かしたいという気持ちになったのですが,ググって出てくる解決方法がsecurity.nestingsecurity.privilegedtrueにするものだけでした.
ただ,コンテナ内でCUDAを使いたいときとかにnvidia.runtimeを使うのですが,privilegedなコンテナではこのオプションが使えません (起動でコケます).
これではホストとコンテナのCUDAドライバーのバージョンを手動で一致させてあげる必要があり,非常にだるいです.
そこで,非特権コンテナ上でDockerを動かす方法を探ってみました.

環境等

  • Ubuntu 18.04 LTS
  • LXD version: 4.4
  • Docker version: 19.03.8
  • LXD,Dockerのストレージドライバはそれぞれzfs,overlay2 (デフォルト)
  • LXDコンテナはゲストユーザーが利用するためprivilegedにしたくない
  • LXDコンテナ内でCUDAを使う
    • CUDAを使うだけならnvidia.runtime=trueにするだけでいい
  • LXDコンテナ内でNVIDIA Dockerを使いたい

解決方法

どうやらLXDのストレージドライバがzfsだと死ぬらしい -> zfs以外にすればよいのでは?
ということで,結果として

  1. LVMのボリュームグループ(VG)を作る
  2. lxc storage create <LXDのストレージプール> lvm source=<作ったVG>でストレージプールを作る
  3. LXDコンテナのrootデバイスにこのストレージプールを指定してコンテナを作る

ことで,非特権でも中でDockerが動くLXDコンテナが作れました.

1の手順を飛ばしlxc storage createでストレージドライバーをlvmにしてストレージプールを作ることもできるのですが,この場合ブロックデバイスが (たしか) /var/snap/lxd/common/lxd/disks/配下に作られるだけなので,ホスト上に直にVGを作るよりもパフォーマンスは落ちます.
あとクラスタ構成の場合はこの手は使えない (loopデバイスを参照できず落ちる) ので,ちゃんと各ノード上でVGを作ってあげる必要があります.

他にもDockerのストレージドライバをoverlay2以外にするとか方法は色々ありますが,手軽さとコンテナのパフォーマンスを考慮してこれに落ち着きました.

ちなみに,DockerのストレージドライバにもzfsはあるのでLXDのストレージドライバと一致させたらいけそうですが,LXDコンテナ内から見てみるとlxcfsという別のドライバにラップされているためできません.

また,別の方法としてrootlessバージョンのdockerをインストールする方法もあります.こちらでも動作が確認できました.

ただ,どちらの方法でも以下の問題点があります.

未解決の問題

通常のDockerコンテナはこれで十分なのですが,GPUを使うものだと以下のようなエラーを吐いて死にます.

docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "process_linux.go:449: container init caused \"process_linux.go:432: running prestart hook 0 caused \\\"error running hook: exit status 1, stdout: , stderr: nvidia-container-cli: mount error: write error: /sys/fs/cgroup/devices/docker/120159eccefb2caae5671cc8b60abe83d11ac8621582406980f63091ab4504fb/devices.allow: operation not permitted\\\\n\\\"\"": unknown.

ちょっとよくわからないので勉強中です...
コメント欄でぜひ教えてください.お願いします.

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?