①Dockerを初めて導入して基本操作する (2020.4時点)

雑食系オンラインサロンにてDockerの重要性を理解しましたので、
このたび、ポートフォリオづくりの流れで実装していきます。

本稿は、
DockerHubアカウント取得 → DockerDesktop(mac)インストール → 操作の練習
という流れです。


自分と同じように、
何していいかわからないゼロスタートの方になるべくわかるようにしたいと思っています。


前提
-------
macOS : Catalina 10.15.3
ruby : 2.5.1
Rails : 5.2.4.1
ターミナル使用
Docker version 19.03.8



では、はじめましょう！

1.Dockerをインストールする
------------

・Docker for Macをインストールする

・DockerHubのアカウントを作ってログイン、DockerHubからimageをダウンロードします。 

・DockerHubのURLはこちら
　　https://hub.docker.com/editions/community/docker-ce-desktop-mac

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/17c87103-8bed-1f45-22f4-2664bad522cd.png)


では、はじめに、ユーザ新規登録します。
<img width="517" alt="Create a Docker ID.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/1b8021de-6ff3-eae8-3e32-5b1727da26d0.png">


サインインしたら、「Get Docker」ボタンを押します。
<img width="1429" alt="check your inbox to verify the email associated with this account. You won&#x27;t be able to create a repository or configure your Doc.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/f343e3a9-d0d1-259e-b273-3576f0c066d1.png">


ダウンロードを終えると以下の指示がありますので、Dockerをアプリフォルダに移します。
<img width="724" alt="drag and drop.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/508ee095-e541-fc0f-0c27-cda2a71f0005.png">

アプリを起動したら、サインインを完了させます。
<img width="341" alt="Docker Desktop is now up and running!.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/4a76b222-dd4f-88e8-4ea3-66eb35ab0d84.png">

Dockerがインストール完了できたか、ターミナル上で　docker version　コマンドを実行します。
 

```sh:ターミナル 
docker version
```
こんな感じになります。

<img width="450" alt="Last login.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/473b05f9-ad22-e3e7-a4a5-b73642c13aee.png">

2.Dockerコマンドでコンテナイメージを取得する
-------------
コンテナを作成する際、Dockerfileを作成しなくともコマンドだけでコンテナの起動が可能です。
Docker Hub上に存在する「Nginx（エンジンエックス）」 のコンテナイメージをローカルにPULLしてみます。

Nginx（エンジンエックス）は本番環境で使用するフリーWebアプリケーションサーバーです。
当方は、デプロイでよくお世話になっています。

・Docker Hub上で「Nginx」 を検索すると　PULLコマンドが右の黒いボックスに出てきます。
￼


<img width="1432" alt="Explore.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/61898c8e-93b1-dfa9-1f80-42233f7c271b.png">


コマンド「docker pull nginx」をターミナル上にコピペして実行してみます。

```sh:ターミナル
docker pull nginx
```
こんな感じになります。
￼<img width="700" alt="user@keisukeagamiAir ~  docker pull nginx.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/07fa8196-2ef5-7ff3-bcdb-d9f57d0bd6fe.png">

docker imagesコマンドを実行してイメージを取得できているか確認します。

```sh:ターミナル 
docker images
```
こんな感じです。
<img width="746" alt="[user@keisukeagamiAir ~  docker images.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/71da56eb-b354-af28-51fa-3a616fc80895.png">



3.取得したコンテナイメージを「 runコマンド 」で起動する
-------------------

```sh:コマンド
docker run -d -p[ホスト側ポート]:[コンテンナ側ポート][タグ名]　
```


```sh:コマンドの補足
-d :  バックグラウンドでコンテナ起動
-p :  ポートの指定　ホスト側は localhostポート番号 となります
       （railsでlocalhost:3000打ちますよね、ご存知の方は多いかと思います、それです）

タグ名 : nginx
       任意で、タグ名の前に「 test 」というコンテナネームをつけてみました。
```


ホスト側のポート番号を8081　→localhost:8081
コンテンナ側ポート番号を80 にして
「runコマンド」 を実行してみます。



```sh:ターミナル
docker run -d -p 8081:80 --name test nginx
```
こんな感じです。
<img width="708" alt="docker run -d -p 808180 --name test nginx.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/0f2a4232-882f-bd09-0bac-75c70d721b91.png">


ブラウザで　URLに 「localhost:8081」　と入力しますと表示されました。起動してるっぽいけど？
￼
<img width="743" alt="Welcome to nginx!.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/7a1cb050-fd34-56ac-bc52-c5d17d5fb2f8.png">


では、以下のコマンドでコンテナの状態を見てみます。

```sh:コマンド
docker ps -a
  or
docker container ls
```


真ん中あたり 「STATUS が Up」 になっていますので、起動しています。
￼
<img width="1143" alt="[user@keisukeagamiAir ~  docker ps.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/6e52167d-adf7-eaf8-eb4d-1368adc97dd2.png">


4.起動しているコンテナを停止する
---------
以下のコマンドでコンテナを停止させてみます。


```sh:コマンド
docker stop [コンテナID]
  or
docker container stop [コンテナ名]
```

