質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.53%

  • Ruby on Rails

    7230questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

  • Docker

    700questions

    Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

なぜデーターベースに保存できるの?docker

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 540

PartyKids

score 57

「イラスト図解式 この一冊で全部わかるサーバーの基本」を理解出来る所だけ読んだレベルの者です。
読んだだけで、だから必要なのか!といった理解はありません。

前回の質問で、dockerを使うにあたって、ホストとゲストの関係を意識しろとのご指摘を頂きましたので、それに従って下記のコマンドを打ったら、すんなりとデーターベースにマイケルを登録する事ができました。
しかし、よくよく考えて見ると、自分が起動したのはdocker内のアプリケーション&webサーバーであり、データーベースサーバーではありません。
なんでマイケルは、登録されたの?っと疑問に思い質問させて頂きました。

疑問点

なぜ下記のコマンドでデーターベースに保存できるのですか?
データーベースのコンテナを起動させる必要性があるのでは?

workspace$ docker-compose run --rm web rails console
Loading development environment (Rails 5.0.0.1)
irb(main):002:0> User.new
=> #<User id: nil, name: nil, email: nil, created_at: nil, updated_at: nil, password_digest: nil>
irb(main):003:0> User.create(name: "Michael Hartl", email: "mhartl@example.com",password: "foobar", password_confirmation: "foobar")
   (0.6ms)  BEGIN
  User Exists (1.0ms)  SELECT  1 AS one FROM "users" WHERE LOWER("users"."email") = LOWER($1) LIMIT $2  [["email", "mhartl@example.com"], ["LIMIT", 1]]
  SQL (0.8ms)  INSERT INTO "users" ("name", "email", "created_at", "updated_at", "password_digest") VALUES ($1, $2, $3, $4, $5) RETURNING "id"  [["name", "Michael Hartl"], ["email", "mhartl@example.com"], ["created_at", 2017-04-04 14:22:37 UTC], ["updated_at", 2017-04-04 14:22:37 UTC], ["password_digest", "$2a$10$sbk6FvQggm2GC8s/GStglOwf55soHk3jKxtW2HkEeXfAFbO6JoU7e"]]
   (11.4ms)  COMMIT
=> #<User id: 1, name: "Michael Hartl", email: "mhartl@example.com", created_at: "2017-04-04 14:22:37", updated_at: "2017-04-04 14:22:37", password_digest: "$2a$10$sbk6FvQggm2GC8s/GStglOwf55soHk3jKxtW2HkEeXf...">
irb(main):004:0> exit

前提

mac os:sierra
IDE : Rubymine(お試し)

**Dockerfile**
FROM ruby:2.3.3
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
ADD . /myapp

**Gemfile**
source 'https://rubygems.org'
gem 'rails', '5.0.0.1'

**docker-compose.yml**
version: '2'
services:
  db:
    image: postgres
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db

**config/database.yml**
development: &default
  adapter: postgresql
  encoding: unicode
  database: myapp_development
  pool: 5
  username: postgres
  password:
  host: db

test:
  <<: *default
  database: myapp_test

workspace $ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
337461c6d6fb        workspace_web       "rails console"          2 hours ago         Up About an hour                        workspace_web_run_9
cf9a7bfa1c63        postgres            "docker-entrypoint..."   2 days ago          Up About an hour          5432/tcp            workspace_db_1

考えた事等

run web で起動はアプリ&webサーバーであるが、その前がdocker-compose run なので、docker-compose.ymlが起動して自動的にpostgresに接続された。なので、docker-composeでアプリ&webサーバーを立ち上げれば、三層全てが立ち上がる?ですか?

よろしくお願いいたします!

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

docker-compose はそもそも複数コンテナを管理するためのツールです。

  db:
    image: postgres
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db

上記設定の中に db がありますが。これがデータベース用のコンテナです。 なのでdocker-compose runを実行すると、データベース用のコンテナが立ち上がります。

  db:
    image: postgres

その下に depends_on という記述があります。これはコンテナの起動順を制御するもので 「web コンテナよりも先に db コンテナを立ち上げる」 という意味です。

    depends_on:
      - db

参考: http://docs.docker.jp/compose/startup-order.html#compose

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/04/05 21:14

    返信遅くなって、すみません。
    回答ありがとうございます!!
    とんでもない勘違いをしていたみたいです。。。

    データーベースに何も登録していなかったので、
    docker run --name "***" webコンテナID テスト処理
    を実行した所、test successが出たので、compose使う必要あるの?っと思い質問させて頂きました。

    先程、同じテストを実行してみた所
    could not translate host name "db" to address: Name or service not known (PG::ConnectionBad)
    っというエラーが出たので、先日の質問からデーターベースに接続する必要がある事が分かりました。(なぜテストが成功したのかわかりませんが。。。。)
    run webとwebコンテナを起動するが、DBに接続する必要があるため、docker-composeっと打ってdocker-compose.ymlの設定を読み込んでいるんですね?

    日本語ドキュメントがあるなんて知らなかったです。頭を掻きむしりながら、難しい英語をずっと読んでました笑

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.53%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Ruby on Rails

    7230questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

  • Docker

    700questions

    Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです