閲覧ありがとうございます!
『コンテナは、イメージから作成されたものであり、作業履歴を保存するもの』っと書かれていたので、作業履歴すべて(手で打ったコード等)を保存するものだと思っていました。
しかし実際、コンテナはコンテナを動かしたコマンド(作業履歴)を保存するものであると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 controller
やdestroy controller
をするには、まずrails new
でアプリケーションを作成する必要があると思いますが、rails new
コンテナは別にあります。
仮に、generateやdestroyをしたい場合には、rails new
コンテナ(コマンド)を継承しなければ出来ないと思うのですが、『各コンテナは、個々が独立しており、かつ、他のコンテナのコマンドを有していない』と考えているため、rails new
無しでgenerate & destroy
が出来てしまうというおかしな考えになってしまいました。
私の考えがおかしいのは、間違いないのですが、どこが間違っているのかを調べても見つからないため、困っています。
疑問2:localhost:3000で制作仮定がブラウザで見れる理由
rails tutorialを勉強している間、何も考えずにdocker-compose up
とlocalhost:3000
をして、勉強過程をブラウザ確認していました。
勉強過程がブラウザで確認できたのは、volumeでホスト側のファイルをゲスト側にマウントしているからであり、実際に自分が打ったコードはコンテナ(ゲスト側)が有しているわけではない。っという事ですか?
説明が下手な、長い質問文になってしまいましたが、よろしくお願いいたします!
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
+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が行い、複数のコンテナが連動して稼働するようになるという感じですね。
貢献できていれば幸いに存じます!
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
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へ正常にアクセスしているものだと思います。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.32%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
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
またどこかでお会いしたらこちらこそお願いしますね〜