Ubuntu Weekly Recipe

第824回Dockerコンテナをダイレクトに動かせるようになった「Incus 6.3」を⁠Ubuntu 24.04で試す

世間はDocker一色と言っても過言ではない中、本連載では何度も、LXDとそのフォークであるIncusを紹介してきました。そのIncusのバージョン6.3では、Dockerコンテナを直接起動できるようになりました。今回はUbuntu 24.04 LTSに最新安定板のIncusをインストールして、Incusのシステムコンテナと、Dockerのアプリケーションコンテナを共存させる方法を紹介します。

昨今のコンテナ事情

IT業界にいると、避けては通れない技術トピックというものがいくつか存在します。Linuxやサーバーの分野では、ここ数年はやはりコンテナでしょう。

コンテナについて簡単におさらいしておくと、特定のプロセスを、ホストOSとは異なる空間内に隔離して実行する技術です。これはLinuxカーネルが持つ、namespaceやcgroupといった機能によって実現されています。

コンテナは「コンテナイメージ」によって提供されます。このイメージ内には、プロセスが動作するのに必要な環境一式が含まれています。このイメージをルートファイルシステムとしてマウントすることで、隔離空間内のプロセスはあたかも、専用のOSを占有しているかのようにふるまえます。イメージには、⁠プロセスが動作するのに必要な環境一式が入っている」という点がポイントです。つまりコンテナは本質的に自己完結しており、依存関係を持ちません。これは従来のパッケージシステムと比較して、アプリケーションのポータビリティを飛躍的に向上させます。

つまりコンテナは、アプリケーション実行環境をOSから切り離し、持ち運びを可能にします。これによって、以下のようなメリットが生じます。

  • アプリケーションのデプロイやロールバックが簡単になる
  • ホスト環境を汚さない
  • 同一環境を容易に再現可能

コンテナは、サーバーサイドのWebアプリケーションのデプロイはもちろん、デスクトップアプリケーションの配布にもよく利用されています。特にサーバーサイドでは、昨今の高速な開発サイクルを回す上で、必要不可欠になっていると言えるでしょう。またCI/CDワークフロー内など、ユーザーが直接触れない部分でも、コンテナは日常的に利用されています。まさに、現在のITインフラを支える技術のひとつです。

Open Container Initiative(OCI)という標準化団体が存在し、コンテナイメージのフォーマットや、実行環境に関する標準規格が定められています。そのためOCI標準に準拠していれば、どのような実行環境を使っても、同じようにコンテナを動かせます。つまり実装としてのDocker自体にこだわる必要はないのですが[1]、やはり圧倒的な知名度を持ち、ユーザー数も多いのは、間違いなくDockerでしょう。

軽量な仮想マシンとしてのコンテナ

Dockerは、単一のプロセスのみを実行することを主目的としています。例えばWebサーバーであるnginxを動かすコンテナであれば、PID 1として、nginxのマスタープロセスが直接起動します。こうしたコンテナを「アプリケーションコンテナ」と呼びます。⁠コンテナは専用のOSを占有しているようにふるまう」と述べましたが、Dockerコンテナの中身は、一般的なLinuxの環境とはだいぶ様子が違います。そのためDockerでアプリケーションを動かすには、Dockerの流儀に合わせて、コンテナイメージをビルドしなくてはなりません。これを「Dockernize」と呼ぶのですが、⁠ちょっとアプリをインストールして試してみたい」ようなレベルであっても、いちいちDockernizeしなくてはいけないのは面倒です。

そこで開発や検証を目的として、一般的なフル機能のLinux環境がほしくなることはよくあります。かといって仮想マシンを用意し、わざわざOSのセットアップから始めるのは時間もかかるし、面倒くさいですよね。サクっとシェルを取得して、使い慣れたコマンドでパッケージをインストールできるような環境を、インスタントに使い捨てられたら便利そうです。そして、このようなコンテナを提供するのがIncusです。IncusのコンテナはDockerとは異なり、カーネルをホストと共有すること以外は、通常のLinuxと変わりません。PID 1としてinitが起動し、様々なプロセスが並列して動作します。こうしたコンテナを「システムコンテナ」と呼びます。Incusを使えば、まさに軽量な仮想マシン感覚で、コンテナを扱えるのです。

同じコンテナではありますが、Incusが仮想マシンの延長にあるのに対し、Dockerはむしろパッケージシステムに近い立ち位置にあると筆者は考えています。

