4
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

もう逃げない。基礎から学ぶDocker入門 / Docker Composeを使ってRailsの環境を構築する(8/9)

Last updated at Posted at 2021-09-25

はじめに

今まで、全然理解できていなくて逃げてたDockerに関して、しっかり理解していこうと思います。

コレまで、便利なんだろうなと思いながらも、逃げてました。

なので、開発環境では使いこなせるスキルにまでは理解したいと思います。

あと、暗記してたDockerコマンドを1つ1つ理解していきます。

以下のような順番で勉強していきます。

Docker Composeを使ってRailsの環境を構築する

Railsを題材に、複数のアプリケーションを組み合わせた、実践的なサービスをDocker Composeを使って構築していきます。

流れ

    1. Dockerfileの作成
    1. 初期設定
    1. Dockerを起動
    1. 実際の開発時に使いそうな操作

Dockerfileの作成

ディレクトリ構成

rails_docker/
 └ src/
   └ Gemfile
docker-compose.yml
Dockerfile
  • プロジェクト直下にDocker関連のファイルを置いてます
  • Railsのソースコードはsrc配下に

Dockerfileを見てみます

Dockerfile
FROM ruby:2.7

# Yarnのレポジトリを有効化。レポジトリのGPGキーをcurlコマンドを使って取得する(debianはubuntuと互換性がある)
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -

# YarnのAPTパッケージレポジトリを自分のシステムに追加。teeコマンドを使って書き込み。
RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list

# レポジトリがシステムに加えられたらパッケージリストをアップデートしてからYarnをインストールする
RUN apt-get update -qq
RUN apt-get install -y nodejs yarn

# Dockerコンテナ上の作業ディレクトリ
WORKDIR /app

# ローカル開発環境の./src配下の内容をDockerコンテナ上の/appにコピー
COPY ./src /app

# gemファイルのインストール
RUN bundle config --local set path 'vendor/bundle' && bundle install

Gemfile
source "https://rubygems.org"

gem 'rails', ' ~> 6.1.0'

rails newで必要なファイルをごそってインストールできるので

docker-compose.yml
version: "3"
services:
  db:
    image: mysql:8.0
    command: --default-authentication-plugin=mysql_native_password
    volumes:
      - ./src/db/mysql_data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: password
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - ./src:/app
    ports:
      - "3000:3000"
    depends_on:
      - db

docker-compose.yml では、2つのサービスを定義しています。

1つは、dbのサービス、もう1つは、webです。

db

dbはMySQL(8.0)、webの方はRailsを用意しています。

volumesはマウントする設定ファイルのパスを指定(mysqlのconfなど)。

dbの場合、ローカル開発環境の./src/db/mysql_dataの内容をDockerコンテナ上の/var/lib/mysqlにマウントするという意味

volumeとして定義すると、データを永続的に持てるので、コンテナを作り直してもmデータを保管しておけます(開発が楽になります)。

environment環境変数に関する設定です。MYSQL_ROOT_PASSWORDという環境変数にpasswordというものを入れています。

web

build: . ベースのイメージを同じディレクトリ内にあるDockerfileを参照するよという意味。

command: はrailsでサーバを立ち上げる方ならお馴染みかもしれませんね。ポートは3000を指定していて、IPアドレスは全てを受け入れていますね。

volumes は、ローカル開発環境の./src以下の内容をDockerコンテナ上の/appにマウントするという意味

ports は、ローカル開発環境のport: 3000をDockerコンテナ上のport: 3000に接続するという意味

depends_on は、依存関係を表します。webはdbに依存するよという意味。これすると、接続の設定が楽になる。ここら辺がDocker Composeのいいところなのかもしれませんね。


この設定をしておくことで、コマンド一発で環境ができるので、楽ですね。

初期設定と作成

web

rails newして、railsの雛形を作りましょう

コマンドを実行したいので、docker-compose runを使います。

docker-compose run web rails new . --force --database=mysql

docker-compose runの後、 webとありますが、docker-compose.ymlでは、serviceswebdbがあるので、どちらかを選ぶ必要があります。

実行後、railsの雛形が作成されます。

インストールが完了したら、新しいgemfileが作成されます。また、src/に大量のファイルが作られたことも確認できると思います。

Gemfileの内容が更新されたり、Dockerfile自体が更新されたら、再度、Dockerイメージをbuildする必要があります。

docker-compose build

[+] Building 464.5s (13/13) FINISHED
 => [internal] load build definition from Dockerfile                                                                                                                                                       0.1s
 => => transferring dockerfile: 32B                                                                                                                                                                        0.0s
 => [internal] load .dockerignore                                                                                                                                                                          0.0s
 => => transferring context: 2B                                                                                                                                                                            0.0s
 => [internal] load metadata for docker.io/library/ruby:2.7                                                                                                                                                3.0s
 => [1/8] FROM docker.io/library/ruby:2.7@sha256:29cb031943ce6279ad88af96a29f2843fc37e33c705b6d511e23326e8cad1592                                                                                          0.0s
 => [internal] load build context                                                                                                                                                                         29.1s
 => => transferring context: 218.84MB                                                                                                                                                                     29.0s
 => CACHED [2/8] RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -                                                                                                                     0.0s
 => CACHED [3/8] RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list                                                                                         0.0s
 => CACHED [4/8] RUN apt-get update -qq                                                                                                                                                                    0.0s
 => CACHED [5/8] RUN apt-get install -y nodejs yarn                                                                                                                                                        0.0s
 => CACHED [6/8] WORKDIR /app                                                                                                                                                                              0.0s
 => [7/8] COPY ./src /app                                                                                                                                                                                 17.1s
 => [8/8] RUN bundle config --local set path 'vendor/bundle' && bundle install                                                                                                                           389.8s
 => exporting to image                                                                                                                                                                                    24.9s
 => => exporting layers                                                                                                                                                                                   24.8s
 => => writing image sha256:b5758e167ecb8271025a90864e7863e1b2e58d945623dff7cd45f237b5ef7a87                                                                                                               0.0s
 => => naming to docker.io/library/rails_docker_web

これで、更新されたGemfileの内容を含んだDockerイメージが生成されました。

dbの設定

DBの設定をみていきます。

rails_docker/src/config/database.ymlを見ていきましょう。

src/config/database.yml
...
username: root
password: password
host: localhost
...

まずは、passwordの設定(passwordと書くだけ)。

これは、docker-compose.ymlのdb.environment.MYSQL_ROOT_PASSWORDと一致させる必要があります。

続いて、hostです。hostは、DBの接続先です。

host: localhost → host: db

のように変更します。

これは、docker-compose.ymlのdb.environment.web.depends_onの値と一致させることで、dbが使えるようになります。

dbの作成

docker-compose run web rails db:create

[+] Running 1/0
 ⠿ Container rails_docker_db_1  Running                                                                                                                                                                    0.0s
Created database 'app_development'
Created database 'app_test'

rails使う方にはお馴染みだと思いますが、railsを通じてDBの作成を行なっています。

Dockerのdbのコンテナを作成しても、まだDBは出来ていないので。

railsの環境設定に慣れている方であれば、それほど難しくなかったですね。

Dockerを起動

初期設定が完了したので、起動させていきましょう。

docker-compose up

docker-compose.ymlファイルに、DBを作ったり、Railsのwebサーバを立ち上げたりするコマンドを書いたので、サーバが立ち上がるはずです。

http://localhost:3000/にアクセスして

いつもの

image.png

が出れば、成功ですね。

:v_tone1::smiley::v_tone1:

実際の開発時に使いそうな操作

最後に、実際の開発に必要な追加操作を紹介します。

サーバの停止

docker-compose down

再度、立ち上げたいときは

docker-compose up -d

何度か説明してますが-dはデタッチドモード(裏側)で動いてくれます。

コンテナごとの状態などをリストで見たい時

docker-compose ps

NAME                 COMMAND                  SERVICE             STATUS              PORTS
rails_docker_db_1    "docker-entrypoint.s…"   db                  running             3306/tcp, 33060/tcp
rails_docker_web_1   "bundle exec rails s…"   web                 running             0.0.0.0:3000->3000/tcp, :::3000->3000/tcp

ログを見たい時

docker-compose logs

開発に詰まったら見ることもあると思います。

コマンドを実行したい時

docker-compose exec web /bin/bash

すると、webの方のコンテナ内でbashが使えるようになります。

DockerファイルやGemfileの修正を反映させたい場合

docker-compose build

これでイメージが作成されます。

次に

docker-compose up -d

で、コンテナが作成・起動します。


以上です。

アウトプット100本ノック実施中

4
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?