改めてDockerを理解する①[コンテナのライフサイクル編]

## はじめに
初めまして！ITスクールRareTECHにてCS（Customer Support）を担当している池村です！
本日は初学者向けにDockerの基本的なコマンドについて解説します。
DockerはLinuxの理解度がある程度ないと扱えない、と私は思っています。まずは基本のLinuxコマンドを理解してから学習することをオススメします。
私の記事で恐縮ですが、以下の記事から学習してみてください。

https://qiita.com/ikemura-ren/items/0925e9fe2e5cd0b47e01

※今回はDockerを初めて触る人向けの記事になります。


## 初学者は仮想化の歴史は知らなくていい（最初は）
はっきり言います。Dockerがどういう成り立ちかを理解することは、初学者にとって必須ではありません。仮想化技術の発展は、エンジニアに対してかなりの恩恵をもたらしていることは事実です。ですが、最初から歴史を深ぼる必要は正直ありません。
コンテナ技術とVMの違いなどは、ある程度コマンドを使いこなしてから知っていきたいですね。

![0FB14268-911C-47B8-82FF-302C58D2780F.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/35125342-8ece-7d75-64d4-09976f385dda.png)


なので、歴史から学んでいこう！というのはやめてください。
私自身、歴史から手を出したら訳わからなくなりました。ただ、Dockerが生まれたことによる恩恵を知る必要だけあります。

- 環境構築でOSの違いを意識する必要がほぼない（WindowsだろうがMacだろうがLinuxだろうが同じように起動できる）
- 従来の仮想化よりも軽い
- 環境の変更や、環境の再現性が高い

その他様々あると思いますが、要は**より軽く、環境（OS）の差分も気にせず、環境構築ができるもの**くらいの理解度で最初はOKです。

### Dockerには学ぶ順番がある（と思っている）
まず私の持論ですが、DockerとDockerによる環境構築ができるまでの技術習得には順番があると思っています。
1. Dockerのインストール周り（学習にも入りませんが一応）
1. Dockerの基本コマンド周り
1. Dockerのボリューム・ネットワーク周り
1. Dockerfile周り
1. Docker Compose周り

この順番で学習せず、とりあえずDocker Composeを学んで環境構築に手を出す人が多い印象です。で、よくわからないまま、よくわからない環境になっていると。初学者はまず焦らず、コンテナのライフサイクルを理解するための基本コマンドから学んでいきましょう。

:::note warn
ある程度のネットワーク知識、Linux知識習得は大前提です
:::

## Dockerってなに？コンテナって美味しいの？
コンテナは一言で表すと、『**データやプログラムを隔離できる**』仕組みのことです。
何から隔離するのか？と言いますと、ご自身のPCのOSや、他のコンテナから隔離しています。基本的にコンテナの中は別のPCが入っていると思ってもらってもいいくらい、隔離されています。コンテナの中には軽量なLinuxOSのイメージが入っていて、これらのイメージを使って様々なコンテナを立ち上げることができます。

この隔離された環境に、アプリケーションに必要なデータやプログラム等を入れて動かしていくのが、コンテナを管理するDockerというツールになります。

このコンテナ周りの技術は理解しようとすると泥沼に陥る可能性がありますので、まずはコマンドを触ってみるところから初めていきましょう。



## Docker Desktopのインストール
まずご自身のPCにDockerをインストールする必要があります。
こちらからご自身のPCに合わせたDocker Desktopをインストールしてください。

https://www.docker.com/ja-jp/products/docker-desktop/

インストールが完了しましたら、ダウンロードしたファイルを展開してください。（ダウンロードフォルダにあるものをダブルクリック）

私の環境はMacなので、Macではこういった画面が出てくると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/8cd000b8-0327-76d5-8dfa-60e8a63549a0.png)

この画面ではドラッグアンドドロップでアプリケーションフォルダに入れてもらったら閉じて大丈夫です。

それが完了しましたらDocker Desktopを開いていきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/f92b1241-14eb-1477-6c7c-94fe584df8df.png)

無事開けましたら、ユーザー登録する画面が出てきます。ここは登録してもしなくてもどちらでも構いません。私は右上のスキップボタンを押しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/f2cd366c-c33f-fbbb-b8e3-5cf0e3f1c026.png)

登録が完了すると、以下の画面になると思います。そこまでできたらコマンドを使う準備は完了です。私の画面上ではすでにコンテナがあるので色々表示されていますが、初めて起動した人には何も表示されていないと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/24641fd2-82d4-0e45-a787-d7a7aa195661.png)


## ではコマンドを叩いていきましょう
:::note warn
Dockerのコマンドには、実は旧記法と新記法があります。
推奨されるのは新記法の方です。ですが旧記法の方がコマンドの記述が少ないため、自分は旧を多用しています。別に旧記法でも動作に変わりはありません。
一応、この記事内ではどちらのコマンドも残しておきます。
:::

### 1. バージョンの確認
まずしっかり動くかどうか、バージョンを確認していきましょう。こういったコマンドを叩くとき、よくバージョンの確認やヘルプなどを見て確かめる習慣をつけておくとgoodです。
```Bash:書き方
docker -v
```

