初心者向けDockerの基礎

Dockerについて学ぶ機会がありましたので、備忘を兼ねてDockerを知らない方向けに記事を書いてみようと思いました。
私もDockerについて何一つ知らない状態でしたので、同じような方を対象に記事を記載しようと思います。

#Dockerとは
まずDockerとはなにかですが、**コンテナ型仮想化技術**のひとつです。従来のホスト型やハイパーバイザ型と異なり、コンテナ型はディスク使用量が少なくすみ、仮想環境の作成、起動が短時間で行なえかつ性能劣化が殆どないという優れたものになります。しかもオープンソースなので無料で使用できます。
コンテナ型は何故上記のような利点が生まれるのかというと

1. コンテナ型はホスト型やハイパーバイザ型と異なりゲストOSを持たずホストOSが直接コンテナ管理ソフト(Docker)を使用するため
2. 後述するdocker runコマンドでイメージを取得しコンテナ起動、つまり仮想環境が1コマンドで完了する

といったようなことがあげられます。これは便利。
この1コマンドで環境構築できるというのが優れているところは、パッケージングしておけばどんな場面でも全く同一の環境が作成できるというところにあります。テスト環境と本番環境が微妙に異なり本番環境で予期せぬ動作をするといったことが防げます。

#実際にDockerをインストールしてみる
Dockerについてを簡単にですが記しました。次はDockerをインストールして実際に使ってみようと思います。知らないことを覚えるには実際にやってみるのが一番ですね。
Dockerにはエディションがあります。無償版のDocker Community Edition(CE)と商用サポートが有るDocker Enterprise Edition(EE)です。個人で使用するので無償版のDocker Community Editionを使っていきます。

自分の環境がWindows7 64bitのため今回使うのは**Docker Toolbox**とします。Windowsの場合、**Docker for Windows**もあるのですが、こちらはWindows10かつPro、Enterprise、Educationでなければインストール出来ないため選択肢から除外。Docker ToolboxもWin7の64bitなら動きますが、32bitでは動かないため注意してください。ではインストールしていきます。　

1. Docker Toolboxをダウンロード
　githubからダウンロードします。以下のURLから飛べます。
　https://github.com/docker/toolbox/releases 

2. 画面中部から**DockerToolbox-19.03.1.exe**を保存

3. インストール実行
デフォルトの状態でインストールを進めていきます。
![WS000000.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525892/70c3badd-ddf9-9476-36fb-1ab60f42db40.jpeg)
![WS000001.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525892/333b9a09-67b5-aa69-599e-837ecd27c553.jpeg)
![WS000002.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525892/e50662df-3594-70c3-4230-df1b6466da7a.jpeg)
次は一番下の項目にチェックを付けてからNextをクリックします。
![WS000003.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525892/c5605615-1030-ecce-4f1e-4783a1435d7b.jpeg)
![WS000004.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525892/039f587c-bfe1-ebe4-183b-902c4bf9dfa4.jpeg)
デバイスソフトウェアの確認が出たらインストールをクリックします。
![WS000005.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525892/f14d68e3-fe21-9cb6-2f57-c66ebad9598b.jpeg)
![WS000008.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525892/eee3af17-c6dc-e7f6-6bf4-3bc1842fc621.jpeg)
Finishをクリックしインストール完了です。デスクトップにOracle VM VirtualBox、Docker Quickstart Terminal、Kitematic (Alpha)が作られましたので、Docker Quickstart Terminalから起動します。
セットアップが進んでいき、クジラが表示されたらセットアップ完了です。くじらの背中にある＃マークはコンテナを表してるそうですよ。
![WS000010.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525892/fdb77bfb-599f-6b06-1f78-c690ea8c7e71.jpeg)


#Dockerの基本操作について
Dockerを操作するコマンドは基本的に先頭に**Docker**を付けます。正常にインストールが完了したかの確認も兼ねてバージョン確認をしてみます。

