Apptainerとは何なのか?Dockerとの違いは?

ApptainerとDockerの違い

Apptainer(以前はSingularityとして知られていました)は、特に高性能計算(HPC)環境や科学研究の分野で人気がありますが、Dockerに比べていくつかのデメリットがあります。これらのデメリットは、主にApptainerの特定の設計哲学や機能セットに由来します。以下は、Dockerを使う場合に比べてApptainerを使用する際の主なデメリットです。

1. 普及度とコミュニティサポート

  • Dockerの方が普及しています: Dockerは、より広く普及しており、開発者やシステム管理者の間で広く採用されています。このため、Dockerには巨大なコミュニティと豊富なリソース(ドキュメント、チュートリアル、サポートフォーラムなど)が存在します。
  • コミュニティサポート: Apptainerは特定の用途(特にHPC)に特化しているため、Dockerほど大規模なコミュニティサポートを得られないことがあります。

2. ツールとエコシステム

  • エコシステムと統合: Dockerは、Kubernetesをはじめとするオーケストレーションツールとの統合が進んでおり、CI/CDパイプライン、クラウドサービス、開発ツールとの連携が容易です。Apptainerは、これらのエコシステムに対する統合が限られている場合があります。
  • 開発ツールとの互換性: Dockerは開発ワークフローに密接に統合されており、多くの開発ツールがDockerと連携しています。Apptainerは、HPCや科学研究に特化しているため、一般的な開発ツールとの互換性が低いことがあります。

3. 機能と使い勝手

  • 機能セット: Dockerは、ビルド、配布、実行の各段階で使用するための豊富な機能とオプションを提供します。Apptainerは、使いやすさとセキュリティに焦点を当てていますが、Dockerほど多様な機能を提供していない場合があります。
  • 初学者に対する使いやすさ: Dockerは広く採用されており、多くの情報源が存在するため、初学者が学習しやすい場合があります。Apptainerは、特定の用途や環境に特化しているため、学習曲線が急である可能性があります。

4. イメージの互換性とポータビリティ

  • イメージフォーマット: Apptainerは独自のイメージフォーマット(SIF)を使用しています。これはセキュリティと再現性に優れていますが、Dockerイメージフォーマットとの直接的な互換性はありません。一方、Dockerイメージは広く採用されており、多くのプラットフォームとサービスで直接使用することができます。

これらのデメリットは、使用する技術を選択する際に考慮すべき側面です。しかし、特定の用途や要件(特にセキュリティや科学研究の分野での使用)においては、Apptainerが提供する利点がこれらのデメリットを上回る場合があります。

Apptainerで簡単なWebアプリをホストする

ApptainerでWebアプリケーションをホストするには、まず基本的なApptainerの定義ファイルを作成し、その中でWebアプリケーションをセットアップして実行する必要があります。ここでは、Pythonを使用したシンプルなFlask Webアプリケーションの例を紹介します。

ステップ 1: Flask Webアプリケーションの作成

まず、簡単なFlaskアプリケーションを作成します。以下の内容をapp.pyというファイルに保存します。

from flask import Flask

app = Flask(__name__)

@app.route('/')
def home():
    return 'Hello, World from Flask!'

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

ステップ 2: Apptainerの定義ファイルの作成

次に、Apptainerのイメージを構築するための定義ファイル(例: webapp.def)を作成します。このファイルは以下のようになります。

Bootstrap: docker
From: python:3.8-slim

%files
    app.py /opt/webapp/app.py

%environment
    export FLASK_APP=/opt/webapp/app.py

%post
    pip install flask
    mkdir -p /opt/webapp

%runscript
    python /opt/webapp/app.py

この定義ファイルは、Apptainer(以前のSingularity)を使って、PythonベースのFlask Webアプリケーションを含むコンテナイメージを構築するためのものです。各セクションの役割を簡単に説明します。

BootstrapとFrom

  • Bootstrap: docker:この行は、ビルドプロセスがDockerハブからベースイメージを取得することを指示します。これにより、ApptainerはDockerのイメージレジストリを利用してイメージの構築を行います。
  • From: python:3.8-slim:この行で、使用するベースイメージを指定しています。ここでは、サイズが小さい(slim)Python 3.8のDockerイメージを使用します。

%files

  • このセクションでは、ホストマシンからコンテナイメージ内にファイルをコピーします。app.py /opt/webapp/app.pyは、ホストマシン上のapp.pyをコンテナ内の/opt/webapp/app.pyにコピーすることを指示しています。