こちらのコマンドを叩いて、しっかりバージョンが出ればDockerのコマンドは問題なく使えるようになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/eaaed922-b03c-5316-6503-9b4adc308878.png)



### 2. `search`（イメージを探す）
Dockerのコマンドには`search`というコマンドがあります。
これはDockerのコンテナ（切り離された環境）の下地にあたるイメージを探すコマンドです。
どこから探すかというと、DockerHubというコンテナイメージがたくさん公開されている場所です。

https://hub.docker.com/

基本的にこのサイトから自分が作りたいコンテナのイメージを取得するのですが、コマンドライン上から`search`コマンドでも探すことができます。毎回Webサイトに行くのは若干手間なので、`search`コマンドから探してみて、詳細を見たい時だけDockerHubに行くことが私は多いです。

```Bash:書き方
# 旧記法
docker search イメージ名

# 新記法
docker image search イメージ名
```

```Bash:例えば
docker search ubuntu
docker image search python
```

実際にUbuntuで指定して叩いてみます。たくさん出てきたので、一部だけ切り取って画像を添付しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/4cacb071-0587-6429-b11d-448e11f3d9bd.png)

ここで見て欲しいのは、STARSの部分です。この数字が多いほど、信頼性が高いと言っても過言ではありません。もちろん、他のイメージも使えるイメージではありますが、シンプルなUbuntuを選ぶ時はOFFICIALという部分に[OK]と書かれている公式が出しているイメージを選択することが多いです。

公式以外のイメージは、基本的にサードパーティ製（有志の第三者が作ったもの）です。

![423E5836-2F0C-4E80-BD9B-62323B0241FE.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/2fc1d091-8894-be7a-922e-9c487a0b5ed5.png)


### 3. `pull`（イメージを持ってくる）
イメージを検索したら、それを実際にご自身のPC（あるいは準備したサーバー内）にイメージを持ってくる必要があります。このコマンドが`pull`です。Gitを使ったことがある人は想像がつきやすいと思います。

```Bash:書き方
# 旧記法
docker pull イメージ名

# 新記法
docker image pull イメージ名
```

```Bash:例えば
docker pull ubuntu
docker image pull python
```
私の環境でUbuntuを`pull`してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/445f35c9-ebd9-f0d7-2860-a77fb010b6f4.png)

特に何も指定をしないと、最新版のUbuntuがインストールされます。これはUbuntuでなくても最新版がインストールされます。`latest`というのは最新という意味です。

もちろんバージョン違いのイメージを持ってくることもできます。
```Bash:例えば
docker image pull ubuntu:24.04
```
こういった`:24.04`のことをタグといいます。DockerHubでどんなタグがあるか調査することができます。せっかくなのでUbuntuのタグのページもリンクで載せておきます。

https://hub.docker.com/_/ubuntu/tags

色々なタグがありますので、各種`pull`してみてもいいかもですね。（後でも消せるので）

![BFB7164A-2A58-46D1-ACFD-C49C88067C0A.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/d8d89416-6f53-ce65-03a7-5a04838d2c56.png)

### 4. `images` or `image ls`（イメージの一覧を確認する）
それでは持ってきたイメージが本当にあるのかどうかを確認してみましょう。
```Bash:書き方
# 旧記法
docker images

# 新記法
docker image ls
```
上記のコマンドを叩くと、現在インストールしているイメージの一覧が表示されると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/9eb11b4a-79c3-c1ac-f597-d22292952fa4.png)

先ほどまでのコマンドを叩いている人は、Ubuntuのバージョン違いで二つのイメージが表示されるはずです。

### 5. ここで注意点
今の所イメージの話ばかりしていましたが、Dockerではイメージを操作するコマンドのほかに、イメージから作られるコンテナの操作をするコマンドに分けられます。あとでまとめを書きますので、詳しくはそちらをご確認ください。そしてここからは実際にコンテナを動かしていきます。

:::note warn
コンテナを操作するコマンドと、イメージを操作するコマンドは分けて考えるとgoodです。
:::

### 6. `run`（イメージからコンテナを作成して起動する）
では実際にイメージからコンテナを作成し、動かしてみましょう。
```Bash:起動方法
# 旧記法
docker run -it ubuntu

# 新記法
docker container run -it ubuntu
```
今回はせっかくUbuntuを起動するので、UbuntuのBashを起動してコンテナ内でLinuxコマンドを叩いてみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/430dd636-b0b0-5aef-5220-d3b8d69ef5be.png)

ちょっとコマンドを打ってみました。Ubuntu内のシェルが起動しているので、基本的なLinuxコマンドを使うことができます。

:::note info
ちなみに今いるのはコンテナの中です。
:::



今使ったオプションは以下のものを使っています。
| オプション           | 説明                                               |
|-----------------------|----------------------------------------------------|
| `-t`                 | 仮想端末（TTY）を割り当てて、ターミナル上で見やすい入出力を実現する |
| `-i`       | 標準入力をコンテナに接続し、ターミナルで入力を受け付ける。|

