Dockerで開発環境構築してみる。この前の続き　〜自分用〜

#前提条件
・すでにDockerはインストール済み。
・Rubyのバージョンは2.6.3を使用する。
・Railsのバージョンは5.2.4を使用する。
・ディレクトリ名はvb_appとする。

#DockerHubからRubyのDockerイメージを入手

```
$ docker pull ruby:2.6.3
Digest: sha256:358f16e92d0f66599103318f7a8528d449b0973fd89e46a1a5c47cec7479f09b
Status: Downloaded newer image for ruby:2.6.3
docker.io/library/ruby:2.6.3
```


Gemfileを生成する為にbundle initを実行。

・Gemfile生成

```
$ docker run --rm -v "$PWD":/usr/src/vb_app -w /usr/src/vb_app ruby:2.6.3 bundle init

#オプションについて
docker run オプション image名:タグ名 実行コマンド
--rm: 実行後のコンテナを削除。指定しない場合はコンテナが残ってしまう。
-v: ホストのディレクトリをコンテナ内のディレクトリにマウント。
"$PWD"はカレントディレクトリのこと。
-w: ワーキングディレクトリを指定。
```
中身を編集

```
Gemfile

source "https://rubygems.org"
gem 'rails', '５．２．４'
```

イメージ内にgemを埋め込む為に、Gemfile.lockを生成しておく。

```
$ touch Gemfile.lock
```

ここでさらに編集

Dockerfile

```

FROM ruby:2.6.3

ENV APP_ROOT /usr/src/vb_app

WORKDIR $APP_ROOT

RUN apt-get update && \
    apt-get install -y nodejs \
                       postgresql-client \
                       sqlite3 \
                       --no-install-recommends && \
    rm -rf /var/lib/apt/lists/*

COPY Gemfile $APP_ROOT
COPY Gemfile.lock $APP_ROOT

RUN \
  echo 'gem: --no-document' >> ~/.gemrc && \
  cp ~/.gemrc /etc/gemrc && \
  chmod uog+r /etc/gemrc && \
  bundle config --global build.nokogiri --use-system-libraries && \
  bundle config --global jobs 4 && \
  bundle install && \
  rm -rf ~/.gem
```

```
FROM: 親イメージの指定
ENV: 環境変数の設定
WORKDIR: ワーキングディレクトリの指定
COPY: ファイルをイメージにコピー
RUN: コマンド実行
```

```
$ docker build -t 開発者名/vb_app .
```

docker build .: カレントディレクトリのDockerfileをビルド
-t: 開発者名/vb_app
でイメージ名が作成される
イメージができているか確認は下記で行う。

```
$ docker images
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
開発者名/vb_app   　　　　　latest              4f5e7b33d235        58 seconds ago      965MB
ruby                     2.6.3               8fe6e1f7b421        9 months ago        840MB

```
イメージの作成が完了する。次にrailsの雛形をrails new . で生成。Gemfileがコンフリクト起こすのでYを選択して上書きをする。

```
$ docker run --rm -it -v "$PWD":/usr/src/vb_app 開発者名/vb_app rails new . -BT
       exist  
   identical  README.rdoc
   identical  Rakefile
   identical  config.ru
   identical  .gitignore
    conflict  Gemfile
Overwrite /usr/src/vb_app/Gemfile? (enter "h" for help) [Ynaqdh] Y


-it: コンテナのプロセスに対してttyを割り当てる
-BT: bundle install 無し、Minitest無し

```

Railsアプリイメージの構築
アプリケーションのイメージを作る。
デフォルトでwebサーバーの起動が行えるようにDockerfileを修正する。

```
Dockerfile

FROM ruby:2.6.3

ENV APP_ROOT /usr/src/vb_app

WORKDIR $APP_ROOT

RUN apt-get update && \
    apt-get install -y nodejs \
                       postgresql-client \
                       sqlite3 \
                       --no-install-recommends && \
    rm -rf /var/lib/apt/lists/*

COPY Gemfile $APP_ROOT
COPY Gemfile.lock $APP_ROOT

RUN \
  echo 'gem: --no-document' >> ~/.gemrc && \
  cp ~/.gemrc /etc/gemrc && \
  chmod uog+r /etc/gemrc && \
  bundle config --global build.nokogiri --use-system-libraries && \
  bundle config --global jobs 4 && \
  bundle install && \
  rm -rf ~/.gem

COPY . $APP_ROOT

EXPOSE  3000
CMD ["rails", "server", "-b", "0.0.0.0"]
```

ビルドしてイメージを再作成する。

```
$ docker build -t 開発者名/vb_app .
```

#Docker-composeの作成
次にDockerfileを管理するためのDocker-composeを作成していく。

Docker-compose.yml

```
version: '3'
services:
  app:
    build: .
    environment:
      RAILS_ENV: development
    ports:
      - '3000:3000'
    volumes:
      - .:/usr/src/vb_app
```
docker-compose.ymlができたら再ビルド。

```
$ docker-compose build
```
```
$ docker-compose up -d
```
コンテナが起動し、さらに起動時にrailsも起動していることがわかる。