DockerとIncusの共存

筆者のように、検証目的でクリーンなUbuntuの環境を量産したい人間からすると、Incusは一度使ったら手放せないツールのひとつです。しかし世間では(筆者の業務でも⁠⁠、コンテナと言えば圧倒的にDockerです。そのためどうしても、Dockerの実行環境を手元に持っておく必要があります。

しかしIncusとDockerを同一ホスト上に共存させると、ネットワーク回りの設定でトラブルが起きることもあったため[2]、なるべく避けたいところです。かといって物理マシンは増やしたくありません。そこで今までは、Incusのシステムコンテナ内でDockerを動かす、いわゆるNested Containersで対応していました。しかしこれはこれで、コンテナの層がひとつ増えてしまうため、なんともすっきりしませんよね。

ですがIncus 6.3では、IncusでDockerコンテナをダイレクトに起動できるようになった、というのが今回の本題です[3][4]

最新安定板Incusのインストール

Ubuntu 24.04 LTSのサーバー版にIncusをインストールします。Incus自体はUbuntuのリポジトリでも提供されているのですが、24.04では、そのバージョンは長期サポート版である6.0です。今回は機能リリース版である6.3を利用したいため、Zabblyが提供しているStableリポジトリを利用します。

まず以下のコマンドで、リポジトリの公開鍵をダウンロードします。

$ sudo curl -fsSL https://pkgs.zabbly.com/key.asc -o /etc/apt/keyrings/zabbly.asc

続いて以下のコマンドで、APTのリポジトリを追加します。

$ sudo sh -c 'cat <<EOF > /etc/apt/sources.list.d/zabbly-incus-stable.sources
Enabled: yes
Types: deb
URIs: https://pkgs.zabbly.com/incus/stable
Suites: $(. /etc/os-release && echo ${VERSION_CODENAME})
Components: main
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/zabbly.asc

EOF'

以下のコマンドでincusパッケージをインストールします。

$ sudo apt install -U -y incus

Incusへのアクセスは、⁠incus-admin」「incus」という、ふたつのグループで制御されています。incus-adminはIncusに対するあらゆる操作が許可されるグループです。ホストのルートファイルシステムをマウントして、特権コンテナの起動も可能なため、実質的にrootと同等の存在だと言ってよいでしょう。対してincusは、Incus自体の設定等はできず、各ユーザーのプロジェクト内で、基本的なアクセスのみが許可されます。

今回はユーザーをincusグループに追加し、管理権限が必要な場合はincus-adminではなく、sudoを使うことにしました。以下のコマンドでユーザーをincusグループに追加した後、ログインし直してください。

$ sudo gpasswd -a ユーザー名 incus

「incus version」コマンドを実行してみましょう。バージョン6.3(もしくはそれ以降)がインストールされていればOKです。

$ incus version
クライアントバージョン: 6.3
サーバのバージョン: 6.3

Incusの初期設定とコンテナの起動

最初にroot権限を使い、incusの基本的な設定をします。対話的にいくつかの質問がなされますが、すべてデフォルトのままEnterを押して構いません。詳しくは第521回「LXDの初期設定」も参照してください。

$ sudo incus admin init

以下のコマンドでコンテナを起動できるか確認してみましょう。

$ incus launch images:ubuntu/noble noble

$ incus list
+-------+---------+----------------------+-----------------------------------------------+-----------+-----------+
| NAME  |  STATE  |         IPV4         |                     IPV6                      |   TYPE    | SNAPSHOTS |
+-------+---------+----------------------+-----------------------------------------------+-----------+-----------+
| noble | RUNNING | 10.163.242.31 (eth0) | fd42:89d3:d62f:fd74:216:3eff:fe35:5802 (eth0) | CONTAINER | 0         |
+-------+---------+----------------------+-----------------------------------------------+-----------+-----------+

Ubuntu 24.04のシステムコンテナが起動しました。ここまでは通常のIncusと同じです。

Docker Hubの追加

Dockerコンテナを動かすため、IncusのリモートサーバーにDocker Hubを追加します。以下のコマンドを実行してください。

$ incus remote add docker https://docker.io --protocol=oci

「incus remote list」でリモートサーバーの一覧が確認できます。⁠docker.io」がociプロトコルで追加されていることが確認できました。

$ incus remote list
+----------------+------------------------------------+---------------+-------------+--------+--------+--------+
|      NAME      |                URL                 |   PROTOCOL    |  AUTH TYPE  | PUBLIC | STATIC | GLOBAL |
+----------------+------------------------------------+---------------+-------------+--------+--------+--------+
| docker         | https://docker.io                  | oci           | none        | YES    | NO     | NO     |
+----------------+------------------------------------+---------------+-------------+--------+--------+--------+
| images         | https://images.linuxcontainers.org | simplestreams | none        | YES    | NO     | NO     |
+----------------+------------------------------------+---------------+-------------+--------+--------+--------+
| local (現在値) | unix://                            | incus         | file access | NO     | YES    | NO     |
+----------------+------------------------------------+---------------+-------------+--------+--------+--------+

Dockerコンテナの実行

それではいよいよIncus上で、直接Dockerコンテナを起動してみましょう。以下のコマンドで、Docker Hubからnginxのコンテナイメージをpullして起動します。

$ incus launch docker:nginx nginx

nginxコンテナが起動しました。コンテナタイプに(APP)と書かれていることからもわかるとおり、Dockerのアプリケーションコンテナです。

$ incus list
+-------+---------+-----------------------+-----------------------------------------------+-----------------+-----------+
| NAME  |  STATE  |         IPV4          |                     IPV6                      |      TYPE       | SNAPSHOTS |
+-------+---------+-----------------------+-----------------------------------------------+-----------------+-----------+
| nginx | RUNNING | 10.163.242.229 (eth0) | fd42:89d3:d62f:fd74:216:3eff:fe9d:a533 (eth0) | CONTAINER (APP) | 0         |
+-------+---------+-----------------------+-----------------------------------------------+-----------------+-----------+
| noble | RUNNING | 10.163.242.31 (eth0)  | fd42:89d3:d62f:fd74:216:3eff:fe35:5802 (eth0) | CONTAINER       | 0         |
+-------+---------+-----------------------+-----------------------------------------------+-----------------+-----------+

nginxコンテナのIPアドレスに対して、curlしてみましょう。テキストなので少々わかりづらいですが、nginxのデフォルトページが返ってきているのが確認できます。

$ curl http://10.163.242.6
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

OCI準拠のコンテナレジストリであれば、Docker Hub以外も追加できます。例えばRed HatのQuayを追加するには、以下のコマンドを実行します。

$ incus remote add quay https://quay.io --protocol=oci

$ incus remote list
+----------------+------------------------------------+---------------+-------------+--------+--------+--------+
|      NAME      |                URL                 |   PROTOCOL    |  AUTH TYPE  | PUBLIC | STATIC | GLOBAL |
+----------------+------------------------------------+---------------+-------------+--------+--------+--------+
| docker         | https://docker.io                  | oci           | none        | YES    | NO     | NO     |
+----------------+------------------------------------+---------------+-------------+--------+--------+--------+
| images         | https://images.linuxcontainers.org | simplestreams | none        | YES    | NO     | NO     |
+----------------+------------------------------------+---------------+-------------+--------+--------+--------+
| local (現在値) | unix://                            | incus         | file access | NO     | YES    | NO     |
+----------------+------------------------------------+---------------+-------------+--------+--------+--------+
| quay           | https://quay.io                    | oci           | none        | YES    | NO     | NO     |
+----------------+------------------------------------+---------------+-------------+--------+--------+--------+

Quayにある、Podmanのサンプルコンテナを実行してみましょう。可愛いアザラシの群れが表示されましたね!

$ incus launch quay:podman/hello --console --ephemeral podman
Launching podman
!... Hello Podman World ...!

         .--"--.           
       / -     - \         
      / (O)   (O) \        
   ~~~| -=(,Y,)=- |         
    .---. /`  \   |~~      
 ~/  o  o \~~~~.----. ~~   
  | =(X)= |~  / (O (O) \   
   ~~~~~~~  ~| =(Y_)=-  |   
  ~~~~    ~~~|   U      |~~ 

Project:   https://github.com/containers/podman
Website:   https://podman.io
Desktop:   https://podman-desktop.io
Documents: https://docs.podman.io
YouTube:   https://youtube.com/@Podman
X/Twitter: @Podman_io
Mastodon:  @Podman_io@fosstodon.org

普段はIncusを使っているけれど、Dockerもちょっと使えないと困る。そんなユーザーにとって、まさに待望の新機能と言えるのではないでしょうか。

おすすめ記事

記事・ニュース一覧