使用 LXD 容器隔離開發環境

我將討論一種在我的工作站上組織本地隔離開發環境的方法。此方法是在以下因素的影響下制定的:

  • 不同的語言需要不同的IDE和工具鏈;
  • 不同的項目可能使用不同版本的工具鍊和函式庫。

此方法是在筆記型電腦或工作站上本地運行的 LXD 容器內進行開發,並將圖形輸出重新導向到主機。

配置範例 Ubuntu的20.04.

文章末尾給出了對選項和原因的思考。

1.LXD安裝

В Ubuntu的20.04 LXD 不再可作為 deb 套件安裝,只能透過 snap 安裝:

$ 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.

存取容器的根shell:

$ 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

啟動火狐瀏覽器:

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

應用程式視窗將顯示在主機上,但它們將在容器內執行 - 類似於使用 ssh 轉送圖形。

我不會手動關閉正在運行的容器,因為我看不出它有什麼意義——我限制自己關閉正在運行的應用程式的視窗。

5.Заключение

我不喜歡使用主機作業系統進行開發,因為這需要安裝開發工具、偵錯庫版本、以特定方式配置系統元件以及其他操作。所有這些都可能導致其他非開發軟體甚至整個作業系統出現意外行為。例如,OpenSSL 配置的變更可能會導致作業系統停止正確啟動。

我嘗試過不同的工具來隔離開發環境:

  • 虛擬機器(KVM、VirtualBox 等)是最明顯的選擇,但它們消耗的資源明顯更多,儘管 Windows 下沒有其他開發選項(如果主機是 Linux);
  • 運行在本機上的雲端開發工具(容器或虛擬機器中的Cloud9、Eclipse Che等) - 它們不是為此操作模式而開發的,它們需要額外的配置和維護,最好將它們用於它們的預期目的 - 在雲端;
  • Docker 容器再次用於其他用途;在我看來,它們對於使用尚未打包在單獨容器中的軟體進行快速原型設計不太方便。

所選的方法以其簡單性和低進入門檻給我留下了深刻的印象。在容器本身中,您可以使用特定於專案的方法:手動安裝和設定所有內容,或使用自動化(Puppet、Ansible 等),甚至部署 基於 Docker 的基礎設施。我還使用 LXD 容器來運行特定軟體,這些軟體要么需要安裝大量依賴項,要么需要安裝不同的作業系統版本 - 在這種情況下,您可以建立具有所需作業系統版本的容器,例如 $ lxc launch images:ubuntu/16.04 dev16.

重要的是要記住,就隔離而言,與虛擬化相比,容器化具有更大的攻擊面 - 主機和容器共享單一核心,該漏洞可能允許惡意軟​​體從容器中逃脫。當試驗可疑軟體時,最好使用更合適的隔離機制。

有用的鏈接

來源: www.habr.com

添加評論