こんにちは。まゆみです。
Docker に関する記事をシリーズで書いています
Dockerを使っている方なら、コマンド『run』を使わない日はないですよね。
ただ、Docker にはrun の他に『start』コマンドもあり、両者は似て非なるものです。
今回の記事では
run と start コマンドの違い
を詳しく解説していきたいと思います。
ではさっそく始めていきますね。
run コマンド
run コマンドは実は、二つのコマンドの機能が組み合わさってできています。
run = create + start
Docker Container を最初から作ってデフォルトのコマンドまで実行したい時は run
既にDocker Container が作られている時、そのContainer を実行するには start
ということになります
runがcreate と start が組み合わさってできているものだと分かったところで、ではcreate とstart は何をしているのか見てみましょう
create とstartがしていること
create というのはDocker Image からContainer を作りますが、その時Docker Imageにあるファイルシステムのスナップショットを引っ張ってきてContainerを作ってくれます。
create の仕事はここまでです。
Image のなかにはそれぞれ、デフォルトのコマンドがプログラムされていて、それが 『start』のコマンドをうつことによって実行されます
では実際にhello-world のContainer を
run
create + start
でそれぞれ実行してみましょう
run で実行
docker run hello-world
でデフォルトコマンドの実行までしてくれます
create とstart で実行
①docker create hello-world を実行すると、Container ID のみ返されます。
②docker start を実行すると、Container ID のみ返されます
③docker start -a で実行すると、デフォルトのコマンドを表示して実行してくれます
ということで、
run = create + start
であるわけですが、
run は-a を付けなくても、デフォルトのコマンドを表示してくれるのに対して、start は -a を付けないとデフォルトのコマンドを表示してくれない
という違いもありますので、頭の片隅に置いておいてくださいね。
デフォルトのコマンドを上書きした場合はどうなるか?
docker run <container ID> (別のコマンド)
でデフォルトのコマンドを(別のコマンド)に上書きする事ができます
ただ、そのコマンドがContainer の元になっているImageのファイルシステムにない場合は上書きする事はできません。
例えば、hello-world はechoのコマンドが入っていないので、
docker run hello-world echo hi
としても、
hi を返してくれません。
ただ、『busybox』Imageには、ファイルシステムにecho のコマンドが入っているのでデフォルトのコマンドをechoのコマンドに上書きする事ができます。
(下記参考)
busyboxを使ってcreate とstartによってContainer を作ったあと、デフォルトのコマンドと上書きしたコマンドがどうなるか見てみましょう
上の実行結果のスクショから
①createでデフォルトのコマンドが『echo hi』に上書きされたContainer を作る
②start -a でContainer を実行すると、上書きされたコマンドの実行結果を返される
③ただ、さらに上書きする事はできない
ただ、run コマンドでは毎回上書きされたコマンドが表示されます。
なぜなら、run では、Image から引っ張ってきてContainerを新たに作るからです。
まとめ
今回の記事はここで締めくくらせていただきます
runとstart の違いを理解するのにお役に立てたなら幸いです。