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

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

ただいまの
回答率

90.36%

  • Ruby on Rails

    9553questions

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

  • Docker

    1200questions

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

dockerのコンテナの中身について

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,168

PartyKids

score 63

閲覧ありがとうございます!

『コンテナは、イメージから作成されたものであり、作業履歴を保存するもの』っと書かれていたので、作業履歴すべて(手で打ったコード等)を保存するものだと思っていました。
しかし実際、コンテナはコンテナを動かしたコマンド(作業履歴)を保存するものであるとdocker ps -aで分かったのですが、以下の疑問が出ました。

環境

docker for Mac
docker version: 17.03.1-ce
Users/****/workspace下で、Quickstart: Compose and Railsリンク内容を構築

###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

###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

疑問1:コンテナの中身の違い

$ docker-compose run web rails g contoller StaticPages home
$ docker inspect [generate contoller container ID]
"Cmd": [
                "rails",
                "destroy",
                "controller",
                "StaticPages",
                "home"
            ]

$ docker-compose run web rails g destroy StaticPages home 
$ docker inspect [destroy controller container ID]
"Cmd": [
                "rails",
                "destroy",
                "controller",
                "StaticPages",
                "home"
            ]

上記のコマンドより、各コンテナは、個々が独立しており、かつ、他のコンテナのコマンドを有していないと考えたのですが(destroyコンテナはgenerate controllerコマンドを有してない)
なぜdocker-compose run web **** で動くのですか?
generate controllerdestroy controllerをするには、まずrails newでアプリケーションを作成する必要があると思いますが、rails newコンテナは別にあります。
仮に、generateやdestroyをしたい場合には、rails newコンテナ(コマンド)を継承しなければ出来ないと思うのですが、『各コンテナは、個々が独立しており、かつ、他のコンテナのコマンドを有していない』と考えているため、rails new無しでgenerate & destroyが出来てしまうというおかしな考えになってしまいました。
私の考えがおかしいのは、間違いないのですが、どこが間違っているのかを調べても見つからないため、困っています。

疑問2:localhost:3000で制作仮定がブラウザで見れる理由

rails tutorialを勉強している間、何も考えずにdocker-compose uplocalhost:3000をして、勉強過程をブラウザ確認していました。
勉強過程がブラウザで確認できたのは、volumeでホスト側のファイルをゲスト側にマウントしているからであり、実際に自分が打ったコードはコンテナ(ゲスト側)が有しているわけではない。っという事ですか?

説明が下手な、長い質問文になってしまいましたが、よろしくお願いいたします!

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

+1

昨日私Dockerの基礎解説のようなものを他のご質問で書いたのですが、もしかしたらお役に立てるかもしれないので、リンクを貼りますね!
https://teratail.com/questions/76773

上記にはdocker-composeの解説が少ないので続きを書きますと、

dockerでは1つのコンテナしか動かせませんが、
docker-compose は、複数のコンテナを同時に動かすことができる仕組みで、その指令はdocker-compose.ymlというymlファイルに記載するのです。直観的にわかりやすい例としては


OSはUbuntuがよいので、Ubuntuコンテナを動かしつつ、
一方Ubuntu上でwebサーバーとしてnginxをつかいたいのでnxinxコンテナを動かしたいという
2つのコンテナを同時に動かし、連結したい場合

docker-compose.ymlの例(細かなセッティングは長くなりそうなので他の記事などでご確認ください)

ubuntu #ubuntuコンテナへの指示
    image:****/****(ubuntuイメージの置いているリポジトリの場所docker hub等)
   (その他のセッティングについて指示を書く)

nginx #nginxコンテナへの指示
    image:****/****(nginxイメージの置いているリポジトリの場所docker hub等)
   (その他のセッティングについて指示を書く ubuntuとリンクさせるなど)


これで、例えばdocker-compose upとかコマンドを入れればdocker-compose.ymlに書いた指示を自動でdocker-composeが行い、複数のコンテナが連動して稼働するようになるという感じですね。

