Lifematics Corporate Blog

Lifematics社のコーポレートブログへようこそ!

あなたのSlurm環境に最適なのは?ApptainerとDockerの特性と使い分け徹底解説

皆さん、こんにちは!

HPC環境で計算を行う際、「環境構築が大変」「依存関係の衝突に悩まされる」といった経験はありませんか?

そんな悩みを解決してくれる強力なツールがコンテナです。

今回は、Slurm環境でコンテナ(ApptainerとDocker)をどのように活用し、より効率的な計算環境を構築できるかをご紹介します!

Slurmでコンテナを使うメリット

Slurmとコンテナを組み合わせることで、以下のような多くのメリットが得られます。

  • 環境の一貫性(ポータビリティ)

    • 必要なソフトウェアやライブラリをコンテナ内にまとめてパッケージングできるため、ユーザー間やクラスター間で同じ環境を簡単に再現できます。これにより、「動くマシンが変わっても同じ結果が得られる」という計算の再現性が実現されます。
  • 依存関係の衝突回避

    • ホスト環境に影響を与えることなく、独立した環境を構築できます。これにより、異なるバージョンのライブラリやツールを同時に使用できるようになり、環境設定の手間やトラブルを大幅に削減できます。
  • ユーザーの利便性向上

    • ユーザーが自由にソフトウェア環境を管理できるため、管理者が全てのパッケージを用意する必要がなくなります。新しいツールや実験的なソフトウェアも気軽に試せるようになります。
  • 移植性とクラウド対応

    • 同じコンテナイメージをオンプレミス環境とクラウド環境の両方で利用できるため、ハイブリッドクラウドやマルチクラウドでの運用がしやすくなります。

今回は、Slurm経由でApptainerとDockerのコンテナを利用する方法を実践してみましょう。

Apptainerの利用

Apptainer(旧Singularity)は、HPC環境で広く推奨されるコンテナソリューションです。

  • テストプログラムの作成

まず、Apptainerを使ってコンテナを実行するSlurmジョブスクリプトを作成します。

$ vi run_apptainer_test.sh
#!/bin/bash
#SBATCH --job-name=apptainer_test
#SBATCH --output=apptainer_test.out
#SBATCH --ntasks=1
#SBATCH --time=00:05:00

apptainer build lolcow.sif docker://sylabsio/lolcow
apptainer run lolcow.sif

このスクリプトは、sylabsio/lolcow というDockerイメージから lolcow.sif というApptainerイメージをビルドし、その後、そのイメージを実行します。

  • 実行

作成したスクリプトを sbatch コマンドで投入します。

$ sbatch run_apptainer_test.sh
Submitted batch job 687
  • 結果確認

ジョブが完了したら、結果ファイルを確認します。

$ ls -lt
-rw-r--r-- 1 life life 420 8月 4 11:34 apptainer_test.out
-rwxr-xr-x 1 life life 74985472 8月 4 11:34 lolcow.sif

$ cat apptainer_test.out
INFO: Starting build...
INFO: Fetching OCI image...
INFO: Extracting OCI image...
INFO: Inserting Apptainer configuration...
INFO: Creating SIF file...
INFO: Build complete: lolcow.sif
 _____________________________
< Mon Aug 4 11:34:32 JST 2025 >
 -----------------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

問題なく実行できました。

Dockerの利用

DockerもSlurm環境で利用できますが、Apptainerとは異なる特性があります。

ここでは、Dockerコンテナの実行と、よくあるトラブルシューティングについてご紹介します。

💡 ポイント:

事前に、sudo 不要でDockerが利用できるように設定しておく必要があります。

  • テストプログラムの作成

Dockerコンテナを実行するSlurmジョブスクリプトを作成します。

$ vi run_docker_test.sh
#!/bin/bash
#SBATCH --job-name=docker_test
#SBATCH --output=docker_test.out
#SBATCH --ntasks=1
#SBATCH --time=00:05:00

docker run hello-world

このスクリプトは、hello-world Dockerイメージを実行するだけのシンプルな内容です。

  • 実行

スクリプトを sbatch で投入します。

$ sbatch run_docker_test.sh
Submitted batch job 692
  • 結果確認

ジョブの出力ファイルを確認すると、エラーが表示されます。

 $ cat docker_test.out
 docker: permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Head "http://%2Fvar%2Frun%2Fdocker.sock/_ping": dial unix /var/run/docker.sock: connect: permission denied
 Run 'docker run --help' for more information
  • 原因の特定と解決

このエラーの原因は、GID(グループID)が計算ノードへ引き継げていないためです。

ローカル環境で id コマンドを実行すると docker グループ(例: 979(docker))に所属していることが確認できますが、srun で計算ノードに接続すると、そのグループ情報が失われていることが分かります。

ローカルで実行

$ id
uid=1000(life) gid=1000(life) groups=1000(life),10(wheel),979(docker)

srunで接続

$ srun --pty bash
$ id
uid=1000(life) gid=1000(life) groups=1000(life),10(wheel)

ご覧の通り、979(docker) がありません。

この問題を解決するには、Slurmの設定ファイル slurm.conf に LaunchParameters=disable_send_gids を追加します。

このフラグは「GID情報を送らない」という意味ですが、一部の環境でGID情報の送受信が原因でジョブ起動に失敗するケースがあるため、この設定を使用します。

  • slurm.conf 修正と設定反映
# vi /usr/local/etc/slurm.conf
# 以下の行を追加
LaunchParameters=disable_send_gids

# scontrol reconfigure # 設定を反映

設定が反映されたら、再度 srun で接続し id コマンドでDockerグループが引き継がれていることを確認します。

$ srun --pty bash
$ id
uid=1000(life) gid=1000(life) groups=1000(life),10(wheel),979(docker)

今度は 979(docker) が存在しますね。

  • 再度実行

設定変更後、Dockerのテストジョブを再度投入します。

$ sbatch run_docker_test.sh
Submitted batch job 693
  • 結果確認

出力ファイルを確認します。

$ cat docker_test.out
 Hello from Docker!
 This message shows that your installation appears to be working correctly.

 To generate this message, Docker took the following steps:
  1. The Docker client contacted the Docker daemon.
  2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
     (amd64)
  3. The Docker daemon created a new container from that image which runs the
     executable that produces the output you are currently reading.
  4. The Docker daemon streamed that output to the Docker client, which sent it
     to your terminal.

 To try something more ambitious, you can run an Ubuntu container with:
  $ docker run -it ubuntu bash

 Share images, automate workflows, and more with a free Docker ID:
  https://hub.docker.com/

 For more examples and ideas, visit:
  https://docs.docker.com/get-started/

問題なく実行できました。

まとめ

Slurmを用いるHPC環境では、Apptainer(旧Singularity)が推奨されます。

Apptainerは、非特権ユーザーでの実行が可能で、root権限を必要としないためセキュリティ面で安全です。

Dockerとは異なり、デーモンを使わずにSlurmと自然に連携でき、.sif イメージは管理・共有も容易です。

こうした特性から、マルチユーザーが共有する計算資源ではApptainerの方が扱いやすく、Slurmとの相性も良好です。

一方で、以下のようなケースではDockerも有用です。

また、特殊なDocker APIや一部のGPU機能はApptainerでは動作しない場合があるため、そのような際はSlurmでDockerを使用することも検討してみてください。

このブログ記事が、皆さんのHPC環境におけるコンテナ活用の一助となれば幸いです!