【Docker】Container を作って削除するまでを時系列的に解説 no.1

![パンプキン カフェ (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/461a5daf-3dd4-c123-095c-302e43b8221d.png)

こんにちは、まゆみです。

Dockerについての記事をシリーズで書いています。

[前回の記事](https://qiita.com/Mayumi_Pythonista/items/43dba6d5ac17d6fa23d5)で、Dockerの学習準備編として、


<ul>
<li>Docker を学ぶべき理由</li>
<li>Dockerは水面下ではどのように動いているのか</li>
<li>Dockerで使われる用語を少し紹介</li>
</ul>

をざっくり、解説させていただきました。

今回の記事では、実際にコマンドラインを利用してDocker Client(CLI)からDocker Server に命令を出してみたいと思います

#最初に覚えるべきコマンドは「run」

Docker Imagesは、あなたが自分で書いたDockerfileからも作ることができますが、今回の記事では、[Docker hub](https://hub.docker.com/)にアクセスしてDockerfile からImageを作っていこうと思います。

![Docker hub.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/a18dd4d2-11c6-0b0e-9db5-92bd1c0a5e0c.png)

上記のイラストで言えば、ピンクの点線で区切られている地点からのContainer の作成になります。(DockerfileからDocker Imageを作る方法はまた別の記事に書きます)

Container を作り実行してくれるのは「run」というコマンドになります

```
docker run <イメージ名>
```

では、Docker hub にある『hello-world』を引っ張ってきて、Container を作ってみましょう。(Dockerfileは下記のようにDucker hub にあります)



![2021-05-26_14-08-47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/6b91e117-fb20-e2d7-9cad-7009936293c9.png)
引用元：Docker hub

```
docker run hello-world
```

上記のコードを実行すると下記のような結果になります

![2021-05-26_13-21-47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/ac2de630-12b5-9486-dce4-2aeba4de1cf0.png)

ここで注目してほしいのが、

Unable to find image 'hello-world:latest' locally

と書かれている部分です。

上記の文を翻訳すると

<font color="Red">あなたのパソコン内に最新バージョンのhello-world imageは見つかりませんでした</font>

ということになります

そしてその次の文には

Pulling from Library/hello-world(ライブラリーから引っ張ってきます)

と書かれています


![docker run hello-world.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/4623e4ac-6f30-b13d-cba2-92e931688f1a.png)

すなわち、

Docker client から
⇩
Docker server に命令が出され
⇩
Docker server がキャッシュから目当てのimageがないか探します。
⇩
初めてimageを作る時はキャッシュにはimageが無いので、Docker hub に行き目当てのfileからimageを作る

のです。


一度hello-worldでコンテナを実行した後は、キャッシュからimage を引っ張ってContainerを作ることになります

#ps と ps -a コマンド

では次に、<font color="Red"><font color="Red"></font>実行『中』と、実行『された後』のContainer の情報</font>を見るにはどうしたら良いでしょうか？

また、<font color="Red">どのような時にContainer の情報を見ることが必要</font>なのでしょうか？

Container が作られると、それぞれのContainer に、Container ID や名前が付与されます。

それらのContainer に対して、何かしらの命令を出したい時 (Container を削除したい、Container に別のコマンドを実行させたいetc...) には<font color="Red">Container ID か名前を添えなければならない</font>ので、そのようにIDや名前を調べないといけない時、Container 情報を表示する事の出来るコマンドは便利です。

>ps は実行『中』のContainer を

>ps -a　は実行『された後』のContainer も含めて

表示してくれます

下記に、実行結果のスクショを貼っておきます


![2021-05-27_9-05-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/5b799787-d56d-58f7-3bd9-80a9e7c1382c.png)

上のスクショから分かるように、現在実行中の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 を削除しましょう

![2021-05-27_9-23-40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/1ef2b071-f0c7-53e3-00d9-66d4d4d02fa4.png)

上記のように、ps -a で調べた　Container ID をrm の後ろにコピペします。

上記のコマンドを実行して、Container ID のみ表示されれば、そのContainer は削除されています

![2021-05-27_9-31-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/fddc2f96-4c4b-f821-b2ea-babd78942662.png)

今現在、使っていないContainer が複数あるので、<font color="Red">rm で一つづつ削除するのが面倒くさい時</font>は

```
docker system prune
```
で一気に削除する事ができます

Are you sure you want to continue? [y/N]

本当に消しても良いのか？

と聞かれますので、『y』を入力してください。

すると、Container は全て消されます。


![2021-05-27_9-39-18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/0ee7d9c8-5556-b110-2f77-4e74eea641b0.png)

#docker images コマンド・rmi コマンド

<font color="Red">ImageとContainer は別物</font>ですね。

Container はImage から作られるインスタンスになります。

なのでrm やsystem prune で<font color="Red">Container を削除してもImage は残っています。</font>

今どんなImage が残っているのか見るには

```
docker images
```
を使って調べることができます


![2021-05-27_9-45-50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/07e7576e-a53e-06a2-0f07-23c2983b8a84.png)

では上記の赤で囲まれているimages を削除します

```
docker rmi <image id>
```

下記のようになれば、images は削除されています
![2021-05-27_9-52-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/ec1d0434-58c1-4535-d552-a1dc82e09760.png)

>注意！
Imageを削除する前に、その削除したいImageから作ったContainer があれば、 <font color="Red">先にContainer を削除してからImage を削除</font>してください。

#実行中のDocker にさらにコマンドを付け加えるには？

では次の説明に入る前に、Docker でUbuntuというOSのContainerを実行してみましょう

![2021-05-27_10-00-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/b67bbbd6-52bd-2faa-274e-84c77668a70c.png)

```
docker run ubuntu 
```
でubuntuのContainerが作られ実行されましたが、その後すぐに

```
docker ps (実行『中』のContainerを表示するコマンド)
```

で見ても、どうやら<font color="Red">ubuntu のContainer は実行中ではない</font>ようです

実際　

```
docker ps -a (実行『された後』のContainerを表示するコマンド)
```

で見ると、ubuntu のContainer が表示されています


そして<font color="Red">STATUSは『Exited』</font>になっています。

それはどういうことかというと

>Container はVirtual Machine と違い、OSをホストするものではなく、特定のタスクやプロセスを実行するものである。
ゆえに、Container 内に、為すべきタスクやプロセスがなくなるとExited される

ということです。

ただ、

```
docker run ubuntu sleep 100
```

で、100秒待機させてみます

そして、docker ps -a コマンドで見てみると

STATUS　のところが　Exited ではなく、UPになっているのが分かります(redisも実行中になっています)



![2021-05-27_10-11-45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/af4e3b20-30f8-85e2-3582-b5b61c05c4b7.png)

##exec コマンドで、実行中のContainer にコマンドを実行させる

では、STATUSがUPになっているContainer にさらにコマンドを実行させるにはどうしたら良いでしょうか

```
docker exec <container ID> コマンド
```

となります

exec はexecute の略になります

例えば、100秒の待機時間をもうけたubuntuの中のディレクトリーのリストを見てみましょう

```
docker run ubuntu sleep 100
```

![2021-05-27_10-27-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/d33a1fa0-3440-2df9-7601-899a4c0b5ff1.png)


その後、別のコマンドラインを開き

```
docker ps 
```

で見ると、<font color="Red">ubuntu のContainer がまだ実行中</font>であるのが分かります

そこで調べたContainer ID を使い

```
docker exec <container ID> コマンド
```
あなたの実行したいコマンドを入れて、実行してみましょう


![2021-05-27_10-30-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/fd76c5ba-286c-3d2d-0816-04a85b3f6374.png)


#まとめ
今回の記事では、前回の記事から一歩踏み込んで、実際のコマンドプロンプトを使い、色んなコマンドを使ってみました。

そして、Containerを作って、そのContainer ID を調べたり、削除したり、さらに他のコマンドを実行させるまでをまとめてみました。

お役に立てれば幸いです。<(_ _)>