Docker composeを使ったWebアプリ開発環境の構築

## Rails開発用のDockerfileを作成する
![dsfklj.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2565038/8ea6e623-09fa-76a5-6ce8-0d5d0a9b2c4d.png)

~~~Dockerfile:Dockerfile
FROM ruby:2.5
RUN apt-get update && apt-get install -y \
    build-essential \
    libpq-dev \
    nodejs \
    postgresql-client \
    yarn
WORKDIR /product-register
COPY Gemfile Gemfile.lock /product-register/
RUN bundle install
~~~

~~~Rails:Gemfile
source 'https://rubygems.org'
gem 'rails', '~>5.2'
~~~


### Dockerfileの中身
~~~dockerfile
FROM ruby2.5
~~~
rubyというイメージのver2.5を使う


~~~dockerfile
RUN apt-get update && apt-get install -y \
    build-essential \
    libpq-dev \
    nodejs \
    postgresql-client \
    yarn
~~~
必要なパッケージをインストールする

~~~dockerfile
WORKDIR /product-register
~~~

product-registerというフォルダをホスト側に作っているので
コンテナ側にもルート直下でproduct-registerを作っておいて
そこをワークディレクトリとして作業していく


~~~dockerfile
COPY Gemfile Gemfile.lock /product-register/
~~~
###### <font color = "red">RubyのイメージにはRailsは無い!!</font>
ホストで作ったGemfileを使ってRailsをインストールする!!
ホストで作ったGemfileをコンテナにコピーする!!

~~~dockerfile
RUN bundle install
~~~
コンテナにGemfileが出来るのでbundle installというコマンドを実行する

#### 必要なパッケージが分からない!!
- コンテナを立てて、Railsを起動してみて何かエラーが出る度にパッケージをインストールすれば良い!!

- 実際にはパッケージをインストールする部分は && で繋げるのではなく、RUNで1個1個書いていく!!

- Railsを起動してエラーが出る度に追加する!!

- xxx, yyyをインストールする -> Rails起動 -> エラー発生!!<br>
解決法がzzzをインストールする -> zzzというパッケージをインストールする

~~~dockerfile:Dockerfile
RUN apt-get update
RUN apt-get install -y xxx
RUN apt-get install -y yyy
RUN apt-get install -y zzz
~~~

##### ある時点でエラーが出ず、自分のアプリがきちんと動く事が確認出来たら && で繋げる!!

~~~
$ docker build .
~~~

##### <font color ="red">エラー発生!!</font>
![error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2565038/356e51bd-1ff8-3af1-b229-e325832b1fc0.png)


~~~
Unable to locate package libpa-dev
~~~

~~~dockerfile:Dockerfile
FROM ruby:2.5
RUN apt-get update && apt-get install -y \
    build-essential \
    libpa-dev \
    nodejs \
    postgresql-client \
    yarn
WORKDIR /product-register
COPY Gemfile Gemfile.lock /product-register/
RUN bundle install
~~~

libpa-devというパッケージは無い!!
=> libpq-devに修正する!!

再度、docker build . する!!
![dfkjsl.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2565038/f1b59b70-46ac-abd2-4e6d-fae292c89aa5.png)

## docker-compose.ymlの書き方

##### こんな時にDocker-composeと使う!!
- $docker runコマンドが長くなるとき
- 複数のコンテナをまとめて起動する時

~~~docker-compose.yml:docker-compose.yml
version: '3'

services:
  web:
    build:.
    ports:
        -'3000:3000'
    volumes:
      - '.:product-register'
    tty:true
    stdin_open:true
~~~

##### ymlの書き方は基本的にkeyとvalueの組み合わせで書く
~~~
key:value
~~~
<br>
<br>

##### 書いてある内容:
~~~
version: '3'
~~~

docker-composeのバージョンを指定する
<br>



~~~
services:
  web:
    build:.
    ports:
        -'3000:3000'
    volumes:
      - '.:product-register'
    tty:true
    stdin_open:true
~~~
<br>

~~~
services:
~~~
serviceを複数入れるための親のキー
<br>

~~~
 web:
    build:.
    ports:
        -'3000:3000'
    volumes:
      - '.:product-register'
    tty:true
    stdin_open:true
~~~

webのサービスに対するパラメータを書いている!!

##### <font color ="red">コンテナを起動する時にどんなパラメータを使うのかを書いている!!</font>

##### docker run で指定していたオプションを書いている!!

~~~
build: .
~~~
docker build の情報を書いている。

<br>

~~~
ports:
　－'3000:3000'
~~~
ポートを指定している

<br>

~~~
volumes: 
    - '.:/product-register'
~~~

コンテナ内でも使うホストのファイルを指定する
##### <font color ="red">相対パスで指定する!!</font>

~~~
tty:true
stdin_open:true
~~~
$ docker run -itの-itというオプションと同じ役割


## Railsのセットアップ