大丈夫、俺もDocker分かってないから一緒にやろう。

# はじめに：挫折しても良い

プログラミング学習って、用語の難しさとか学習コストの高さとかでやっぱ大変なことですよ。
時代が変わって、ハードルは低くなったが未だに「難しそう」という固定概念はあるし、やった事がないことなんて大抵難しいそうなもんです。。
いまだにプログラミングってやつには全然なれなくて、めっちゃ悔しいわけだが、アウトプットをさせて欲しいです。

#公式の説明文でポルナレフ状態になろう(困惑)

まず最初にみてもらいたいのは、docker社の公式HPでの説明文だ。
え、エンジニアは英語にアレルギー感じちゃダメだって・・？

「そうかもしれないが、今じゃない。俺はDockerが触りてえんだよ゛お゛お゛ぉ゛お゛！゛！゛！゛ん゛あ゛あ゛あ゛あ゛あ゛ぁ゛ぁ゛あ゛あ゛！゛！゛！゛！゛。」
ってことで翻訳にかけてみた。

<img width="1440" alt="スクリーンショット 2019-11-24 0.08.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453260/02569083-5c4b-1be4-29ce-6bc1dc5189c0.png">

翻訳してみると、こんな感じの解釈になる。
コイツァ...頭が痛い。。まるでセンターの現代文みたいだ。

![名称未設定ファイル (57).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453260/eca672df-d9f8-d806-93f7-5183ba94662e.jpeg)

この時点だと俺もDockerに対する認識はこんな感じだ。

![名称未設定ファイル (59).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453260/558412aa-083a-efdc-51da-8b351f5c32e5.jpeg)

でも、これじゃあ困る。
dockerを使えると嬉しくなるっぽいので、なんとかdockerとは何者なのか、
何ができるのか知っておきたい。

#Dockerの要点をまとめてみた。

まず、具体的作業を説明する前に一通りやってみた上でDockerについてまとめてみた。

---概要---
・コンテナ型の仮想環境を作成、配布、実行するためのプラットフォーム
・仮想マシン(VirtualBoxなど)と比較されやすい
・Linuxのコンテナ技術を使ったもの
・ホストマシン(PC)のカーネル(OSの中核)を利用し、プロセス(実行状態にあるプログラム？)やユーザなどを隔離することで、あたかも別のマシンが動いているかのように動かすことができる。

---メリット---
・コード化されたファイルを共有することで、どこでも誰でも同じ環境が作れる。
・作成した環境を配布しやすい。
・スクラップ＆ビルドが容易にできる。
・軽量で高速に起動、停止などが可能

---やった作業(復習)---
参考記事：https://qiita.com/wMETAw/items/8cb41425a5d0bdace2df
詳細説明：https://qiita.com/azul915/items/5b7063cbc80192343fc0

① dataonlyコンテナを生成
② webserverコンテナ・dbserverコンテナの生成
③ Docker Composeによる複数コンテナの起動
④ データの確認
⑤ MySQL接続

#今の時点で知っておいて欲しいこと

・自分のパソコンの中に、もう一個パソコンを擬似的に作ることをこれからする。
・イメージ的には「スマホでゲームボーイのゲームを起動する」みたいなことをするっぽい。
・メリットは速さ・手軽さ

#具体的手順1 "ファイル構成"

![名称未設定ファイル (60).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453260/6179a040-6a05-5184-02f8-61da0c876a13.jpeg)

`$ mkdir dataonly`
dataonlyという名前のディレクトリ作成

`$ touch Dataonly`
Dataonlyファイルの作成

`$ touch Gemfile`
Gemfileファイルの作成(Railsのgemについては下記リンク参照)
※https://qiita.com/kamohicokamo/items/ded4cad5be1778547640

`$ touch Gemfile.lock`
Gemfile.lockファイルの作成

`$ touch docker-compose.yml`
docker-compose.ymlファイルの作成

※ディレクトリとファイルの違い
https://webliker.info/60828/

ディレクトリやファイル作成に困るようになら、右クリックでファイル作成・フォルダ作成でもいい。


#具体的手順2 "各ファイルの中身について"

①ファイルを開く
$ open /dataonly/Dockerfile
②下記テキストをコピペ。
Dockerfileの中身を編集


```Dockerfile.
FROM ruby:2.3.3
# RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN apt-get update -qq
RUN apt-get install -y build-essential 
RUN apt-get install -y libpq-dev
RUN apt-get install -y nodejs
# ワーキングディレクトリの設定
RUN mkdir /myapp
WORKDIR /myapp
# gemfileを追加する
ADD Gemfile /myapp/Gemfile
ADD Gemfile.lock /myapp/Gemfile.lock
# gemfileのinstall
RUN bundle install
ADD . /myapp
```

書き終わったら、内容を保存するためにテキストエディタ上で保存(winならctrl+S/macならcommand+S)
①と②の作業を下記ファイルでも実行(ただし、コピペする内容は下記の内容でやる。)

`$ open dataonly/Gemfile`
Gemfileの中身を編集

```Gemfile.
source 'https://rubygems.org'
gem 'rails', '5.0.0.1'
```

`$ open dataonly/Gemfile`
docker-compose.ymlの中身を編集

```docker-compose.yml
db:
  image: mysql:5.7
  environment:
    MYSQL_ROOT_PASSWORD: root
web:
  build: .
  command: bundle exec rails s -p 3000 -b '0.0.0.0'
  volumes:
    - .:/myapp
  ports:
    - "3000:3000"
  links:
    - db
```

#具体的手順3 "Railsでプロジェクトを作成"
rails newでプロジェクトを作成

`$ docker-compose run web rails new . --force --database=mysql --skip-bundle`

docker-composeを走らせて、rails newする。

※docker-composeとは、複数のコンテナから成るサービスを構築・実行する手順を自動的にし、管理を容易にする機能。

※rails newについて→https://www.sejuku.net/blog/14144
後で再度ビルドを行う必要がある為、--skip-bundleでビルドをスキップする。

#具体的手順4 "DBhostの修正を行う"

`$ open config/database.yml`

元の内容を下記内容に書き換える

```database.yml
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: root
```

  password: root # docker-compose.ymlのMYSQL_ROOT_PASSWORD 
  host: db       # docker-compose.ymlのサービス名

#具体的手順5 "Docker上でRailsを起動させる"

コンテナをビルド(https://wa3.i-3-i.info/word12775.html)
`$ docker-compose build`


コンテナの一斉起動
`$ docker-compose up`
●なぜ一斉起動が必要か?(https://knowledge.sakura.ad.jp/5736/)

・DB作成
`$ docker-compose run web rails db:create`

・通常、RailsでDBを作成しようとするなら、下記のURLを利用。
https://techacademy.jp/magazine/7207

確認(きちんとできているか)
http://localhost:3000/

#具体的手順6 "中身を入れて動作を確認する"

・scaffoldでCRUDを生成してみる

●scaffoldとは何か
https://techacademy.jp/magazine/7204

●CRUDについて
CRUD（クラッド）とは、ほとんど全てのコンピュータソフトウェアが持つ永続性の4つの基本機能のイニシャルを並べた用語。その4つとは、Create（生成）、Read（読み取り）、Update（更新）、Delete（削除）である。


scaffoldする。
`$ docker-compose run web rails g scaffold users name:string`

migrationする
`$ docker-compose run web rails db:migrate`

●migrationとは何か
https://qiita.com/right1121/items/0a54ba76dc4261702d1e

・動作確認しよう！
http://localhost:3000/users