RailsにDockerを導入
- Dockerのインストールと起動
- imageの作成(imageの作成は割愛)
- docker-compose.ymlの作成
-
docker-compose up
でスタート -
docker-compose stop
でストップ
docker-compose.ymlの構成
docker-compose.yml
version: '2.0'
services:
db:
image: postgres:9.6.7-alpine
volumes:
- ./docker/pg:/var/lib/postgresql
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: test_db
ports:
- '5433:5432'
web:
image: <docker_image>:latest
ports:
- "3000:3000"
volumes:
- .:/my_app
- bundle:/my_app/vendor/bundle
working_dir: /my_app
command: bundle exec rails s -p 3000 -b '0.0.0.0'
links:
- db
volumes:
bundle:
基本的な考え方
- dbとwebは、それぞれデータベースとrailsで、2つのコンテナを作成したことになる。
- dbの情報はdocker-compose.yml内で指定し、これをconfig/database.ymlに書くことで、railsからdockerコンテナのdbに接続できるようにしている。
- webからdbに依存するために、
links -db
というのをつけている。 - volumesとは、Dockerが作成したコンテナ上のデータを実際に自分のマシン上に保存するように、対応を書いてデータを保存しておくことができる。
./docker/pg:/var/lib/postgresql
これは、左側は、実際にマシン上でrailsのrepoのdocker/pg以下にdocker内で立てたpostgresのDBのデータが保存される場所を対応させ、データを保存している。 -
ports
は、コンテナ内のポートを自分のマシン(外部)にオープンする。今回の例では、3ブラウザからlocalhost:3000を叩いて、開けれるようにするために、コンテナの3000と自分のマシン上の3000を対応付ける必要がある。
陥りやすいポイント
-
dbなどで、Dockerを使う前にlocalhostとして使っていたhostは、dockerのcontainerの名前と同じようにしないといけない。containerの名前を
db
とした場合beforedevelopment: adapter: postgresql encoding: unicode pool: 25 database: test_db username: postgres password: postgres host: localhost template: template0
afterdevelopment: adapter: postgresql encoding: unicode pool: 25 database: test_db username: postgres password: postgres host: db template: template0
docker-compose down
するとすべてデータも消えてしまうので、downはしない。(down: Stops containers and removes containers, networks, volumes, and images created by up. https://docs.docker.com/compose/reference/down/)
dockerを再起動しても、downしてないものはちゃんと残っているので、stopとupを使っておけば、Volume内に保存されたデータも残る。