2015年11月9日月曜日

CentOS7 で docker-compose を試してみた

概要

docker-compose は複数のコンテナで構成されるアプリを管理するためのツールです
fig と言われていたツールがそのまま docker-compose になりました
今回は docker-compose の QuickStart を試してみたので紹介します

環境

  • CentOS7 64bit
  • docker-engine 1.8.3
  • docker-compose 1.4.2

docker-compose のインストール

  • VERSION_NUM=1.4.2
  • curl -L https://github.com/docker/compose/releases/download/VERSION_NUM/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
  • chmod +x /usr/local/bin/docker-compose
  • docker-compose version

でインストールします
インストールが完了したらバージョンが表示されることを確認してください

各種ビルド用のファイルの作成

アプリを構成するファイルを作成していきます

DockerFile の作成

  • mkdir ~/mydocker
  • cd ~/mydocker
  • touch DockerFile
FROM ruby:2.2.0
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev
RUN mkdir /myapp
WORKDIR /myapp
ADD Gemfile /myapp/Gemfile
RUN bundle install
ADD . /myapp

イメージは DokcerHub にある ruby というイメージの tag 2.2.0 を使います
他の最新版のバージョンもあるのでそれでもいいかもしれません

Gemfile の作成

  • cd ~/mydocker
  • touch Gemfile
source 'https://rubygems.org'
gem 'rails', '4.2.0'

単純に rails をインストールするだけの Gemfile です
DockerFile 内の ADD というコマンドで作成した Gemfile をコンテナ上に渡します

docker-compose.yml の作成

  • cd ~/mydocker
  • touch docker-compose.yml
db:
  image: postgres
web:
  build: .
  command: bundle exec rails s -p 3000 -b '0.0.0.0'
  volumes:
    - .:/myapp
  ports:
    - "3000:3000"
  links:
    - db

docker-compose.yml にアプリを構成するコンテナの定義を記載します
DB には postgres を指定します
ファイル内では環境変数の参照も行えるようです
その他の詳細はこちらのページを参照してください

web コンテナ上で動作する rails のサンプルアプリを作成する

  • cd ~/mydocker
  • docker-compose run web rails new . --force --database=postgresql --skip-bundle

run コマンドのあとに docker-compose.yml に記載したコンテナを指定します ( -> web )
そのあとでコンテナ上で実行するコマンドを記載します ( -> rails new . --force --database=postgresql --skip-bundle )
コンテナ上で実行されたコマンドの結果はローカルに保存されるのでこのアプリを使ってコンテナ上で動作させます

Gemfile の編集

サンプルアプリを作成した際に生成される Gemfile を編集します
今回はブラウザ上で動作するアプリを実行するための以下の行をコメントアウトします

gem 'therubyracer', platforms: :ruby

コメントアウトしたら保存しましょう

config/database.yml の編集

  • cd ~/mydocker
  • vim config/database.yml
development: &default
  adapter: postgresql
  encoding: unicode
  database: postgres
  pool: 5
  username: postgres
  password:
  host: db

test:
  <<: *default
  database: myapp_test

上記の設定になるようにローカルの config/database.yml を編集してください
デフォルトで作成される config/database.yml にはいろいろと記載されているので全部消してもいいですし、必要な部分だけ編集しても OK です

ビルドの実行

docker-compose 上で動作するイメージをビルドします

  • cd ~/mydocker
  • docker-compose build

初回ビルド時はいろいろとダウンロードする必要があるので時間がかかります
ビルドが完了したら docker images で新しいイメージが作成されていることを確認しましょう
今回の手順で実施すると mydocker_web というイメージが作成されていると思います

REPOSITORY                  TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
mydocker_web                latest              35147b5838ce        18 seconds ago      914.2 MB

コンテナ上でのアプリの起動

イメージが作成できたらアプリを起動してみましょう

  • cd ~/mydocker
  • docker-compose up

起動したらプロセスを確認してみます

  • docker-compose ps
     Name                   Command               State           Ports
--------------------------------------------------------------------------------
mydocker_db_1    /docker-entrypoint.sh postgres   Up      5432/tcp
mydocker_web_1   bundle exec rails s -p 300 ...   Up      0.0.0.0:3000->3000/tcp

State が Up になっていれば OK です

動作確認

この状態でブラウザで 3000 番にアクセスすると Rails のサンプル画面が表示されると思います

http://hostname:3000/

コンテナを停止させたい場合は

  • docker-compose stop

で OK です

紹介は以上です
次回は docker-compose の特徴的な機能の 1 つである scale を検証できればと思います

Tips

データベースが作成されているか確認してみる

  • docker exec -it mydocker_db_1 bash
  • su - postgres
  • psql -l
  • psql postgres

docker exec は作成したコンテナにログインすることができる便利なコマンドです
デバッグで重宝します
データベースがない場合はdocker-compose run web rake db:create で作成可能です

イメージが削除できない

Error response from daemon: Conflict, cannot delete 3e2dbcd4b881 because the running container 379975ee952b is using it, stop it and use -f to force

docker-compose で作成したイメージを削除しようとして発生しました
まだイメージを使ったコンテナが動作しているためイメージを削除できないというエラーのようです
docker ps -a で全コンテナを表示して該当するコンテナを削除しましょう
全コンテナを削除して問題ない場合は

  • docker rm $(docker ps -aq)

で全コンテナを削除してから、再度 docker rmi してみましょう

0 件のコメント:

コメントを投稿