入力 ubuntu:latest ZimaOSの「カスタマイズしたアプリをインストール」欄に入力しても、常時稼働する小さなUbuntuサーバーが自動的に作成されるわけではありません。そのイメージは最小限のUbuntuコンテナファイルシステムであり、完全な起動シーケンス、SSHデーモン、サービスマネージャー、バックグラウンドで実行されるアプリケーションがあらかじめ設定された仮想マシンではありません。
この違いが、2025年10月の元の事例を説明します。イメージをプルしてコンテナを作成することはできましたが、ユーザーが期待した方法では稼働し続けませんでした。適切な解決策は本当の目的によって異なります。コンテナ内で1つのアプリケーションを実行するのか、それともVM内で汎用のDebian/Ubuntuオペレーティングシステム全体を実行するのか、という違いです。
Dockerコンテナは小さな仮想マシンではない
仮想マシンは完全なコンピューター環境をエミュレートし、独自のオペレーティングシステムスタックを起動します。コンテナはホストのLinuxカーネルを共有し、独自のユーザー空間で1つ以上の分離されたプロセスを実行します。
Dockerのモデルは、コンテナのメインプロセスを中心に成り立っています。フォアグラウンドプロセスが終了すると、デタッチされたコンテナも終了します。そのため通常、コンテナはWebサーバー、データベース、同期デーモン、アプリケーションワーカーなど、長時間稼働するサービスを中心に構築されます。
UbuntuとDebianの公式イメージは最小限のベースイメージ
現在のUbuntu公式イメージは、Canonicalの最小ルートファイルシステムを基に構築されており、Dockerはこれを完全なVMアプライアンスではなく、最小限のインストールとして説明しています。同様に、Debian公式イメージも最小限の minbase ルートファイルシステム。
ターミナルを使って対話的に起動すると、シェルが使えるため、小さなLinux環境のように感じられます。そのシェルを終了すると、コンテナを稼働させ続けるフォアグラウンドサービスが残っていない可能性があります。
いずれかを事前構成済みのサーバーアプライアンスとして扱う前に、Ubuntu公式の保守されたベースイメージ情報、またはDebian公式の保守されたベースイメージ情報を確認してください。
ubuntu:latest がすぐに停止する理由
ZimaOSでは、インストールしたDockerアプリに、意味のある長時間稼働プロセスがあることを想定しています。最小限のディストリビューションイメージは通常、別のイメージの基盤、または対話型シェル環境として使われます。PID 1として維持されるサービスプロセスが設定されていない場合、コンテナは「クラッシュ」するのではなく、正常に終了することがあります。
ZimaOSがイメージのインストールに失敗したと判断する前に、コンテナーログと終了状態を確認してください。アプリケーションが設定されていない状態で終了したコンテナーは、起動後にエラーを出すサービスとは別の問題です。
1つのアプリケーションだけが必要な場合は、アプリケーションから始める
元のユーザーは、実際には完全なVMを求めていたのではなく、1つのアプリケーション(iDrive)とNASストレージへのアクセスを求めていると説明しました。その場合、最適なDocker設計は通常、実際のアプリケーション用に保守されているイメージを見つけるか、そのアプリケーションをインストールして起動する小さなイメージを構築することです。
コンテナーでは、アプリケーションに必要なポート、ボリューム、認証情報、デバイスだけを公開します。永続ファイルは、使い捨てのコンテナーレイヤー内だけでなく、ZimaOSの割り当て済みストレージに保存してください。
実際のコンテナーサービスにはDocker Composeを使用する
コミュニティからの回答では、単に入力するのではなく、適切なCompose定義を使用するよう提案されました。 ubuntu:latest およびコンテナー名に記述します。現在のZimaOSはさらにその方向へ進み、Docker Composeのインポート、YAMLの編集、ライフサイクル制御付きのマルチコンテナースタックの実行が可能です。
現在のIceWhaleのガイダンスでは、標準的なコンテナーランタイム設定はDocker Composeに記述し、ZimaOS固有のストアメタデータは x-casaos.
ディストリビューションのイメージ名だけを完全なアプリケーション定義として扱うのではなく、セルフホストアプリ向けの現在のZimaOS Composeモデルを使用します。
NASストレージをコンテナーに割り当てる
アプリケーションが1つのディレクトリへのアクセスだけを必要とする場合は、その実際のZimaOSフォルダーをコンテナーに割り当てます。ホスト側は、目的のストレージプール上にあるバックアップフォルダーまたはデータフォルダーを指し、コンテナー側ではアプリケーションが想定するシンプルなパスを公開します。
現在のZimaOSでは、ホストストレージをコンテナーパスに割り当てる方法を説明しています。1つのフォルダーにアクセスするためだけにDebian VM全体を実行するより、通常はこちらのほうが軽量です。
ソフトウェアが完全なLinuxマシンを必要とする場合はZVMを使用する
アプリケーションのインストーラーが次のようなものを想定している場合は、VMのほうが適しています。
- 従来型のパッケージマネージャーと変更可能なシステムファイルシステム
- systemd、または複数のOSレベルサービス
- コンテナでは安全に提供できないカーネルレベルの動作
- 従来型のSSH管理Linuxサーバー環境
- Ubuntu/Debianのインストールを明示的にサポートしているが、Dockerはサポートしていないベンダーのソフトウェア
スタンドアロンのDebianまたはUbuntuオペレーティングシステムが目的なら、ベースコンテナイメージを完全なVMのように動作させようとするのではなく、ZVMを使うという点で、最初のコミュニティからの回答と一致します。
代わりにアプリをZimaOSのルートファイルシステムへインストールしない
「Ubuntuコンテナが終了する」から「ZimaOS自体にaptでソフトウェアをインストールしよう」と考えるのは、通常は誤った方向です。現在のZimaOSでは、設計上ほとんどのシステムフォルダーが読み取り専用になっており、汎用的なDebian/Ubuntuホストに apt 通常のアプリケーション管理モデルとして。
コンテナとVMが存在するのは、アプリケーションの依存関係をZimaOSのベースシステムから分離できるようにするためです。
Debian/Ubuntuベースイメージが依然として役立つ場合
からビルドする正当な理由があります ubuntu または debian対象ソフトウェアがそれらのディストリビューション向けのインストール手順しか公開していない場合や、イメージのビルド時にそれらのパッケージリポジトリが必要な場合があります。
その場合は、アプリケーションをインストールし、実際にフォアグラウンドで実行するコマンドを定義したDockerfileまたはComposeベースのイメージを作成します。シェルに手動で入り、対話的にパッケージをインストールし、変更したコンテナが永続的なアプリになることを期待してはいけません。イメージに組み込まれていない変更や永続ボリュームに保存されていない変更は、コンテナの再作成時に失われる可能性があります。
再起動ポリシーは、メインプロセスの不足を補うものではありません
Dockerの再起動ポリシーは、再起動後や予期しない終了後に復帰させたい、実際のサービスに有用です。しかし、終了済みのシェルセッションをアプリケーションサーバーに変えるものではありません。コンテナで実行すべき処理がすでに完了している場合、繰り返し再起動してもループが発生するだけです。
ソフトウェアに適した、最小限の分離レイヤーを選ぶ
- アプリに保守されているDockerイメージがすでにある:そのイメージを使用します。
- Ubuntu/Debianの依存関係からパッケージ化できる:適切なアプリケーションコンテナを構築します。
- アプリに完全な従来型Linuxホストが必要:ZVMを使用します。
- ストレージへのアクセスだけが必要:ディスク全体を仮想化するのではなく、必要なNASフォルダーをマッピングします。
ZimaOS上のUbuntuとDebianに関するFAQ
ubuntu:latestはインストールできるのに、なぜ起動したままにならないのですか?
ベースディストリビューションのイメージは、自動的に常時稼働するサービスになるわけではありません。Dockerコンテナには、稼働し続けるメインプロセスが必要です。
ubuntu:latestは完全なUbuntu仮想マシンですか?
いいえ。ホストカーネルを共有する、最小限のコンテナ用ユーザー空間です。
すべてのLinuxアプリケーションでZVMを使うべきですか?
いいえ。ソフトウェアがコンテナに対応しているなら、通常は本格的なDockerアプリケーションのほうが軽量で管理しやすいです。
ZVMを選ぶのが適しているのはどんな場合ですか?
ソフトウェアが従来型の変更可能なUbuntu/Debianサーバーを前提とし、コンテナには適さないシステムレベルのサービスやインストール要件を必要とする場合は、VMを使用します。