今回は、コンテナ名で実行してみます。

```sh:ターミナル
docker container stop test
```

こんな感じです。
<img width="468" alt="[user@keisukeagamiAir.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/67908d0d-2030-af60-a45a-28b22c77e60e.png">


ぱっと見、よくわかりませんので、以下のコマンドで状態を確認します。


```sh:コマンド
docker container ls
   or
docker container ls -a
```
コマンド docker container ls -a を見ると、
STATUS が Exited(終了しました) なので、停止したようです。

<img width="1135" alt="[user@keisukeagamiAir ~  docker container 1s.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/8e22573c-872b-1f54-5ec6-5d09b966e647.png">


ブラウザで　localhost:8081　と入力しますと、こうなりました。

<img width="716" alt="ZOH1HE77EzTtA.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/5d899f63-75c4-31e6-6220-5f032b5d476a.png">

これでコンテナは停止していることがわかります。


5.停止したコンテナを削除する
-------------
今回は、もう必要ありませんのでコンテナを削除します。


```sh:コマンド
docker rm [ コンテナID ]  カッコは要りません
```


 

削除したいコンテナのIDを確認します。


```sh:ターミナル
docker container ls -a
```

実行するとこんな感じです。
<img width="1139" alt="CONTAINER ID.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/b4c33d91-3c23-e3e0-208d-95291ff6bc5e.png">

￼
削除したいコンテナのIDがわかったので、削除コマンドを実行します。



```sh:ターミナル
docker rm c6d60e5c8239
```


```sh:ターミナル
docker container ls -a
```

こんな感じです。
<img width="1033" alt="user@keisukeagamiAir ~  docker rm c6d60e5c8239.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/c5cb111d-7462-e843-6e20-366b154b1464.png">

無事削除できたようです。


6.コンテナイメージを削除する
--------------
コンテナを削除できましたので、あとは残っているコンテナイメージまで削除します。

docker images を実行してコンテナイメージの状態を確認します。


```sh:ターミナル
docker images
```

こんな感じです。
<img width="744" alt="docker images.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/5d0028f0-01fa-9603-0b77-347287145fe2.png">




イメージを削除するコマンドを実行します。

```sh:コマンド
docker image rm [ image名 or imageID ]　カッコは不要です
```
今回はImageIDを使ってみます。


```sh:ターミナル
docker image rm ed21b7a8aee9
```

実行します。
続いて、削除できたか確認します。


```sh:ターミナル
docker images
```
￼
こんな感じです。
<img width="772" alt="Untagged nginx@sha256282530fcb7cd19f3848c76611043‡8243781000595.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/62de5dee-e4e1-5c0c-f064-6bc727c0f996.png">

無事、イメージを削除できました。

#7.まとめ
**1. DockerHub からimage(コンテナイメージ)を取得する**
　・image取得コマンド：　docker pull [image名]
　・オブジェクト指向で例えると、image は クラス (例："くるま"という概念の設計図)
　・コンテナの素になるもの

**2. docker run コマンドを実行して、image(コンテナイメージ)からコンテナ(contaier)ができる**
　・オブジェクト指向で例えると、container は インスタンス (例："くるま"概念から作った"トヨタ車"の設計図)
 　・コンテナはイメージから作られる実際の動作環境
　・原則１コンテナ１アプリ
　・コンテナでは環境変数やポートなどさまざまな設定ができるようになる

**3.もし、いらなくなったら、コンテナを停止して削除 → コンテナの素のイメージも削除する**
　・コンテナの停止コマンド：　docker container stop [コンテナID or コンテナ名]
　・コンテナの削除コマンド：　docker rm [コンテナID]
　・イメージの削除コマンド：　docker rmi [イメージID]


#8.最後に
当方、
実務未経験＋初学者＋テッ○キャンプ卒業＋転職活動中であります。
初めての投稿です。
この先のdocker実装を進めつつ、わかりやすい記事を寄稿していきたいと考えています。

・参考にさせていただいた記事です。
　**[DockerをMacにインストールする（更新: 2019/7/13）](https://qiita.com/kurkuru/items/127fa99ef5b2f0288b81)
　　本当にありがとうございました。

##ローカル・Dockerで開発環境を整えるまでの続編
**[②Dockerを初めて導入してRails sする (2020.4時点)](https://qiita.com/SakagamiKeisuke/items/d64ee54c22378223659a)**
**[③Docker MYSQLにデモデータ(seed_fu)を投入する!(2020.4時点)](https://qiita.com/SakagamiKeisuke/items/4ce1c4a4921abb57b896)**
**[④ローカルDocker環境でデータ永続化、entrypointでseed_fuをやり直しする(2020.4.時点)](https://qiita.com/SakagamiKeisuke/items/8d3fc70a2939cd4bbe3e)**
**[⑤AWS仮想サーバを利用する、AWSアカウント作成 + EC2インスタンス作成(2020.4時点)](https://qiita.com/SakagamiKeisuke/items/9568754f318edd53e39d)**
こちらも続けて見ていただけると流れがわかると思います。