Dockerの基礎をまとめてみた ~ 第二章：Dockerの基本操作

# 第二章 : Dockerの基本操作
本章では、Dockerの基本的な操作ついて記載します。

## Dockerのインストール
Dockerを利用するためには、Dockerをホストマシンにインストールする必要があります。現在(2018/10時点)では、[ここのページ](https://docs.docker.com/install/#supported-platforms)からDockerをダウンロードすることができます。

Dockerのインストール手順には公式ページや、他のサイトにも記載がありますので本記事では割愛します。

## 概要
第一章でも記載しましたが、Dockerの大きな機能は以下の3つです。

1. Dockerイメージを作成する機能(Build)
アプリケーションを動かすために必要な、コード/ライブラリ/ミドルウェア/OSなどをひとまとめにしたものをDockerイメージとして作成します。Dockerイメージは、コマンドラインから作成したり、Dockerfileから作成することが可能です。

2. Dockerイメージを共有する機能(Ship)
Dockerレジストリ(Docker Hub)を利用し、イメージを管理します。Docker Hubでは、イメージのアップロードやダウンロード、検索などが行えます。

3. Dockerコンテナを実行する機能(Run)
Dockerイメージをビルドし、コンテナとして実行することができます。コンテナは、開始/停止/削除が行えます。

これら機能を図示すると以下のような関連になります。

![Docker概要図.png](https://qiita-image-store.s3.amazonaws.com/0/170140/4bc24403-3cae-c042-d8cf-8d6602e735d2.png)

今回は、以下のような流れを簡単なコマンドと共に実行し、Dockerの基本的な部分を学んでいきたいと思います。今回はnginxのイメージを利用します。

1. イメージの取得
2. コンテナの作成
3. コンテナの実行
4. コンテナの停止
5. コンテナの削除

**※ここで触れない操作は以降の記事でまとめる予定です。**

## イメージの取得
最初にnginxのイメージを取得します。イメージを取得するには、 `docker image pull` コマンドを利用します。

```
02 $ docker image pull nginx:latest
latest: Pulling from library/nginx
802b00ed6f79: Pull complete
5291925314b3: Pull complete
bd9f53b2c2de: Pull complete
Digest: sha256:9ad0746d8f2ea6df3a17ba89eca40b48c47066dfab55a75e08e2b70fc80d929e
Status: Downloaded newer image for nginx:latest
```

イメージ取得できたか確認するには、 `docker image ls` コマンドを利用します。このコマンドを利用すると、取得したイメージの一覧を表示することができます。

```
02 $ docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              be1f31be9a87        5 days ago          109MB
```

ちなみにnginxの公式リポジトリは[こちら](https://hub.docker.com/_/nginx/)です。
![library_nginx_-_Docker_Hub.png](https://qiita-image-store.s3.amazonaws.com/0/170140/f3400089-9d45-c1ec-c1fb-b9b0a02b8800.png)


## コンテナの作成
イメージを取得したので、イメージを元にコンテナを作成します。コンテナを作成するには、 `docker container create` コマンドを利用します。
※コンテナの作成と実行をまとめてできる `docker container run` コマンドがありますが、今回は流れを追うために作成と実行を分けて行います。

今回は、以下のオプションを付与しています。

- `--name` : コンテナの名前を設定します → 今回は **demo-nginx** としています
- `-p` : 発行するポートを指定します → 今回は、 ホストマシン上で `localhost:8080`にアクセスすると、コンテナの `80` に繋がれnginxのWelcomeページが表示されるようにしています

```
02 $ docker container create --name demo-nginx -p 8080:80 be1f31be9a87
c7f0448d9fd987a28cddabe61793b1a9df5fac9f376e6d7dab7cc69dc49ae18e
```

コンテナが出来たか確認するには、 `docker container ls` を利用します。ただし、オプションを指定しない場合は、実行中のコンテナしか表示されないため、今回は `-a` オプションを利用します。 `-a` オプションは、全てのコンテナを表示するオプションです。

```
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
c7f0448d9fd9        be1f31be9a87        "nginx -g 'daemon of…"   4 minutes ago       Exited (0) 2 seconds ago                       demo-nginx
```

上記よりコンテナが作成されていることが確認出来ました。

## コンテナの実行
`docker container create` コマンドで作成した場合は、コンテナが停止状態となっています。実行状態にするには、 `docker container start` コマンドを実行します。

先ほど確認した **CONTAINER ID(c7f0448d9fd9)** でコンテナを実行します。

```
02 $ docker container start c7f0448d9fd9
c7f0448d9fd9
```

コンテナが起動されたかを、 `docker container ls` で確認します。

```
02 $ docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
c7f0448d9fd9        be1f31be9a87        "nginx -g 'daemon of…"   17 minutes ago      Up 2 minutes        0.0.0.0:8080->80/tcp   demo-nginx
```

STATUSに、 **Up 2 minutes** と表示されています。これで、起動されていることが確認できます
もしくは、 `docker ps` コマンドでも確認することができます(結果は同じです)。

では、nginxのWelcomeページを表示できるか確かめてみます。

`http://localhost:8080` でアクセスします(ブラウザからでも、 curlコマンドでもOKです)。

```
02 $ curl http://localhost:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
```

![Welcome_to_nginx.png](https://qiita-image-store.s3.amazonaws.com/0/170140/874a7e6f-a868-43f7-d1fa-38ec2de56a49.png)

WelcomeページのHTMLが返却されているので、問題なく実行していることが確認できました。

## コンテナの停止
次に実行中のコンテナを停止してみます。コマンドは、 `docker container stop c7f0448d9fd9` です。

```
02 $ docker container stop c7f0448d9fd9
c7f0448d9fd9
```

コンテナが停止しているか確認してみます。

```
02 $ docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
```

URLからの方も確認してみます。

```
02 $ curl http://localhost:8080
curl: (7) Failed to connect to localhost port 8080: Connection refused
```

![localhost.png](https://qiita-image-store.s3.amazonaws.com/0/170140/134267ee-535e-af33-f91b-734c322f5ba4.png)


## コンテナの削除
最後に作成したコンテナを削除します。コマンドは、 `docker container rm c7f0448d9fd9` です。

```
02 $ docker container rm c7f0448d9fd9
c7f0448d9fd9
```
コンテナが削除されているか確認してみます。

```
02 $ docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
```

削除されていることがわかりました。

以上で基本的な部分の操作は終わりです。
次からは、Dockerで用意されているコマンドについてまとめていきたいと思います。

## まとめ一覧
[Dockerの基礎をまとめてみた ~ 第一章：コンテナ？Dockerとは？](https://qiita.com/supaiku2452/items/8b06b774c0e2fce7df92)
Dockerの基礎をまとめてみた ~ 第二章：Dockerの基本操作
[Dockerの基礎をまとめてみた ~ 第三章：Dockerコマンド - image編](https://qiita.com/supaiku2452/items/cd3d4e2ccd5215f3b6d9)
[Dockerの基礎をまとめてみた ~ 第四章：Dockerコマンド - container編](https://qiita.com/supaiku2452/items/da44b05c4ba4ec13bccf)