ガチのプログラミング初心者がrailsの開発環境としてDockerを勉強


投稿する背景

未経験から自社開発企業さんへの転職を目指して少しでも技術力向上できるように、Dockerについてアウトプットしていきたい。

このページについて

主にはDocekrfile、docker-compose.ymlの中身についてです。
色んなページを読んで掴んだイメージを記載していくので、間違いがあれば訂正して頂けると幸いです。

参考URL(本当にありがとうございました)

https://qiita.com/nsy_13/items/9fbc929f173984c30b5d
https://qiita.com/soushiy/items/0945bcbc7ecce4822985
https://qiita.com/miyasakura_/items/87ccb6d4a52d4a00a999

Dockerとは??

・コンテナ型の仮想環境とのこと
・とりあえず軽量で高速動かせるから便利
・簡単に環境構築ができちゃう(最初めっちゃ苦労したっちゅうに。。。)

他の仮想環境と何が違うのか。

・VirtualBoxを使って仮想環境を作る時は、ホストOS(Macなど)の上でハイパーバイザーというもの利用してゲストOS(LINUXなど)を動かしているから、遅くなる。
・チーム開発をしている時に他のメンバーと環境を合わせるのが大変。

Dockerを使うにあたっての大まかな流れ

1:Dockerをインストール(私の場合はDocker for Mac)
2:Dockerfile作成
3:Dockerfileをもとにイメージを作成←build
4:作成したイメージをもとにコンテナをつくる←run
5:開発できるようになる

環境構築のための準備

・Dockerfile
・docker-compose.yml
上記のファイル2つが設計図のようなもので、ここから環境が構築される!!!

Dockerfileの中身

FROM ruby:2.6
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 \
    && mkdir /アプリ名
WORKDIR /アプリ名
COPY Gemfile /FANTRA/Gemfile
COPY Gemfile.lock /FANTRA/Gemfile.lock
RUN bundle install
COPY . /アプリ名

COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

CMD ["rails", "server", "-b", "0.0.0.0"]


1行の操作を{命令}と{引数}を表している。{命令}で大文字と小文字を識別しないけど、分かりやすいように大文字で書くのが基本!!!!

◆各コマンドの意味は以下の通り。

命令 用途
FROM 元となるDockerイメージの指定
MAINTAINER 作成者の情報
RUN コマンドの実行
ADD ファイル/ディレクトリの追加
CMD コンテナーの実行コマンド 1
ENTRYPOINT コンテナーの実行コマンド 2
WORKDIR 作業ディレクトリの指定
ENV 環境変数の指定
USER 実行ユーザーの指定
EXPOSE ポートのエクスポート
VOLUME ボリュームのマウント

docker-compose.ymlの中身

docker-compose.yml
version: '3'
services:
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: password
    ports:
      - '3306:3306'
    command: --default-authentication-plugin=mysql_native_password
    volumes:
      - mysql-data:/var/lib/mysql
  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/アプリ名
+     - bundle:/usr/local/bundle
    ports:
      - "3000:3000"
    depends_on:
      - db
    stdin_open: true
    tty: true
    command: bundle exec rails server -b 0.0.0.0
volumes:
  mysql-data:
    driver: local
+ bundle:
+   driver: local

参考ページと違うのが「+」の部分。これを書き足すことで、bundle installの後にbuildをわざわざする必要がなくなって、作業スピードを早められる。(volumeの永続化って呼ぶらしい)

build(イメージを作成する)

railsアプリを作成するためにGem、Gemfile.lock、entrypoint.shを設定したらイメージをビルドする。

$ docker-compose build

buildを行うと、Dockerfileに書かれたCOPYやRUNなどのコマンドが実行され、イメージが作成される。runすると、ENTRYPOINTに書かれたコマンドがコンテナ上で実行される。

・イメージとは?
コンテナの素で、イメージからコンテナが起動される。
基となるDocekrfileをビルドして作成する。

おわりに

railsの環境構築をするためには他のファイルについても書く必要があるけど、とりあえずdocker-compose.yml・Dockerfileについてだけ。
もっといい書き方が合ったり、プログラミング初心者でもDockerの理解が深めることができるページがあればぜひ教えて頂きたいです。

色んなページをみてると勉強不足が露呈して焦るのでもっと勉強します!!!
賢くなったらどんどん編集していくのでよろしくお願い致します。