こんにちは、まゆみです。
Dockerについての記事をシリーズで書いています。
前回の記事で、Dockerの学習準備編として、
- Docker を学ぶべき理由
- Dockerは水面下ではどのように動いているのか
- Dockerで使われる用語を少し紹介
をざっくり、解説させていただきました。
今回の記事では、実際にコマンドラインを利用してDocker Client(CLI)からDocker Server に命令を出してみたいと思います
#最初に覚えるべきコマンドは「run」
Docker Imagesは、あなたが自分で書いたDockerfileからも作ることができますが、今回の記事では、Docker hubにアクセスしてDockerfile からImageを作っていこうと思います。
上記のイラストで言えば、ピンクの点線で区切られている地点からのContainer の作成になります。(DockerfileからDocker Imageを作る方法はまた別の記事に書きます)
Container を作り実行してくれるのは「run」というコマンドになります
docker run <イメージ名>
では、Docker hub にある『hello-world』を引っ張ってきて、Container を作ってみましょう。(Dockerfileは下記のようにDucker hub にあります)
docker run hello-world
上記のコードを実行すると下記のような結果になります
ここで注目してほしいのが、
Unable to find image 'hello-world:latest' locally
と書かれている部分です。
上記の文を翻訳すると
あなたのパソコン内に最新バージョンのhello-world imageは見つかりませんでした
ということになります
そしてその次の文には
Pulling from Library/hello-world(ライブラリーから引っ張ってきます)
と書かれています
すなわち、
Docker client から
⇩
Docker server に命令が出され
⇩
Docker server がキャッシュから目当てのimageがないか探します。
⇩
初めてimageを作る時はキャッシュにはimageが無いので、Docker hub に行き目当てのfileからimageを作る
のです。
一度hello-worldでコンテナを実行した後は、キャッシュからimage を引っ張ってContainerを作ることになります
#ps と ps -a コマンド
では次に、実行『中』と、実行『された後』のContainer の情報を見るにはどうしたら良いでしょうか?
また、どのような時にContainer の情報を見ることが必要なのでしょうか?
Container が作られると、それぞれのContainer に、Container ID や名前が付与されます。
それらのContainer に対して、何かしらの命令を出したい時 (Container を削除したい、Container に別のコマンドを実行させたいetc...) にはContainer ID か名前を添えなければならないので、そのようにIDや名前を調べないといけない時、Container 情報を表示する事の出来るコマンドは便利です。
ps は実行『中』のContainer を
ps -a は実行『された後』のContainer も含めて
表示してくれます
下記に、実行結果のスクショを貼っておきます
上のスクショから分かるように、現在実行中のContainer はありませんので、
docker ps
の次の行には、Container が書かれていません。
しかし、
docker ps -a (docker ps --allでも可)
では、過去に実行したContainerを表示してくれます。
#rm コマンド・system prune コマンド
では次に、今現在、溜まっているContainer を削除するコマンドを紹介します
docker rm <container id> (もしくはcontainer name)
rm コマンド(removeの略)になります
container id もしくはcontainer name が必要なので、先ほど紹介した docker ps -a コマンドも合わせて使って、使わないContainer を削除しましょう
上記のように、ps -a で調べた Container ID をrm の後ろにコピペします。
上記のコマンドを実行して、Container ID のみ表示されれば、そのContainer は削除されています
今現在、使っていないContainer が複数あるので、rm で一つづつ削除するのが面倒くさい時は
docker system prune
で一気に削除する事ができます
Are you sure you want to continue? [y/N]
本当に消しても良いのか?
と聞かれますので、『y』を入力してください。
すると、Container は全て消されます。
#docker images コマンド・rmi コマンド
ImageとContainer は別物ですね。
Container はImage から作られるインスタンスになります。
なのでrm やsystem prune でContainer を削除してもImage は残っています。
今どんなImage が残っているのか見るには
docker images
を使って調べることができます
では上記の赤で囲まれているimages を削除します
docker rmi <image id>
注意!
Imageを削除する前に、その削除したいImageから作ったContainer があれば、 先にContainer を削除してからImage を削除してください。
#実行中のDocker にさらにコマンドを付け加えるには?
では次の説明に入る前に、Docker でUbuntuというOSのContainerを実行してみましょう
docker run ubuntu
でubuntuのContainerが作られ実行されましたが、その後すぐに
docker ps (実行『中』のContainerを表示するコマンド)
で見ても、どうやらubuntu のContainer は実行中ではないようです
実際
docker ps -a (実行『された後』のContainerを表示するコマンド)
で見ると、ubuntu のContainer が表示されています
そしてSTATUSは『Exited』になっています。
それはどういうことかというと
Container はVirtual Machine と違い、OSをホストするものではなく、特定のタスクやプロセスを実行するものである。
ゆえに、Container 内に、為すべきタスクやプロセスがなくなるとExited される
ということです。
ただ、
docker run ubuntu sleep 100
で、100秒待機させてみます
そして、docker ps -a コマンドで見てみると
STATUS のところが Exited ではなく、UPになっているのが分かります(redisも実行中になっています)
##exec コマンドで、実行中のContainer にコマンドを実行させる
では、STATUSがUPになっているContainer にさらにコマンドを実行させるにはどうしたら良いでしょうか
docker exec <container ID> コマンド
となります
exec はexecute の略になります
例えば、100秒の待機時間をもうけたubuntuの中のディレクトリーのリストを見てみましょう
docker run ubuntu sleep 100
その後、別のコマンドラインを開き
docker ps
で見ると、ubuntu のContainer がまだ実行中であるのが分かります
そこで調べたContainer ID を使い
docker exec <container ID> コマンド
あなたの実行したいコマンドを入れて、実行してみましょう
#まとめ
今回の記事では、前回の記事から一歩踏み込んで、実際のコマンドプロンプトを使い、色んなコマンドを使ってみました。
そして、Containerを作って、そのContainer ID を調べたり、削除したり、さらに他のコマンドを実行させるまでをまとめてみました。
お役に立てれば幸いです。<(_ _)>