dockerがなんなのかざっくり調べてみた

## 対象
「docker, docker」ってよく聞くけど、いまいちよくわからない
仮想環境らしいんだけど、VMWareとかと何が違うの？？
って人向けです

そして先に謝っておくと、あんまり詳しいことは質問されてもわかりませんので質問はしないで。。。

## 用意したPC
mac 2台（MacA, MacB[新品状態]）

## 最初に
自分はDocker完全な素人です
全部調べながらやりました

## まずは何から？
どうやらdockerを使うためにはdockerをインストールするらしい
こちらを参考にアカウントを作成し"docker desktop for mac"をインストールします
[DockerをMacにインストールする](https://qiita.com/kurkuru/items/127fa99ef5b2f0288b81)

これが終わるとdockerのアプリが使えるようになって、コマンドラインでdockerコマンドが使えるようになります
![スクリーンショット 2020-05-05 16.07.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70195/a4b252af-a113-f086-8c4d-f1c269cb6500.png)

```
$ docker version
````

これでdockerを使う準備完了！

## で、、、dockerってなに？
こちらを参考に読んだけど、、、
[【図解】Dockerの全体像を理解する](https://qiita.com/etaroid/items/b1024c7d200a75b992fc)
正直最初は全然理解できなかった・・・

#### 現時点での自分のざっくりとした知識
##### ホスト型仮想化（今までの仮想環境）
virtual boxやVMWareといったソフトを利用して、そこにOSをインストールして使う（PCもう一台買ったようなイメージ）
##### コンテナ型仮想化（docker）
自分のMac内にコンテナと呼ばれる独立スペースを一気に用意する（rubyとかのインストールは自分のMacにインストールされるのではなく、コンテナ内だけにインストールされる）

## docker使うと何がうれしいの？
OSのインストールとかが不要だし、OSの起動とかしなくてもいきなり使える

コンテナってやつはDockerfileというものを使って、簡単に環境構築できるので、
MacAでDockerfileを使って作成した環境は、MacBで同じDockerfileを使ったら同じコンテナが作成できる！

```
$ docker build
```

Dockerfileさえあれば、これだけでみんなと同じ環境が作れる！
開発環境を構築するときに「rubyやpostgresのバージョンは？」とか確認しなくても大丈夫

### Dockerfileとは
コンテナを一気に作ってくれる設定ファイルっぽい
docker hubにいろんな設定が用意されているので、それを呼ぶだけで簡単にrubyとかのインストールが終わる！
https://hub.docker.com/_/ruby
下のほうにあるバージョンから選べばいいだけ

![スクリーンショット 2020-05-05 17.52.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70195/f33c3513-a009-000a-e145-ef7bd0e256a5.png)

```ruby:Dockerfile
FROM ruby:2.6.3
```

## デメリット
元となるPCのOSが同じじゃないとうまく動かない可能性がある
（Macなら"docker desktop for mac"が同じなら大丈夫）

## 実際に使ってみた
実務でrailsとnuxtを使っているので、両方混ぜたやつで試してみた
[Nuxt.js + Rails(API) on DockerのHello Worldするべ！](https://qiita.com/at-946/items/08de3c9d7611f62b1894)
こちらのページを参考に、MacAでなんとか動くものができた！
https://github.com/aiyu427/docker_sample
こちらをMacB[新品状態]で簡単に動かせたら満足

MacBでgit clone
READMEに書いたことを実行すると、、、
無事に動いた！！
（途中でnuxt.configが上書きされていて動かなくなったことを何度も繰り返したけど、、、）

## まとめると・・・
rubyやpostgresとか何もインストールすることなく同じ開発環境が構築できて感激！

## 豆知識
### コンテナはどこに作られる？
macのストレージはコンテナを作るたびに使われていく
コンテナ作ってもdockerアプリの容量は変わらない（当然なんだけど、、、）

dockerのデータフォルダはどこ？？

```
ls -lh ~/Library/Containers/com.docker.docker/Data
```

ここらしいけど見当たらない・・・
<img width="699" alt="スクリーンショット 2020-05-05 17.22.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70195/70c3c9e1-ed13-eeaa-51e6-17ec1e149f7c.png">
さらに奥深く潜っていくと
![スクリーンショット 2020-05-05 18.05.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70195/00041040-6c96-2933-2d32-35bc25adb32e.png)

これがdockerで設定した仮想ディスクイメージサイズに当たるっぽい
![スクリーンショット 2020-05-05 17.27.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70195/5b5cad1c-b0ca-60c8-70e4-e9d2843eecbe.png)

macのストレージで認識されるのは使っている分だけみたい (2.2 GB used)
よくわからないけどストレージ仮想化？とかの仕組みが使われているのかな

### dockerはlinux上じゃないと動かない？
でもMacはlinux環境ではない
じゃあなんで動くの？？

"docker desktop for mac"をインストールしたときに、実は仮想環境でlinuxが用意されているらしい！
そのlinux環境上でdockerを動かしているんだって

### Reset Disk Image してもデータが残ってた！
先ほどのdocker_sampleアプリでデータを作成したけど、
勉強のためにResetして作り直してみた
![スクリーンショット 2020-05-05 18.08.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70195/323d4f0c-cbb2-4ef4-5c32-f8c5fad3daa6.png)


なのにDBにデータが残ったままになっていた！
なんで？？

docker-compose.ymlの設定でvolumesが重要！

```
services:
  db:
    container_name: sample_db
    image: postgres:11.4-alpine
    environment:
      - TZ=Asia/Tokyo
    volumes:
      - ./api/tmp/db:/var/lib/postgresql/data
```

この最後の行の意味が重要だった
「:」は左と右を分けるコロンだった
（「db:」って何かを意味するフォルダだと思っていた・・・）

ローカル：./api/tmp/db
コンテナ：/var/lib/postgresql/data

こんな感じで設定していたみたい
シンボリックリンク貼ってるみたいな感じなのかな
実際のデータはローカルの"./api/tmp/db"に残ってるみたい

ここを

```
    volumes:
      - "db-data:/var/lib/postgresql/data"
volumes:
  db-data:
```

にすると、docker内にVolume（コンテナの仲間みたいなもの）が作られて、そこに保存されるみたいです
Volumeに保存しているとReset Disk Imageしたら消えちゃいます

### containerの中で作業したい

コンテナをチェック

```
$ docker ps -a

CONTAINER ID        IMAGE                                COMMAND                  CREATED             STATUS                   PORTS                              NAMES
e9b045a393fc        app_api_web                          "/bin/sh -c 'rm -f t…"   2 hours ago         Up 14 seconds            0.0.0.0:3000->3000/tcp             app_api_web_1
```

app_api_web_1のコンテナに入る

```
$ docker exec -it app_api_web_1 bash
```

これでコマンド動かせます

```
root@e9b045a393fc:/app_api#
```