```
$ docker version
Docker version 19.03.1, build 74b1e89e8a
```
バージョンが確認できたので、正常ににインストールできていました。
では次に早速コンテナを起動してみたいと思います。ここではお約束であるhello worldイメージを使います。`docker run hello-world`を投入してみましょう。

```
$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete
Digest: sha256:4df8ca8a7e309c256d60d7971ea14c27672fc0d10c5f303856d7bc48f8cc17ff
Status: Downloaded newer image for hello-world:latest

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 run hello-world`コマンドですが、runがコンテナ起動のコマンドで、hello-worldがDockerイメージの名前です。イメージとコンテナは下記の様な意味となります。

- イメージ
「**コンテナを起動させるためのベースファイル**」のこと
 
- コンテナ
「**Dockerのイメージを元に作成される仮想環境の実行部分**」のこと

runコマンドはイメージを取得してきてそのイメージからコンテナを作成し起動を行ってくれるコマンドです。
以下のコマンドをまとめて実行してくれています。
docker pull　⇛イメージの取得
docker create　⇛コンテナの作成
docker start　⇛コンテナの起動
上記のことから`docker run hello-world`でコンテナ起動ができたという訳です。

DockerのイメージはDockerの公式サイトであるDockerHubから取得しています。サイトではイメージ一覧の確認が可能です。
https://hub.docker.com

次に取得したdockerのイメージを確認してみます。

```
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              fce289e99eb9        10 months ago       1.84kB
```

hello-worldのイメージのみ取得している状態のため、1つだけ表示されました。

次に取得したイメージを削除してみます。イメージの削除コマンドはrmiです。`docker rmi [IMAGE ID]`の形式で使用します。

```
$ docker rmi fce289e99eb9
Error response from daemon: conflict: unable to delete fce289e99eb9 (must be forced) - image is being used by stopped container a9b8233830bf
```

エラーが出ました。イメージは停止したコンテナが使っているので削除できませんって表示されていますね。
先にコンテナを削除する必要があるそうです。

というわけでコンテナを削除します。コンテナ削除のコマンドはrmです。`docker rm [CONTAINER ID]`の形式で使用します。
起動中のコンテナを確認するコマンドは`docker ps`です。ただ、hello-worldはメッセージ出力が終わると自動的にコンテナを停止してしまうため、ステータスに関係なく全てのコンテナを表示する`docker ps -a`を使用します。

```
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
a9b8233830bf        hello-world         "/hello"            16 minutes ago      Exited (0) 16 minutes ago                       heuristic_vaughan
```

このコンテナを削除してみます。

```
$ docker rm a9b8233830bf
a9b8233830bf
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
```
ちゃんと消えていますね。これでイメージを削除できます。

```
$ docker rmi fce289e99eb9
Untagged: hello-world:latest
Untagged: hello-world@sha256:4df8ca8a7e309c256d60d7971ea14c27672fc0d10c5f303856d7bc48f8cc17ff
Deleted: sha256:fce289e99eb9bca977dae136fbe2a82b6b7d4c372474c9235adc1741675f587e
Deleted: sha256:af0b15c8625bb1938f1d7b17081031f649fd14e6b233688eea3c5483994a66a3
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
```
イメージを無事に削除できました。イメージを削除するには、
**1. コンテナ削除**
**2. イメージ削除**
の順で実施しましょう。

※補足
コンテナが起動されていても-fオプションを付けて`Docker rmi -f [IMAGE ID]`のように実行すればイメージを強制削除することもできます。
ただし、強制削除した場合はコンテナは消えずに残り続けるので、環境をキレイにするにはコンテナも削除します。

#おわりに
Dockerを使用する準備段階から実際にコンテナ起動までを記載してみました。
次回を書く機会がありましたら、Dockerでよく使うコマンドまとめや、実際にDockerを活用して開発環境を作成する記事を書こうかなと思います。