swarm タスクの状態

Docker でサービスを作成すると、タスクを開始します。サービスは期待状態(desired state)として記述されており、タスクはそれを動かします。動かすとは、以下の手順で swarm ノード上にスケジュールします。

  1. docker service create を使ってサービスを作成
  2. Docker manager ノードにリクエストが渡る
  3. Docker manager ノードは適切なノード上でサービスを実行するようスケジュールする
  4. 各サービスは複数のタスクを開始できる
  5. タスク毎にライフサイクルと状態を持ち、状態とは NEWPENDINGCOMPLETE のようなもの

タスクとは、実行が完了するまでの実行を指す単位です。タスクが停止すると再び実行しませんが、新しいタスクがその場所に配置されます。

タスクの利点とは、完了や失敗に至るまで数々の状態を持ちます。タスクの進行には数々の状態がありますが、状態は巻き戻りません。たとえば、 COMPLETE のタスクは決して RUNNING になりません。

タスクの状態は、以下の順番で遷移します。

タスク状態 説明
NEW (新規) タスクの初期化
PENDING (保留) タスクに対するリソースが割り当てられた
ASSIGNED (割り当て) Docker がノードにタスクを割り当てた
ACCEPTED (承認) タスクが worker ノードによって承認(受け入れ)。worker ノードがタスクを拒否すると、状態は REJECT に遷移
PREPARING (準備中) Docker はタスクを準備中
STARTING (開始中) Docker はタスクの開始中
RUNNING (実行中) タスクが実行中
COMPLETE (完了) タスクがエラーコード無く終了
FAILED (障害) タスクがエラーコードと共に終了
SHUTDOWN (停止) Docker がタスクの停止を供給
REJECTED (拒否) worker ノードがタスクを拒否
ORPHANED (孤立) 長期間にわたりノードが停止
REMOVE (削除) タスクは停止していないものの、関連するサービスが削除されたかスケールダウン

タスク状態の表示

タスクの状態を取得するには docker service ps <サービス名> を実行します。 CURRENT STATE 列でタスクの状態と、どれだけ存在しているかが分かります。

$ docker service ps webserver
ID             NAME              IMAGE    NODE        DESIRED STATE  CURRENT STATE            ERROR                              PORTS
owsz0yp6z375   webserver.1       nginx    UbuntuVM    Running        Running 44 seconds ago
j91iahr8s74p    \_ webserver.1   nginx    UbuntuVM    Shutdown       Failed 50 seconds ago    "No such container: webserver.…"
7dyaszg13mw2    \_ webserver.1   nginx    UbuntuVM    Shutdown       Failed 5 hours ago       "No such container: webserver.…"