Dockerコンテナのライフサイクルの復習

Dockerのコマンドやコンテナのライフサイクルについて復習しました。

Docker のコンテナとプロセス

いままで docker run でコンテナとプロセスを同時に作っていて意識することはなかったのですが、コンテナとプロセスの生成を別でわけることもできるようです。

docker run = docker (create + start)

ベクトル的にはこんな感じの式になるのでしょうか。

Dockerコンテナの状態

Dockerのp26によると下記の状態があるようです。

  • created
  • running
  • paused
  • exited
  • restrting

createdexitedはプロセスが止まっている状態。違いは1度も起動されたことがないものがcreatedでそれ以外はexitedだそうです。

runningpausedはプロセスがある状態。ただし、pausedはプロセスが一時停止されている状態。

restartingdocker restartの実行中にだけなる一時的な状態だそうで、通常気にすることはないようです。exitedと区別する目的だと思います。

状態遷移図を書いてみた

ここを参考に状態遷移図をdotで書いてみました。

便宜的にdeletedの状態を作って可視化しています。

Dockerライフサイクル状態遷移図


おまけ

状態遷移図のときにつかったやつ

digraph docker_lifecycle {
  graph [
    charset = "UTF-8";
    compound = true;
    dpi = 410;
  ];

  node [
    shape = "circle";
  ];

  {rank=min; IMAGE; restarting; };


  {rank=same; created; paused; running; };

  {rank=max; exited; deleted; };

  IMAGE [
    group = 1,
    style = "dashed",
    shape = "box"
  ];
  created [
    group = 1
  ];
  deleted [
    group = 1,
    style = "dotted"
  ];

  restarting [
    style = "dotted",
    shape = "plain"
  ];
  paused [
    group = 3,
    color = "#0000ff",
    fontcolor = white,
    style = "filled"
  ];

  running [
    color = "#00ff00",
    style = "filled",
    group = 2
  ];
  exited [
    group = 2
  ];


  IMAGE -> running [ label = "docker run"];
  IMAGE -> created [ label = "docker create"];

  running -> paused [ label = "docker pause"];
  paused -> running [ label = "docker unpause"];

  created -> deleted [ label = "docker rm"];


  running -> exited [
    label = "docker stop/\ndocker kill"
  ];

  exited -> running [
    label = "docker start",
    constraint = false,
  ];

  running -> restarting [
    label = "docker restart",
  ];
  restarting -> running;

  created -> running [ label = "docker start"];

  exited -> deleted [ label = "docker rm", constraint=false];

}

参考

  • Docker