2017-03-09 4 views
1

ドッカー/コンテナにはかなり新しく、コードを見て分かりやすくしようとしています。libcontainer、runc、およびnsenterブートストラップ

runCを見ると、古いコードベースのnsinitとよく似たlibcontainerが使用されているようですが、libcontainerの使い方を理解するための出発点として、またlibcontainerの仕組み。

私が理解しにくい点の1つは、ブートストラッププロセスとnsexecのCコードへの呼び出しです。

私は、呼び出し元のアプリケーション(runC/libcontainer)がコンテナプロセスに制御を渡す前に、名前空間などの初期化を行う必要があることを広く理解していますが、この段階的な説明ではわかりません。誰もこのエリアの良いドキュメントを知っていますか?

このブートストラッププロセスの一環として、Cコードは "init" cmd行フラグを付けてrunC(のクローン/子)をコールバックしますか?ここで良い説明があるよう

答えて

1

ここに説明があります。あなたはthis documentを読むことができますが、それはちょっと古くて正直です。効果的にこれがどのように機能するかです。

あなたは囲碁プログラムで"github.com/opencontainers/runc/libcontainer/nsenter"をインポートすると、我々は前のGoランタイム「ブーツ」nsexec実行を行うために移動コンパイラに指示しますいくつかの魔法の__attribute__のものを持っています。効果的には、これは、runCプログラムを実行するたびに、Goランタイムが開始する前にコード(github.com/opencontainers/runc/libcontainer/nsenter/nsexec.c)が実行されることを意味します。

通常のユーザープロセスを実行しているときにrunCを呼び出すと、このコードは実際には何もしません。しかし、あなたのプロセスがコンテナ初期化プロセス(_LIBCONTAINER_INITPIPE環境変数を持っている)なら、_LIBCONTAINER_INITPIPEで指定されたファイル記述子から一束の構成情報を読み込み、それに応じて名前空間などを設定します。これがすべて設定されると、関数が戻り、Goランタイムが​​コードに起動し、コンテナの設定が確定します。

すべてのコードは、runCスプリット前にlibcontainerがどのように動作したかとかなり似ています。

関連する問題