初心者によるDocker+WSL2+VScodeの環境設定がよーやくできた！


私にはまだDockerなんてものは早いと思ったんですが、rbenvの設定が全然出来ず、「これはDockerでやったほうが早いわ！」と思って作成。
山浦先生のほぼ丸パクリです。よくわかんない人は見るべき。本当に分かりやすかったです。

https://www.youtube.com/watch?v=lZD1MIHwMBY

本番環境には入れない予定。あくまで忘備録です。

# 先にメモ

Dockerfileとdocker-composeはGemfileとかと同じ位置に配置

# Gemfile
sqliteからmysql2へ

# Dockerfile

```dockerfile:Dockerfile
FROM ruby:2.7

# 追記
ENV RAILS_ENV=production

# 必要なライブラリのNode.jsとyarnをインストールしている
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
  && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list \
  && apt-get update -qq \
  && apt-get install -y nodejs yarn

WORKDIR /app
COPY . /app
RUN gem install bundler:1.17.2 && bundle update --bundler
RUN bundle config --local set path 'vendor/bundle' \
  && bundle install

# 以下追記
COPY start.sh /start.sh
RUN chmod 744 /start.sh
CMD ["sh", "/start.sh"]
```

# docker-compose.yml

```rb:docker-compose.yml
version: '3'
# 2つのサービス(dbとweb)を定義する
services:
  db:
    image: mysql:8.0
    # mysqlの8.0から認証形式が変わったのでその設定
    command:  --default-authentication-plugin=mysql_native_password
    volumes:
      # ローカル:Dockerでsqlのデータを同期する設定
      # コンテナを削除してもデータを引継ぎが出来る
      - ./db/mysql_data:/var/lib/mysql
    # 環境変数の設定
    environment:
      # mysqlはパスワードが無いとエラーになるので設定
      MYSQL_ROOT_PASSWORD: password
  # webというサービスがrailsを示している
  web:
    # 参照先
    build: .
    # rails s でポートは3000、バインドはどこでもOKと設定
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    # 同期設定
    volumes:
      - .:/app
    ports:
      - "3000:3000"
    # webサービスはdbサービスに"依存"しているという記述
    # これを記述するとIPアドレスを指定せずdbと書けば接続出来る
    depends_on:
      - db
```

# database.yml

```yml:config/database.yml
default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: password
  host: db

development:
  <<: *default
  database: app_development

test:
  <<: *default
  database: app_test
  host: <%= ENV.fetch("APP_DATABASE_HOST") { 'db' } %>

production:
  <<: *default
  database: <%= ENV['APP_DATABASE'] %>
  username: <%= ENV['APP_DATABASE_USERNAME'] %>
  password: <%= ENV['APP_DATABASE_PASSWORD'] %>
  host: <%= ENV['APP_DATABASE_HOST'] %>

```

# start.sh

```sh:start.sh
#! /bin/sh

# Dockerfileで普通はif分岐しないのでシェルスクリプトで対応
if [ "${RAILS_ENV}" = "production" ]
then
    bundle exec rails assets:precompile
fi

# PORTの値が無ければ3000を代入する
bundle exec rails s -p ${PORT:-3000} -b 0.0.0.0
```

# .gitignore

```sh:.gitignore
# 追記
.env
/db/mysql_data/*
```


# いよいよ開始！

sudoコマンドかdockerグループを作成すべし。

```console:ubuntu(WSL2)
$ docker-compose run web bundle exec rails new . --force --skip-bundle
$ docker-compose build
$ docker-compose run web rails db:create
$ docker-compose run web rails db:migrate
$ docker-compose up -d
```

localhost:3000に接続して開発環境の設定おわり！いやはや簡単だ～

# Containerを閉じる

`docker-compose down`でコンテナの活動を止めて、`docker system prune -a`で使っていないコンテナを削除。
Dockerのアプリからも出来るからすごいなーと思ってます。

# 事前準備段階で上手くいかない

- linuxをWSL1からWSL2に変更

https://www.aise.ics.saitama-u.ac.jp/~gotoh/WSL1ToWSL2.html

- Docker Desktopのアップデート

https://hub.docker.com/editions/community/docker-ce-desktop-windows/

これが終わってからDocker Desktopの設定変更にとりかかる

# Finish!

間違っていたら教えてください！