これも初学者では何を言っているかわからないと思うので、かいつまんで解説します。
まず`-i`ですが、これは対話的にコマンドを打てるようにするものです。要はLinuxコマンドを実行できるようになります。

```Bash:-iのみの書き方
docker container run -i ubuntu
```
ただこれだけのオプションだと、とても見にくい画面になってしまいます。
試しに叩いてみると、以下のような結果になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/fb300bfa-23fc-bfe8-17dd-42a4795578d4.png)

見にくいですね。なので、`-t`オプションも一緒に実行しています。
`-t`は仮想端末というものを割り当ててくれるので、普段のLinuxを触る時と変わらない見やすい画面にしてくれます。

今回は起動と同時にコンテナの中に入っているので`-it`をつけましたが、起動しておいて、後からコンテナ内に入ることも可能です。その方法は後ほど解説していきます。

コンテナから出たい時は、以下のコマンドで可能です。
```Bash:コンテナから出たい場合
exit
```

### 7. `ps`（コンテナの一覧を確認する）
ではコンテナから出たところで、コンテナ一覧を見ていきましょう。
コンテナ一覧を見るときは`ps`コマンドを使います。
```Bash:書き方
# 旧記法
docker ps
or
docker ps -a

# 新記法
docker container ls
or
docker container ls -a
```
今回のUbuntuのコンテナは、シェルから`exit`すると自動で止まります。
ですので、止まっているコンテナも含めたすべてのコンテナを見ることができる`-a`のオプションをつけて実行してみてください。
以下の画像のような結果になると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/9f42165d-d432-9a56-cc12-92b1b0cff5d3.png)

これらの細かな内容に関しては次回の記事で解説する予定です。ただ、全く触れないのもダメなので今見てほしいところだけ解説します。

#### CONTAINER ID
コンテナそれぞれに割り当てられるランダムなIDです。コンテナの停止、削除、起動をするときに使います。

#### CREATED
コンテナが作られたのはいつか？の情報です。

#### STATUS
これは今コンテナが起動しているかどうかを表しています。`Exited`なので今は停止しています。起動しているときはUpと表示されます。

#### NAMES
コンテナの名前です。指定しないと適当な名前が付きます。このコマンドを実際に叩いている人は、私の実行結果とは違う名前になっているはずです。

:::note info
初学者はこの記事を読んだら、とりあえずこの4つだけわかっていればOKです。
:::

### 8. `start`と`stop`（コンテナの起動と停止）
ここで止まったコンテナを起動して、その後停止してみます。
```Bash:起動の仕方
# 旧記法
docker start コンテナID or コンテナ名

# 新記法
docker container start コンテナID or コンテナ名
```
```Bash:停止の仕方
# 旧記法
docker stop コンテナID or コンテナ名

# 新記法
docker container stop コンテナID or コンテナ名
```

今回先ほど起動したUbuntuのコンテナを再起動して停止しました。この時、指定できるのはコンテナIDかコンテナネームです。ただ、コンテナIDの方が楽です。画像をみるとわかるのですが、コンテナIDの頭文字2つだけで起動ができています。全てを打ち込むことがないのでかなり楽なんですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/1278ec11-b89e-e0aa-43e8-e2856d64a945.png)

### 9. `rm`（コンテナを削除する）
ではコンテナのライフサイクルの最後ですが、削除をしていきたいと思います。
コンテナはもちろん削除が可能です。では実際に消し方ですが、以下の通りにお願いします。
```Bash:コンテナの削除
# 旧記法
docker rm コンテナID or コンテナ名

# 新記法
docker container rm コンテナID or コンテナ名
```

これでコンテナの削除が可能です。私も消してみました。👇
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/e9382be2-33de-73ff-8030-793ab4475a3d.png)

削除を行うと、`ps -a`で一覧を出しても特に何も出てこなくなります。完全に削除が行われたということですね。


:::note warn
コンテナを削除しても、元になったイメージは消えません。
:::


## おわりに
今回はDockerの初歩の初歩を解説しました。
有識者なら、あれ？あのコマンドは？となるかもしれませんが、それは次の記事でご説明いたします。主に以下のコマンドです。
- exec
- rmi
- commit
- prune
- runのその他オプション等

私はDockerについて覚える時、ライフサイクルの理解からまず押さえる必要があると思っています。（2回目）そうじゃないと、コンテナがどう起動して、どう削除されて、どうイメージが作られているのかわからなくなるからです。
ですので、今回の記事で実行したコマンドは実際に叩いてみることをオススメします。
次回は上記のその他のコマンドとオプション周りについて解説します。よかったら読んでいただけますと幸いです。

次の記事はこちら👇

https://qiita.com/ikemura-ren/items/3b5667eee6e83a63d0b2

まとめ記事に戻るにはこちら👇

https://qiita.com/ikemura-ren/items/b961642d55e4e6515203

## 余談
AIの出してくれる画像、イマイチっすね、、
![853E6086-A281-4FB0-8060-824796024CA8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/34a13b39-f8d0-621b-fbf2-ced229500c0b.png)