LXDコンテナ内でDockerを動かす方法 - ネスト設定のトラブルシューティング
Arcane Weeklyへようこそ。今回は、日常的にはあまり遭遇しないかもしれませんが、いざ直面したときにすぐ解決できると非常に便利な問題についてお話しします。使用するツールはLXDコンテナとDocker。ミッションは、この2つを同時に動かすこと、より具体的には、LXDコンテナを作成し、その中でDockerコンテナを起動することです。なぜそんなことをするのかって?やってみたかったから、それだけの理由です。
すると、次のような問題にぶつかります。Dockerの実行が失敗し、以下のエラーが表示されるのです。
docker: Error response from daemon: OCI runtime create failed:
container_linux.go:367: starting container process caused:
process_linux.go:495: container init caused:
rootfs_linux.go:60: mounting "proc" to rootfs at "/proc" caused: permission denied: unknown.
かなり長いエラーメッセージですね。それでは、デバッグしていきましょう。
問題の詳細
通常、Dockerコンテナを実行する際に「/proc」へのアクセスで問題が起こることはありません。しかし、上記のエラーはそれができないことを示しています。このメッセージは情報量が多く、誤解を招く手がかりになりがちです。確かに、この問題が発生する原因は無数に考えられます。私の場合、セットアップは真っ新なバニラ状態で、特別なカスタマイズは一切ありませんでした。他のエラーも発生しておらず、実用上はDockerは正しくインストール・設定されていました。
そこで、LXDがどのように動作しているのかを調べてみれば、問題の本質が見えてくるかもしれないと考えました。実際、古い半ばドキュメント化された記事を見つけ、そこで状況が説明されていました。セキュリティ上の理由から、コンテナは「/proc」や「/sys」に安全でない方法でアクセスすることが許可されていないのです。これに対する回避策(ただしセキュリティ上の影響が伴います)は、そのようなアクセスを明示的に許可することです。
解決策
必要なのは、該当するコンテナに対してネスト(入れ子構造)を許可することです。新しいコンテナを作成する場合は、次のコマンドを使用します。
lxc launch "image" "container name" -c security.nesting=true
コンテナがすでに存在する場合は、起動前に次のコマンドで設定を変更します。
lxc config set "container name" security.nesting true
そして、コンテナを起動します。
lxc start "container name"
すでにコンテナが実行中の場合は、一度停止してポリシーを設定し、再度起動してください。この操作は非破壊的なので、コンテナ作成後に問題に気づいた場合でも、内部の作業内容やデータを失うことはありません。また、設定はいつでも完全に元に戻せます。これで作業は完了です。
まとめ
約5年前から存在している問題に、今になって初めて遭遇したというのは興味深いことです。あるいは、多くの人がこの問題に直面しているにもかかわらず、関連情報が少なく、あちこちに散在しているのも事実です。ネストされたコンテナを利用したい場合は、LXDで該当コンテナのセキュリティポリシーを編集しましょう。比較的シンプルなテクニックです。もちろん、特権コンテナと非特権コンテナの概念や、その他のセキュリティ上の考慮点など、さらに踏み込んだトピックもあります。しかし、あなたの仕事がセキュリティ関連でない限り、この変更によるデメリットはほぼありません。
より充実したドキュメントがあれば助かるのですが。もう少し分かりやすいエラーメッセージだともっと良いでしょう。それまでの間、自分の環境でなぜ権限エラーが発生しうるのかを考えてみてください。それが正しい方向へと導いてくれるはずです。問題を正しく定式化できれば、解決までの道のりは8割方完成したも同然です。これでコンテナの中にコンテナを格納できます。「よう、コンテナが好きなんだって?じゃあ君のコンテナの中にコンテナを入れておいたよ」……まるで映画『インセプション』ですね。おまけに、宇宙が崩壊するまで何段階のネストが可能か、ぜひ試してみてください。
それでは、また次回。
-
VirtualBoxでNATネットワークを構築する方法|複数VMに個別IPを割り当てる設定ガイド
先日、VirtualBoxを使っていて興味深い問題に遭遇しました。複数の仮想マシン(VM)で小さなプライベートネットワークを構築しようとしたのです。1台をサーバーとし、残りのマシンをクライアントとしてエージェントソフトを実行し、サーバーへ結果をレポートする構成です。一見シンプルな話ですが、ここで問題が発生しました。NAT接続したすべてのマシンが、まったく同じIPアドレス「10.0.2.15」を持ってしまったのです。実際、最も基本的なVM構成——つまり各マシンが単一のNATアダプターのみを使用する場合——では、複数のマシンを同時に稼働させていても、それぞれが同一のIPアドレスを取得してしまいます
-
VirtualBoxでディスクをクローンする方法【VBoxManage活用チュートリアル】
仮想化を業務でも趣味でも利用している方なら、VirtualBoxという強力かつ多用途な無料ソリューションを目にしたことがあるかもしれません。VirtualBoxは、デスクトップユーザーに対して、あらゆる形でOSを展開できる大きな柔軟性を提供してくれます。さらに、単なる趣味として仮想化を楽しんでいるだけでなく、仮想化を通じて新しいOSを学ぼうとする熱心なソフトウェア愛好家の方であれば、次のような場面に必ず直面することでしょう。それは「大量の仮想マシンを展開する必要がある」というシナリオです。一台ずつインストール作業を行う時間的な余裕はないはずです。実際、大規模に環境を展開する際に手動で一つずつマ