ども、かっぱです。

tl;dr

Docker Compose って複数のコンテナで構成されるアプリケーションを管理するのにイイよ!って人に薦めておきながら、ずっと触れてなかったのでドキュメントの Quickstart を見ながら手を動かしてみた

参考

Getting started with Docker Compose and Rails

docs.docker.com

上記の例は Rails + PostgreSQL の組み合わせだけど、それだと面白くないので、上記の docker-compose.yml や Dockerfile を参考に Nginx + Rails + MySQL な構成にして Rails の一人学習環境の構築を目的として進める。ゴールは環境の構築ではなく、構築した環境で Rails アプリケーションを構築してみること。(本記事でゴールまでたどり着けるか解らないけど。)

メモ

以下のような感じで

20160225001810

各種ファイル

  • docker-compose.yml
db:
  image: mysql:5.6
  environment:
    MYSQL_ROOT_PASSWORD: your_password
    MYSQL_DATABASE: myapp_test
  ports:
    - "3306:3306"

web:
  build: .
  command: sh run.sh
  volumes:
    - /tmp/nginx/:/var/log/nginx
    - .:/myapp
  ports:
    - "80:80"
    - "3000:3000"
  links:
    - db
  • Dockerfile
FROM ruby:2.3.0
RUN apt-get update -qq && 
    apt-get install -y build-essential libpq-dev && 
    apt-get install -y nginx && 
    mkdir /myapp
WORKDIR /myapp
ADD Gemfile /myapp/Gemfile
ADD Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
ADD app.conf /etc/nginx/sites-available/app.conf
RUN ln -s /etc/nginx/sites-available/app.conf /etc/nginx/sites-enabled/app.conf && 
    rm -f /etc/nginx/sites-available/default
ADD . /myapp
RUN chmod 755 /myapp/run.sh
  • run.sh(Nginx と Rails を起動するスクリプト)
#
# Rails 起動
#
bundle exec rails server -p 3000 -b '0.0.0.0' -d
#
# Nginx 起動
#
/usr/sbin/nginx -g 'daemon off;' -c /etc/nginx/nginx.conf
  • Gemfile
source 'https://rubygems.org'

gem 'rails', '4.2.0'
  • nginx 設定
upstream app01 {
  server 127.0.0.1:3000;
}

server {
  listen 80;
  server_name localhost;

  location /rails {
    root /usr/share/nginx/html;
    proxy_pass http://app01;
    proxy_set_header Host $host;
  }
}

手順

  • Rails アプリケーションを作成(アプリケーションのひな型みたいなものを作成する)
#
# rails new する
#
$ docker-compose run web rails new . --force --database=mysql --skip-bundle

#
# 作成されたアプリケーションの権限を変更する
#
$ sudo chown -R $USER:$USER .
  • Gemfile の修正
source 'https://rubygems.org'

gem 'rails', '4.2.0'

# Rails 4.2.0 だと以下のようにバージョンを固定する必要があった
gem 'mysql2', '~> 0.3.20'

# コメントアウトを外す
gem 'therubyracer', platforms: :ruby
  • Docker イメージのビルド
$ docker-compose build
  • config/database.yml を以下のように作成
development: &default
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: root
  password: your_password
  host: db

test:
  <<: *default
  database: myapp_test
  • コンテナを起動
$ docker-compose up

確認

  • docker-compose ps
$ docker-compose ps
      Name                Command          State                     Ports
---------------------------------------------------------------------------------------------
railsmysql_db_1    /entrypoint.sh mysqld   Up      0.0.0.0:3306->3306/tcp
railsmysql_web_1   sh run.sh               Up      0.0.0.0:3000->3000/tcp, 0.0.0.0:80->80/tcp
  • docker ps
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                        NAMES
xxxxxxxxxxx1        railsmysql_web      "sh run.sh"              14 hours ago        Up 14 hours         0.0.0.0:80->80/tcp, 0.0.0.0:3000->3000/tcp   railsmysql_web_1
xxxxxxxxxxx2        mysql:5.6           "/entrypoint.sh mysql"   14 hours ago        Up 14 hours         0.0.0.0:3306->3306/tcp                       railsmysql_db_1
  • 画面で確認

ひとまずは以下のページが表示されることを確認。

20160225001027

よし、よし。

ひとまず

Docker Compose を使って目的の環境を構築することが出来たはず。若干、Rails を動かす為の Gem 導入で躓きそうになるけど、それ以外は特難しいことは無いと思われる。

以上。

元記事はこちら

Docker Compose チュートリアル(2)~ Nginx + Rails + MySQL 環境を作った雑なメモ ~