Skip to content

Instantly share code, notes, and snippets.

@waday
Last active January 7, 2017 08:45
Show Gist options
  • Save waday/3624e337f36a1d7a6b0e16ce15130543 to your computer and use it in GitHub Desktop.
Save waday/3624e337f36a1d7a6b0e16ce15130543 to your computer and use it in GitHub Desktop.
DockerComposeでRails3環境構築
default: &default
adapter: postgresql
encoding: unicode
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: <%= ENV.fetch('DATABASE_USER') { 'root' } %>
password: <%= ENV.fetch('DATABASE_PASSWORD') { 'password' } %>
host: <%= ENV.fetch('DATABASE_HOST') { 'localhost' } %>
port: <%= ENV.fetch('DATABASE_PORT') { 5432 } %>
development:
<<: *default
database: app_development
test:
<<: *default
database: app_test
production:
<<: *default
database: app_production

セットアップ

  1. run playbook-docker.yml using Ansible.
  2. connect to docker host.
  3. mkdir <repository_name>; cd <repository_name>
  4. create Dockerfile.development and docker-compose.yml
  5. mkdir app
  6. create Gemfile and Gemfile.lock in app directory.
  7. docker-compose run --rm rails rails new . --force --database=postgresql --skip-bundle --skip-test --api
  8. edit config/database.yml
  9. docker-compose build
  10. docker-compose run rails bundle exec rake db:create db:migrate db:seed
  11. docker-compose up

DBクラスタ物理バックアップ

docker run --rm --volumes-from コンテナ名(ex. rails3pgsql_data_1) -v $(pwd):/backup イメージ名(ex. postgres:9.5) tar cvf /backup/backup.tar /var/lib/postgresql/data

DBクラスタ物理リストア(一時的なDBコンテナを立ち上げ既存のコンテナに戻す)

docker run --rm --volumes-from rails3pgsql_data_1 -v $(pwd):/backup postgres:9.5 tar xvf /backup/backup.tar

便利コマンド集

  • docker-compose.ymlに「build:」があれば、そのイメージをまとめてビルド docker-compose build
  • dcoker-compose.ymlに「image:」があれば、そのイメージをまとめてプル docker-compose pull
  • もしサービス用のコンテナが存在している場合、かつ、コンテナを作成後にサービスの設定やイメージを変更している場合は、 docker-compose up -d を実行すると、 設定を反映するためにコンテナを停止・再作成します(マウントしているボリュームは、そのまま保持します)。 docker-compose up -d
  • docker-compose build, docker-compose pullをした後にdocker runをバックグラウンド起動 docker-compose up -d <サービス名(指定しなければdocker-compose.ymlで定義した全てのサービスが起動する)>
  • docker-copose.ymlで定義されたサービスコンテナを停止 docker-compose stop
  • docker-copose.ymlで定義されたサービスコンテナを起動 docker-compose start
  • docker-compose.ymlで定義されたサービスコンテナを削除 docker-compose rm
  • dockerコンテナを全て削除 docker rm $(docker ps -aq) docker rm $(docker ps -f status=exited -q)
  • コンテナに接続 docker exec -it rails3pgsql_rails_1 bash

参考

データボリュームコンテナ

version: '2'
services:
rails:
build:
context: .
dockerfile: "Dockerfile.development"
command: "bundle exec rails s -p 3000 -b '0.0.0.0'"
environment:
- "DATABASE_HOST=db"
- "DATABASE_PORT=5432"
- "DATABASE_USER=postgres"
- "DATABASE_PASSWORD=mysecretpassword1234"
# 本番環境ではここを消す
volumes:
- "./app:/app"
ports:
- "3000:3000"
links:
- db
tty: true
stdin_open: true
db:
image: "postgres:9.5"
environment:
- "POSTGRES_USER=postgres"
- "POSTGRES_PASSWORD=mysecretpassword1234"
volumes_from:
- data
data:
image: "busybox"
volumes:
- "/var/lib/postgresql/data"
FROM ruby:1.9.3
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev postgresql-client
RUN mkdir /app
WORKDIR /app
ADD ./app/Gemfile /app/Gemfile
ADD ./app/Gemfile.lock /app/Gemfile.lock
RUN bundle install -j4
ADD ./app /app
---
- name: setup-docker-compose
hosts: all
become: yes
become_user: root
gather_facts: False
tasks:
- name: install epel-release
yum: name=epel-release state=present
- name: install libselinux-python
yum: name=libselinux-python state=present
- name: disable selinux
selinux: state=disabled
- name: disable and stop firewalld service
service: name=firewalld enabled=no state=stopped
- name: install rpm packages for docker
yum: name={{ item }} state=present
with_items:
- docker-io
- python-pip
- name: enable and start dockerservice
service: name=docker enabled=yes state=started
- name: install and upgrade pip modules
pip: name={{ item }} state=latest
with_items:
- pip
- backports.ssl_match_hostname
- name: install docker-compose
pip: name={{ item }}
with_items:
- docker-compose
Vagrant.configure(2) do |config|
config.vm.box = "centos7_gaddition"
config.vm.network "forwarded_port", guest: 3000, host: 10080
config.vm.network "private_network", ip: "192.168.33.11"
config.vm.provider "virtualbox" do |vm|
vm.customize ["modifyvm", :id, "--memory", "1500"]
end
config.vm.provision "ansible" do |ansible|
ansible.playbook = "playbook_docker.yml"
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment