Dockerで色々やってみる（Containerいじくり編）

# 概要
前回までで、Windows10にDockerをインストールして、Imageを取得したり、廃棄したりしてみました。
今回は、取得したImageを使ってContainerを起動していくことになります。
（ただし、相変わらずDockerfileは除外します）

https://qiita.com/TAKANEKOMACHI/items/f1aaa378d93b4ace9513

https://qiita.com/TAKANEKOMACHI/items/15eca19efebeefa87660

まとめは下記

https://qiita.com/TAKANEKOMACHI/items/a890fc4f3a132828f62b

# 前提条件
+ Windows10にDocker Desktopがインストールされている状態

# はじめの一歩（image -> hello-world）
すでに、「Windows10でDocker（Docker Desktop）を使う」の回でubuntuを取得してたりしますが、ひとまずDockerコマンドを学ぶことも踏まえ、「なかった」ことにします。

最初の「一歩」目としては、やはり、「hello-world」ですね。

https://hub.docker.com/_/hello-world

この「hello-world」は、Dockerを最小構成で作っていて、起動すると「Hello from Docker!」（あと数行の文字列）と出力されるだけ・・・・です。
ただ、Dockerの理解にはかなり貢献します。

まずは、Imageを取得します。
タグは下記が使えるようなので「latest」を指定していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222251/1a64a655-1e65-fa84-d1ac-b7076e501d2f.png)

```powershell:powershell
PS C:\> docker pull hello-world:latest
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:13e367d31ae85359f42d637adf6da428f76d75dc9afeb3c21faea0d976f5c651
Status: Downloaded newer image for hello-world:latest
docker.io/library/hello-world:latest
```

取得したImageのサイズを見てみましょう
```powershell:powershell
PS C:\> docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
ubuntu        latest    27941809078c   10 days ago    77.8MB
hello-world   latest    feb5d9fea6a5   8 months ago   13.3kB
```

13.3kB！？
ちっちゃ！

## Containerを起動する（> docker run | docker container ls --all | docker start)
それでは、Containerを起動してみます。
実行方法は、Example outputに記載されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222251/5cbe8af4-5332-6a00-33fe-c3b708a10965.png)

```powershell:powershell
PS C:\> docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/
```

ここでのポイントは、
+ 必要な機能（決まったテキストを表示するだけ）をDockerのImageにすると、これだけ小さなサイズでもきちんと機能しますよ。

ということですね。

Docker Desktopで確認してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222251/6bd6a33c-7209-fb58-3840-f297e40d329f.png)

特に「exit」コマンドを実行しなくても、「やるべきことをやった」状態なので、Containerは終了してますね。

:::note warn
警告
重要なので、「補足」として書いておきます。
「docker run」は正確には「起動」ではないです。
より正確な言い方をすると「Containerの生成」です。

> dockerと入力して表示される説明をみても、「run」には下記のように書かれてます。
「run         Run a command in a new container」
そう、「NEW」Containerですね。
:::

というわけで、もう一度さっきのコマンドを実行してみましょう

```powershell:powershell
PS C:\> docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/
```

もう一度、Docker DesktopのContainerリストを見てみてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222251/899f0195-5c82-d94e-1600-8524cdb3ffe6.png)

そう、もう一つ「hello-world」が出来てしまってますね。
コマンドでも見てみましょう。
```powershell:powershell
PS C:\> docker container ls --all
CONTAINER ID   IMAGE           COMMAND    CREATED          STATUS                      PORTS     NAMES
106b75383f74   hello-world     "/hello"   5 minutes ago    Exited (0) 5 minutes ago              condescending_khorana
ed3e9a9d9e4c   hello-world     "/hello"   11 minutes ago   Exited (0) 11 minutes ago             elated_wilbur
89b3f9ec5f9b   ubuntu:latest   "bash"     12 hours ago     Exited (0) 12 hours ago               magical_hellman
PS C:\>
```

ん～、、、、
じゃぁ、すでに存在しているContainerをもう一回実行するにはどうすればいいの？
それは、「start」を使います。
⇒オプションで「-i」が必要です。

https://docs.docker.jp/engine/reference/commandline/start.html

```powershell:powershell
PS C:\> docker start -i 106b75383f74

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/
```

Containerの一覧を表示してみます。
```powershell:powershell
PS C:\> docker container ls --all
CONTAINER ID   IMAGE           COMMAND    CREATED        STATUS                          PORTS     NAMES
106b75383f74   hello-world     "/hello"   8 hours ago    Exited (0) About a minute ago             condescending_khorana
ed3e9a9d9e4c   hello-world     "/hello"   8 hours ago    Exited (0) 7 hours ago                    elated_wilbur
89b3f9ec5f9b   ubuntu:latest   "bash"     19 hours ago   Exited (0) 19 hours ago                   magical_hellman
PS C:\>
```
今度は増えてないですね。

これで、取得したImageから生成したContainerの起動や、再度起動する方法が分かったかと思います。

## Containerを生成する（> docker create）
追加ですが、ここで「create」も学んでおきます。

前述の「run」は、ImageからContainerを生成すると同時に「起動」してました。
でも、「起動までは要らないんだけど」という場合もあります。

そんなときは「create」を使います。

それでは、「create」を使って、hello-worldのContainerをもう1つ作ってみます。

まずは、現状。
```powershell:powershell
PS C:\> docker container ls --all
CONTAINER ID   IMAGE           COMMAND    CREATED        STATUS                      PORTS     NAMES
106b75383f74   hello-world     "/hello"   8 hours ago    Exited (0) 11 minutes ago             condescending_khorana
ed3e9a9d9e4c   hello-world     "/hello"   8 hours ago    Exited (0) 8 hours ago                elated_wilbur
89b3f9ec5f9b   ubuntu:latest   "bash"     19 hours ago   Exited (0) 19 hours ago               magical_hellman
PS C:\>
```

Containerを作成します。
```powershell:powershell
PS C:\> docker create hello-world
041f29983444199c5e2d65fa0d0ee4aab8430ff307a565feaca7170afc3a3bef
```

作成されたはずなので、一覧を表示してみます。
```powershell:powershell
PS C:\> docker container ls --all
CONTAINER ID   IMAGE           COMMAND    CREATED         STATUS                      PORTS     NAMES
041f29983444   hello-world     "/hello"   7 seconds ago   Created                               agitated_varahamihira
106b75383f74   hello-world     "/hello"   8 hours ago     Exited (0) 11 minutes ago             condescending_khorana
ed3e9a9d9e4c   hello-world     "/hello"   8 hours ago     Exited (0) 8 hours ago                elated_wilbur
89b3f9ec5f9b   ubuntu:latest   "bash"     19 hours ago    Exited (0) 19 hours ago               magical_hellman
```

出来てますね。
ポイントは、「生成と同時に起動」という「run」とは違い、「生成」までしかしていないので「STATUS」が「Created」になっていることです。

Docker Desktop側も確認してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222251/720d2036-32c6-c3c1-607b-45fb8fa40099.png)

Docker Desktop側も「created」というSTATUSになっていますね。

## Containerの一覧を表示する（> docker ps）
個人的に、「docker container ls --all」を使っていたのですが、一応、世間ではこっちのほうが多いようなので書いておきます。
```powershell:powershell
PS C:\> docker ps -a
CONTAINER ID   IMAGE           COMMAND    CREATED          STATUS                      PORTS     NAMES
041f29983444   hello-world     "/hello"   10 minutes ago   Created                               agitated_varahamihira
106b75383f74   hello-world     "/hello"   8 hours ago      Exited (0) 22 minutes ago             condescending_khorana
ed3e9a9d9e4c   hello-world     "/hello"   8 hours ago      Exited (0) 8 hours ago                elated_wilbur
89b3f9ec5f9b   ubuntu:latest   "bash"     19 hours ago     Exited (0) 19 hours ago               magical_hellman
```

## Containerを削除する（> docker rm）
Containerは、簡単に作成できるので、気づくとゴミのように溜まっていることがあります。

今回は、さっくり「hello-world」のContainerを削除します。
（あえて、一個ずつ消します）
```powershell:powershell
PS C:\> docker rm 041f29983444
041f29983444
PS C:\> docker rm 106b75383f74
106b75383f74
PS C:\> docker rm ed3e9a9d9e4c
ed3e9a9d9e4c
```

Containerの一覧を表示して確認してみます。
```powershell:powershell
PS C:\> docker container ls --all
CONTAINER ID   IMAGE           COMMAND   CREATED        STATUS                    PORTS     NAMES
89b3f9ec5f9b   ubuntu:latest   "bash"    19 hours ago   Exited (0) 19 hours ago             magical_hellman
```

消えてますね。

次回は、別のImageを使ってContainerを起動して利用します。