Cirrus CLIとは何ですか?次の説明は、CirrusCLIGitHubページの説明から抜粋したものです。
Cirrus CLIは、コンテナ化されたタスクをあらゆる環境で再現可能に実行するためのツールです。最も一般的には、Cirrusタスクは継続的インテグレーションワークフローの一部として使用されますが、ヘルパースクリプト/Makefileの気密置換としてローカル開発プロセスの一部として使用することもできます。 Cirrus CLIは、CIまたは同僚のマシンで実行されるのと同じ方法でタスクをローカルで実行します。コンテナの不変性により、ローカルにあるパッケージのバージョンに関係なく、タスクが数年後に同じように実行されることが保証されます。
Cirrus CLIは当初からDockerをサポートしていましたが、rootとして実行され、特権の低いユーザーにアクセスを提供するコンテナーデーモンを要求することは、オプションではない場合があります。たとえば、共有マシンでビルドする場合、ネストされたコンテナーを分離する場合、または単にセキュリティである場合などです。 -デスクトップで何が実行されるかを意識します。
また、Dockerは約1年前にルートレスモードを導入しましたが、パッケージの欠落とDockerがデーモンであった歴史が主な原因で、現在、そのユーザーエクスペリエンスは私たちの意見では不足しています。一方、Podmanはデーモンレスコンテナエンジンとして始まり、そのインストールプロセスは事実上すべてのディストリビューションをカバーしています。
その上、Cirrusタスクを実行するための追加オプションとしてPodmanを調査したところ、最終的にはソフトウェアの品質が向上するため、ソフトウェアのモノカルチャーを混乱させるための小さな一歩であることがわかりました。 Rootless Containersプロジェクトのような新しい標準とビルディングブロックが出現し、ソフトウェアの将来への道を開きます。
ルートレスコンテナは...名前空間を利用していますか?
Linux名前空間は、コンテナーをLinux上で機能させるための最も重要な基盤です。これらはLinux固有のものであり、WindowsとmacOSでコンテナを実行すると別のLinuxVMが起動します。
名前空間により、リソースをきめ細かく分離できます。たとえば、プロセスが特定のPID名前空間に接続されている場合、同じ名前空間に接続されている他のプロセスのみが表示されます。または、FUSEファイルシステムがルートにマウントされている場合(/
)別のマウント名前空間にある間、バイナリが欠落しているためにホストが突然クラッシュすることはありません。
最もトリッキーな名前空間の1つは、ユーザーの名前空間です。ユーザー名前空間では、基本的に、その名前空間内でルートになることができますが、外部からは通常のユーザーとして表示されます。ほとんどのコンテナイメージは特定の操作のルートとして実行されることを想定しているため、ルートのないコンテナではユーザーの名前空間を実装することが重要です。
複数のユーザーがDockerを使用してビルドコマンドをなしで起動するとどうなるか見てみましょう。 有効なユーザー名前空間:

コンテナホストからこれらのプロセスのIDを監視する場合、さまざまなユーザーによって開始されているにもかかわらず、すべてのジョブはルートの下で実行されます。同じことがcontainerd
にも当てはまります 。実際に渡すこともできますが、--userns-remap
フラグを立てると、コンテナは引き続きルートとして実行され、単一障害点になります。
ルートレスコンテナの実装は簡単ではないため、デフォルトモードではそのように実行されます。
ユーザーの名前空間自体は、セキュリティ関連の多くのバグを実装および生成するための最も複雑な構成の1つです。 Debianのような一部のディストリビューションは、しばらく前にデフォルトでそれらを無効にすることさえ選択しました。
[見逃した場合:コンテナとコンテナランタイムの基本的なセキュリティ原則]
Podmanがルートレス実行の問題を解決する方法
ルート権限なしでコンテナを起動するには、いくつかの妥協と回避策が必要です。
たとえば、ユーザーとして、ネットワーク名前空間(ユーザー名前空間に付属している必要があります)を作成すると、lo
のみが取得されます。 インターフェース。通常、コンテナエンジンはveth
も作成します デバイスがペアになり、その一方の端をホストに戻して、実際のネットワークインターフェイスまたはブリッジに接続します(コンテナ間通信用)。
ただし、ホスト上のインターフェースを接続するには、ホストの名前空間のルートである必要があるため、それは不可能です。 Podmanは、カーネル機能を使用する代わりに、コンテナとモニター自体の間でパケットをルーティングするネットワークスタックであるslirp4netnsを使用してこれを回避します。したがって、スーパーユーザー権限は必要ありません。
ユーザーの名前空間は複雑であるため、ホストのルートで通常使用できる特定のファイルシステムを使用することもできません。それらのファイルシステムの1つはOverlayFSです。これは、コンテナーイメージレイヤーの複製解除に大いに役立ち、コンテナーエクスペリエンスを向上させます。ただし、FUSEは引き続き使用できます。 Podmanチームはfuse-overlayfs
を実装しました 、インストールされている場合に使用されますが、パフォーマンスを犠牲にして、イメージの内容をディレクトリに抽出するだけにフォールバックします。
さて、以前と同じジョブを実行しますが、Podmanを使用すると、結果は次のようになります。

現在、rootとして実行されるものはなく、コンテナエンジンが何らかの理由でクラッシュした場合の単一障害点はないことに注意してください。
Podmanとの統合
cirrus run
を使用して新しいビルドを開始する場合 、内部でPodmanプロセスを生成し、古いVarlinkAPIの後継として最近導入されたRESTAPIを介してPodmanプロセスと通信します。

API自体はDockerEngineAPIによく似ており、同じコードベース内の両方のAPIをクリーンに抽象化できます。
実際、まったく同じPodmanエンドポイントがDocker Engine API互換性レイヤーを提供していますが、執筆時点ではまだ作業中です。
CLIでPodmanを有効にする
Podmanをまだインストールしていない場合は、Linuxディストリビューションの指示に従ってから、ルートレスチュートリアルを読んでください。
CLIはPodmanバージョン0.17.0以降をサポートします。 --container-backend=podman
を渡すことで有効にできます フラグ:
cirrus run --container-backend=podman Lint
システムにDockerがインストールされていない場合は、何も指定する必要はありません。すべてが自動的に機能します。
[コンテナを使い始めますか?この無料コースをチェックしてください。コンテナ化されたアプリケーションのデプロイ:技術的な概要。 ]
まとめ
ルートレスビルドは、コンテナー展開の重要なコンポーネントです。 Cirrus CLIはPodmanと連携して、この機能を提供します。これらの2つのユーティリティを使用して、コンテナ環境をより適切に管理および保護します。