%environment

  • export FLASK_APP=/opt/webapp/app.py:コンテナの環境変数を設定します。ここでは、Flaskが実行するアプリケーションの場所を指定しています。

%post

  • このセクションには、コンテナイメージのビルドプロセス中に実行されるスクリプトが含まれています。pip install flaskでFlaskがインストールされ、mkdir -p /opt/webappでアプリケーションのファイルを配置するディレクトリが作成されます。

%runscript

  • コンテナが実行されるときに実行されるスクリプトを定義します。ここでは、python /opt/webapp/app.pyでFlaskアプリケーションを起動しています。host='0.0.0.0'を指定しているため、コンテナ内のアプリケーションはすべてのネットワークインターフェースをリッスンし、外部からの接続を受け付けることができます。

ネットワーク設定

Apptainer(Singularity)コンテナは、デフォルトでホストのネットワーク名前空間を使用します。つまり、コンテナ内で実行されるアプリケーションは、ホストマシンのIPアドレスとポートを使用して外部と通信します。このため、ホストマシンとコンテナ間で特別なネットワーク設定を行う必要はありません。ただし、ポートが競合しないように、適切なポート番号を選択する必要があります。また、ホストマシンのファイアウォール設定を確認し、必要に応じて外部からコンテナのポートにアクセスできるように設定する必要があるかもしれません。

ステップ 3: Apptainerイメージのビルド

定義ファイルを使用してApptainerイメージをビルドします。この操作にはroot権限が必要になる場合があります。コマンドは以下のようになります。

sudo apptainer build webapp.sif webapp.def

 

ステップ 4: Webアプリケーションの実行

ビルドが完了したら、以下のコマンドでApptainerコンテナを実行し、Webアプリケーションをホストします。

apptainer run webapp.sif

これで、ブラウザからhttp://<ホストのIPアドレス>:5000にアクセスすることで、"Hello, World from Flask!"メッセージが表示されるはずです。<ホストのIPアドレス>は、実際にWebアプリをホストしているマシンのIPアドレスに置き換えてください。

注意点

  • 実際にデプロイする際には、開発用サーバー(app.run()で起動されるサーバー)の代わりに、本番環境向けのWSGIサーバー(例: Gunicorn)を使用することが推奨されます。
  • また、セキュリティの観点から、Flaskアプリやその他の依存関係を最新の安全なバージョンに保つことが重要です。
  • この例では簡単なアプリケーションを示しましたが、実際のアプリケーションでは、データベース接続やユーザー認証など、追加の設定やサービスが必要になる場合があります。

 

使用方法: apptainer [グローバルオプション...]

説明: Apptainerコンテナは、アプリケーションと環境の移植性を通じてコンピューティングの移動性を実現するアプリケーション仮想化レイヤーを提供します。Apptainerを使用すると、Apptainerがインストールされている他のLinuxシステム上で実行できるルートファイルシステムを構築できます。

オプション: -d, --debug デバッグ情報を表示(最高詳細度) -h, --help apptainerのヘルプ --nocolor カラー出力なしで印刷(デフォルトはFalse) -q, --quiet 通常の出力を抑制 -s, --silent エラーのみを印刷 -v, --verbose 追加情報を印刷

利用可能なコマンド: build Apptainerイメージを構築 cache ローカルキャッシュを管理 capability ユーザーとグループのLinux機能を管理 exec コンテナ内でコマンドを実行 help 任意のコマンドについてのヘルプ inspect イメージのメタデータを表示 instance サービスとして実行中のコンテナを管理 key OpenPGPキーを管理 oci OCIコンテナを管理 plugin apptainerプラグインを管理 pull URIからイメージを引っ張る push 提供されたURIにイメージをアップロード remote apptainerリモートエンドポイントを管理 run コンテナ内でユーザー定義のデフォルトコマンドを実行 run-help イメージのユーザー定義ヘルプを表示 search コンテナライブラリでイメージを検索 shell コンテナ内でシェルを実行 sif siftoolはSingularity Image Format(SIF)ファイル操作のプログラム sign イメージに暗号署名を添付 test コンテナ内のユーザー定義テストを実行 verify イメージに添付された暗号署名を検証 version Apptainerのバージョンを表示

例: $ apptainer help <コマンド> [<サブコマンド>] $ apptainer help build $ apptainer help instance start

追加のヘルプやサポートが必要な場合は、https://www.apptainer.org/docs/ をご覧ください。

コメント