はじめに
今まで、全然理解できていなくて逃げてたDockerに関して、しっかり理解していこうと思います。
コレまで、便利なんだろうなと思いながらも、逃げてました。
なので、開発環境では使いこなせるスキルにまでは理解したいと思います。
あと、暗記してたDockerコマンドを1つ1つ理解していきます。
以下のような順番で勉強していきます。
- Dockerの概要(1/9)
- Dockerの基本操作(イメージの作成, コンテナの起動, 停止, 削除)(2/9)
- Dockerの基本操作(ログの出力, コンテナの中でプロセスを実行する方法, 使用していない Docker オブジェクトの削除)(3/9)
- Dockerfileを使用したサーバー構築(座学編)(4/9)
- Dockerfileを使用したサーバー構築(実践編)(5/9)
- Docker Composeの概要(座学編)(6/9)
- Docker Composeのよく使う基本操作(7/9)
- Docker Composeを使ってRailsの環境を構築する(8/9) 今ここ
- Docker上に構築したRailsをHeroku(本番環境)にデプロイ(公開)する(9/9)
Docker Composeを使ってRailsの環境を構築する
Railsを題材に、複数のアプリケーションを組み合わせた、実践的なサービスをDocker Composeを使って構築していきます。
流れ
-
- Dockerfileの作成
-
- 初期設定
-
- Dockerを起動
-
- 実際の開発時に使いそうな操作
Dockerfileの作成
ディレクトリ構成
rails_docker/
└ src/
└ Gemfile
docker-compose.yml
Dockerfile
- プロジェクト直下にDocker関連のファイルを置いてます
- Railsのソースコードはsrc配下に
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
source "https://rubygems.org"
gem 'rails', ' ~> 6.1.0'
rails new
で必要なファイルをごそってインストールできるので
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
では、services
がweb
とdb
があるので、どちらかを選ぶ必要があります。
実行後、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
を見ていきましょう。
...
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/
にアクセスして
いつもの
が出れば、成功ですね。
実際の開発時に使いそうな操作
最後に、実際の開発に必要な追加操作を紹介します。
サーバの停止
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本ノック実施中