貢献できていれば幸いに存じます!

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/05/21 15:28

    回答ありがとうございます!
    下手な質問文で申し訳ございませんでした。

    なぜ、docker-composeで動くのか?という質問ではなく、各コンテナはそのコンテナを動かしたコマンドしか有しないのに、なぜgenerateやdestroyコンテナを動かせるのか?という質問です。
    つまり、rails newをしてからじゃないと、コントローラーやモデルを作成することは出来ないと思いますが、コントローラー作成コンテナにはrails newコマンドを有していないのに作成出来てしまうのは、なぜですか?っという質問です。

    説明が下手で勘違いさせて、申し訳ございませんでした。
    よろしくお願いいたします!

    キャンセル

  • 2017/05/21 15:54

    ああ〜 なるほど・・・ご要望にお答えできなくてすみません・・・ 

    私python-Djangoで開発しており、rubyーRubyonRailsはやったことがないのですがちらちらネットの記事などを見ると、モデルのマイグレーションはなんか似てるかもしれないのでヒントになるかまったくわかりませんがdocker-composeでのセットアップで似たセッティングの箇所があるので書いてみます。これは全然自信ないので的外れだったらゴメンナサイ

    私のdocker-composeのセットアップでフレームワークのモデルやマイグレーションを行うのはdocker-compose.ymlそのものではなく、docker-compose.ymlのうちの自分のアプリコード+アプリケーションサーバー(railsだとUnicornなどです おそらく)のコンテナのイメージのセットアップ時に起動させるコマンドの中のDockerfileにマイグレーションのシェルスクリプトを実行するコマンドをかいておく(CMD ./server.sh のような形)ことでフレームワークも自動で動かせるという設定にしています。

    あんまり役に立たない情報かもしれません・・・すみません・・・

    キャンセル

  • 2017/05/22 20:15

    返信ありがとうございます!

    >ご要望にお答えできなくてすみません
    とんでもないです!助けて頂きありがとうございます!
    私の質問の仕方が下手くそなばかりにご迷惑をおかけして申し訳ございません!

    今後ともよろしくお願いいたします!

    キャンセル

  • 2017/05/23 00:59

    お気遣いありがとうございます!心が温かくなりました〜 
    またどこかでお会いしたらこちらこそお願いしますね〜

    キャンセル

checkベストアンサー

0

まず少しDockerfileについて少し。
DockefileはFROMで指定されているイメージに対してシェル的に変更をして新しくイメージを作り出すものです。なのでこのDockerfileをcomposeで指定している時点で/myappが同梱された状態のイメージが生成されるはずです。しかしcomposeではそこにさらにvolumeを指定しています。
なので本来同梱したはずの/myappが同期フォルダによって上書きされています。
なのでどちらかを指定すれば良いと思います。

疑問1:なぜdocker-compose run web で動くのか

まず、dokcer-compose runコマンドは、docker-composeの特定のコンテナを起動させるものです。
なのでdockerのなかにdbとwebがありますが、その中でwebコンテナが生成されて立ち上げられます。またdepends(依存関係)にdbを指定しているのでdbも立ち上げられます。
本来はdocker-compose upコマンドでdockerを実行すべきですが、今回に限ってうまく動いています。
でもなるべくdocker-compose runではなくdocker-compose upを使うべきだと思います。

さらに、docker-compose runは、runのあとにcomposeに書いた名前だけではなくさらに何かを書いた場合そのコマンドが実行されるので、myappに対して動作を行っているのだと思われます。

疑問2:localhost:3000で制作仮定がブラウザで見れる理由

docker-compose.ymlでportを指定した場合、ホストのポートとコンテナのポートをつなげることができます。つまり、今回の場合はホストの3000版に来た通信はすべてwebコンテナの3000版へ転送されることになります。なのでローカルで起動しているrailsではなくコンテナの中で実行されているrailsへ正常にアクセスしているものだと思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/05/22 22:34

    はい。myappが同期されているため、おそらく毎回コマンドごとにコンテナを立ち上げてもmyappへの反映がすべてのコンテナで動悸されてしまうのだと思います。
    なのでrails newをしなくても他のコンテナでrails newをしているため同期機能でrails gができるのだと思います。

    キャンセル

  • 2017/05/23 20:25

    返信ありがとうございます!

    >rails newをしなくても他のコンテナでrails newをしているため同期機能でrails gができるのだと思います。
    そういう事だったんですね!

    いつも助けて頂き、本当に有難うございます!
    今後ともよろしくお願いいたします。

    キャンセル

  • 2017/05/24 16:28

    解決できてよかったです!
    こちらこそよろしくお願いします!!

    キャンセル

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

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

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

  • Ruby on Rails

    9553questions

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

  • Docker

    1200questions

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