uncode Official Blog
2019年6月21日
Web
こんにちは。hirohiroです。
Dockerをインストールし、Rails + PostgreSQLの開発環境を構築しましたので、記事にまとめてみました。
公式サイトより、Docker for Macをダウンロードします。
https://docs.docker.com/docker-for-mac/install/
Dockerを起動すると、以下の画面が出てくるのでNextを選択。
続いて、OK として次画面にて端末のパスワードを入力する。
上から画面が出てくるので、DockerのIDとパスワードを入力します。
上部のメニューバーのDockerアイコンを押すと下のようなメニューが表示されます。
正しくインストールされているか確認
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | $ docker version Client: Docker Engine - Community Version: 18.09.2 API version: 1.39 Go version: go1.10.8 Git commit: 6247962 Built: Sun Feb 10 04:12:39 2019 OS/Arch: darwin/amd64 Experimental: false Server: Docker Engine - Community Engine: Version: 18.09.2 API version: 1.39 (minimum version 1.12) Go version: go1.10.6 Git commit: 6247962 Built: Sun Feb 10 04:13:06 2019 OS/Arch: linux/amd64 Experimental: false |
これでDockerを正しくインストールすることができました。
Railsアプリの環境を構築するためには複数のコンテナが必要となります。
Docker-compose は、複数のコンテナから成るサービスを構築・実行する手順を自動的にし、管理を容易にする機能です。
composeファイルを用意してコマンドを1 回実行することで、そのファイルから設定を読み込んですべてのコンテナサービスを起動することができます。
プロジェクト用のディレクトリを作成し、そこに次の4つのファイルを作成する。
1 2 | $ mkdir myapp $ cd myapp |
◆dockerfile
1 2 3 4 5 6 7 8 9 10 11 12 | FROM ruby:2.6.3 ENV LANG C.UTF-8 RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs RUN mkdir /myapp WORKDIR /myapp ADD Gemfile /myapp/Gemfile ADD Gemfile.lock /myapp/Gemfile.lock RUN bundle install COPY . /myapp EXPOSE 3000 |
◆Gemfile
1 2 | source "https://rubygems.org" gem 'rails', '5.2.2' |
◆Gemfile.lock
1 | ※空のファイル |
◆docker-compose.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | version: '3' services: db: image: postgres volumes: - ./tmp/db:/var/lib/postgresql/data ports: - "5433:5432" web: build: . command: bundle exec rails s -p 3000 -b '0.0.0.0' volumes: - .:/myapp ports: - "3000:3000" depends_on: - db |
先ほどの4つのファイルを読み込んで、Dockerコンテナ上にRailsアプリケーションが作成されます。
1 | $ docker-compose run web rails new . --force --database=postgresql |
1 | $ docker-compose build |
◆config/database.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | default: &default adapter: postgresql encoding: unicode host: db username: postgres password: pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> development: <<: *default database: myapp_development test: <<: *default database: myapp_test |
DBを作成します。
1 | $ docker-compose run web rails db:create |
Dockerコンテナが立ち上がり、Railsサーバーも起動します。
1 | $ docker-compose up |
localhost:3000にアクセスしてブラウザで確認します。
次のコマンドで起動しているDockerのコンテナをチェックします。
1 2 3 4 | $ docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a2420008fdb0 myapp_web "bundle exec rails s…" 55 seconds ago Up 54 seconds 0.0.0.0:3000->3000/tcp myapp_web_1 d76b74d2c2df postgres "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:5432->5432/tcp myapp_db_1 |
ちなみに、起動していないコンテナも表示するにはオプション指定 -a とします。
1 2 3 4 5 | $ docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a2420008fdb0 myapp_web "bundle exec rails s…" 2 minutes ago Up 2 minutes 0.0.0.0:3000->3000/tcp myapp_web_1 b3b036bf92da myapp_web "rails db:create" 3 minutes ago Exited (0) 2 minutes ago myapp_web_run_97bb8be64543 d76b74d2c2df postgres "docker-entrypoint.s…" 3 minutes ago Up 3 minutes 0.0.0.0:5432->5432/tcp myapp_db_1 |
ショートカットの「Control + C」でコンテナが停止します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | # foregroundで起動 $ docker-compose up # backgroundで起動 $ docker-compose up -d # 停止(foregroundで起動していた場合) Ctr + C # 停止(backgroundで起動していた場合) $ docker-compose stop # 再ビルド $ docker-compose build # DBを作成 $ docker-compose run web rails db:create # マイグレーション $ docker-compose run --rm web rails db:migrate # コントローラー作成 $ docker-compose run --rm web rails controller <コントローラー名> # モデルを作成 $ docker-compose run --rm web rails g model <モデル名> <カラム名:型> # PostgreSQLへの接続 $ docker exec -it myapp_db_1 psql -U postgres -d myapp_development # データのインポート # dockerコンテナにアーカイブファイルを転送する docker cp /Users/hirohiro/Downloads/latest0522.dump miraicle_db_1:/tmp # PostgreSQLのコンテナ(db_1)にbashで入る docker exec -it miraicle_db_1 bash # コンテナ内でpg_restore実行 pg_restore --verbose --clean --no-acl --no-owner -U postgres -d miraicle_development tmp/latest0522.dump |