TaNA LABO
エンジニアリング

April 27, 2020

コンテナ
Docker

docker-composeの基本操作とDocker + Railsの開発環境構築ハンズオン

post 38

一般的なWebシステムは、単一のアプリケーションやミドルウェアだけで成立することはなく、アプリケーション同士の連携が必要。そのため実際の開発ではdocker-composeの利用が一般的になる。


今回はDockerの基礎知識を再復習した上で、docker-composeの基本的な使い方や永続化データの取扱い、更にハンズオンとしてRails環境の構築までを実施。

Docker-Composeの基本

Docker-Compose はyaml形式で定義された設定ファイルから、複数のコンテナ実行を一括管理。

version: "3"
services: 
  echo:                        # コンテナ名
    image: example/echo:latest # Dockerイメージ
    ports:                     # ポートフォワーディング(ホスト/コンテナ)
      - 9000:8080

Docker-Composeの基本的なコマンドは以下のとおり。

■ イメージのビルド

docker-compose build

■ コンテナ群の起動(—buildは必ずビルド実施)

docker-compose up -d
docker-compose up -d --build

■ コンテナ群の停止(—rmiはイメージも併せて削除)

docker-compose down
docker-compose down --rmi all

■ プロセスの確認

docker-compose ps

永続化データの取扱い

Dockerコンテナ実行中に書き込まれたファイルは、ホスト側にマウントしない限り、コンテナ破棄のタイミングで消去されるため、ステートフルな運用を実現するためにData Volumeを利用。

Dockerコンテナ内のディレクトリをディスクに永続化(ホスト・コンテナ間で共有)するための仕組み。

# docker container run [options] -v ホスト側のpath:コンテナ側のpath リポジトリ名:タグ名 コマンド 引数
docker container run -v ${PWD}:/workspace ghyodocker/imagemagick:latest convert -size 100*100 xc:#000000 /workspace/gihyo.jpg

チュートリアル(Rails)

カレントディレクトリ配下のrorディレクトリにDockerfile作成。

FROM ruby:2.4.0
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp

Gemfileを作成 (併せて空ファイルのGemfile.lockも作成)

source 'https://rubygems.org'
gem 'rails', '5.0.0.1'

docker-compose.ymlを以下のように定義。

# 参考文献(https://discuss.circleci.com/t/postgres-just-stopped-working/34511/4)
version: '3'
services:
  db:
    image: postgres
    environment:
      POSTGRES_PASSWORD: password
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db

事前にFile Sharingでカレントディレクトリを追加する。

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

Gemfileを一部修正。

# 修正前)
gem 'pg', '~> 0.18'
# 修正後)
gem 'pg', '~> 0.20.0'

修正分を含めるために再度ビルドを実行。

docker-compose build

データベース設定(config/database.yml)の追加。

# 修正前)
default: &default
  adapter: postgresql
  encoding: unicode
  # For details on connection pooling, see rails configuration guide
  # http://guides.rubyonrails.org/configuring.html#database-pooling
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

# 修正後)
default: &default
  adapter: postgresql
  encoding: unicode
  host: db
  username: postgres
  password: password
  # For details on connection pooling, see rails configuration guide
  # http://guides.rubyonrails.org/configuring.html#database-pooling
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

動作検証。

# 起動
docker-compose up -d

# データベース作成.
docker-compose run web rake db:create

# アクセス.
http://localhost:3000/

# コンテナ群の停止.
docker-compose down


©Copyright2020 TaNA LABO. All Rights Reserved.