LXD コンテナーを使用した開発環境の分離

私のワークステーション上でローカルに分離された開発環境を編成するアプローチについて説明します。 このアプローチは、次の要因の影響を受けて開発されました。

  • 言語が異なれば、必要な IDE とツールチェーンも異なります。
  • プロジェクトが異なれば、異なるバージョンのツールチェーンとライブラリを使用する場合があります。

このアプローチは、ラップトップまたはワークステーション上でローカルに実行される LXD コンテナ内で開発し、グラフィック出力をホストにリダイレクトすることです。

構成例 Ubuntuの20.04.

オプションとその理由についての考察は、記事の最後に記載されています。

1.LXDのインストール

В Ubuntuの20.04 LXD は deb パッケージとしてインストールできなくなり、スナップ経由でのみインストールできます。

$ snap install lxd

インストール後、初期化を実行する必要があります。

$ lxd init

変更する唯一のパラメータは storage bakend - 私が使う dir 最も単純なものとして。 写真やコピーを使用していないため、警告は ドキュメンテーション 彼らは私を怖がらせません:

同様に、ディレクトリ バックエンドは最後の手段として検討してください。
すべての主要な LXD 機能をサポートしていますが、実行できないため非常に遅く非効率的です。
インスタント コピーまたはスナップショットを使用するため、毎回インスタンスのストレージ全体をコピーする必要があります。

2.LXDプロファイルの設定

LXD のプロファイル — これらは、複数のコンテナに適用されるパラメータのセットです。 私のニーズでは、デフォルトで作成された唯一のプロファイルで十分です default 次の変更が加えられます。

  • $ lxc profile device add default X0 disk source=/tmp/.X11-unix/X0 path=/tmp/.X11-unix/X0 — コンテナ内のアプリケーションがホスト X11 サーバーと対話できるようにするため。
  • $ lxc profile set default environment.DISPLAY :0 - 環境変数が DISPLAY コンテナに正しくインストールされました。
  • $ lxc profile set default raw.idmap "both 1000 1000" - 正しいために 識別子のマッピング.

3. コンテナの作成と設定

イメージに基づいてコンテナを作成する images:ubuntu/20.04:

$ lxc launch images:ubuntu/20.04 dev1

リポジトリからの画像の方が好きです https://images.linuxcontainers.org、プリインストールされているソフトウェアが少ないためです。 このため、接頭辞を追加しました images: 画像名に。 Ubuntu リポジトリのイメージに基づいてコンテナーを作成するには、次のように実行できます。 $ lxc launch ubuntu/20.04 dev1.

コンテナのルートシェルへのアクセス:

$ lxc exec dev1 -- bash

Firefox と VS Code を (リポジトリから) インストールします 指示に従って):

$ apt update
$ apt install curl gpg firefox

$ curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > packages.microsoft.gpg
$ install -o root -g root -m 644 packages.microsoft.gpg /usr/share/keyrings/
$ echo "deb [arch=amd64 signed-by=/usr/share/keyrings/packages.microsoft.gpg] https://packages.microsoft.com/repos/vscode stable main" > /etc/apt/sources.list.d/vscode.list

$ apt update
$ apt install code

わかりやすくするためにコンテナも含めます。

poweroff

ボーナス! コンテナ内で実行されているアプリケーションがグラフィックス カードを使用できるように、GPU をコンテナに投入するのは非常に簡単です。 これを行うには、次のものが必要です。

  • デバイスを追加 $ lxc config device add dev1 mygpu gpu;
  • ビデオ カード ドライバーをコンテナーにインストールします。ホストにインストールされているものと同じものです。

4. コンテナの使用

コンテナーがまだ実行されていない場合は、コンテナーを起動する必要があります。

lxc start dev1

非 root ユーザーとして VS Code を実行する Ubuntuの:

lxc exec dev1 -- sudo --login --user ubuntu code

Firefox を起動します。

lxc exec dev1 -- sudo --login --user ubuntu firefox

アプリケーション ウィンドウはホスト上に表示されますが、ssh を使用したグラフィックの転送と同様に、コンテナ内で実行されます。

私は実行中のコンテナを手動でシャットダウンすることはあまり意味がないと考えているので、実行中のアプリケーションのウィンドウを閉じることに限定しています。

5。 結論

開発にはホスト OS を使用しないことを好みます。これは、開発ツールのインストール、ライブラリのデバッグ バージョン、特定の方法でのシステム コンポーネントの構成、その他の操作が必要になるためです。 これらすべてが、他の非開発ソフトウェア、さらには OS 全体で予期しない動作を引き起こす可能性があります。 たとえば、OpenSSL 構成を変更すると、OS が正しく起動しなくなる可能性があります。

開発環境を分離するためにさまざまなツールを試しました。

  • 仮想マシン (KVM、VirtualBox など) が最も明白なオプションですが、Windows での開発には他にオプションがありません (ホストが Linux の場合) にもかかわらず、かなり多くのリソースを消費します。
  • ローカル マシン上で実行されるクラウド開発ツール (コンテナまたは仮想マシン内の Cloud9、Eclipse Che など) - これらはこの動作モード用に開発されていないため、追加の構成とメンテナンスが必要です。目的の目的で使用するのが最善です。目的 - クラウド内。
  • Docker コンテナーは、やはり別の目的で使用されますが、私の意見では、まだ個別のコンテナーにパッケージ化されていないソフトウェアを使用して迅速にプロトタイプを作成するのにはあまり便利ではありません。

選択したアプローチは、そのシンプルさと参入障壁の低さに感銘を受けました。 コンテナ自体では、プロジェクト固有のアプローチを使用できます。すべてを手動でインストールして構成するか、自動化 (Puppet、Ansible など) を使用し、デプロイすることもできます。 Dockerベースのインフラストラクチャ。 また、LXD コンテナーを使用して、多数の依存関係または別の OS バージョンのインストールが必要な特定のソフトウェアを実行します。この場合、たとえば、目的の OS バージョンでコンテナーを作成できます。 $ lxc launch images:ubuntu/16.04 dev16.

分離の観点からは、コンテナ化には仮想化に比べて攻撃対象領域が大きいことを覚えておくことが重要です。ホストとコンテナは単一のコアを共有しており、この脆弱性によりマルウェアがコンテナから逃れられる可能性があります。 疑わしいソフトウェアを実験する場合は、より適切な分離メカニズムを使用することをお勧めします。

便利なリンク集

出所: habr.com

コメントを追加します