🐳

【Docker】コンテナ(仮想環境)について

に公開

はじめに

プログラミング初学者です。個人的理解を述べていますので、おかしい部分があると思います。
間違いなどございましたらご指摘いただけると幸いです。

対象読者

  • RUNTEQ生の方
  • RUNTEQのrails入門に取り組まれる方
  • dockerを使って環境構築されている方

前提

今回は、dockerの具体的な内容ではなくdockerで作成されるコンテナ(仮想環境)を理解する手助けになれば、という思いで記述しております。
初学者の場合、最初は専門用語などが多くてイメージがなかなか掴みにくいと考えます。
なのでここでは、簡単に説明ができればと考えています。

記事を書きたいと思った背景

コンテナの中に入らずにbin/rails g controllerbundle installなどを実行することで、うまく進めないというミスが減れば良いなと思ったからです。

伝えたい結論

ターミナルでコマンドを入力して実行する時、bin/rails g controllerbundle installbundle exec rspecなどがあると思います。
これらのコマンドはコンテナ内に入ってから実行することを意識しましょう!

# コンテナに入る
$ docker compose exec web bash

なぜ??

コンテナ(仮想環境)に環境を構築して、開発をしているからです!!

仮想環境って??

個人的にまず、仮想環境についての理解が進めば良いのではないかと考えました。
なので、漫画 ワンピースを例に説明していきたいと思います。

物語はウォーターセブン編。ウォーターセブンという島は造船の技術が活発です。
そこでのあるワンシーンですね。 ある船大工がルフィ達に伝えます

船大工 「この世に全く同じ船は二つと存在しない」

ナミ 「どうゆうこと??」

船大工 「この世に全く同じ成長をする木が存在するか? 船はほぼ木材でできている。
     船の大きさや曲線も全て木の形に左右される。同じ設計図でも全く同じ船は作れない。」

以上のようなワンシーンがありました
そう、現実では全く同じ船は作れないのです!!

解決するのが、コンテナのような仮想環境

さて、上記の全く同じ船を作る方法が実は一つだけあります。
それは仮想環境であれば作ることができるということです。
夢の中とでも言いましょうか。要は空想上の世界であればできますよね。
頭の中で同じ木材を出せばいいのですから。

まずDockerを使ってこの仮想環境を作成していると意識してもらえたらないいなと思います。

なぜ仮想環境が必要なのか

結論から述べると、みんなが同じ開発環境を構築するためです。
上記のワンピースの物語は少し極端かも知れません。
では、造船技術を提供する環境に焦点を当てるとどうでしょうか。

ウォーターセブンという造船技術が活発な環境だからこそ、様々な船を作る材料や機械、道具などが揃っていて、より良い船が作れるのだと思います。
このウォーターセブンと同じ環境をルフィ達やその他の島で用意するのは困難になると思います。

プログラミングでの開発でも同様に、同じ環境を簡単にみんなが用意することは困難です。
パソコンの種類でもmacの人もいれば、windowsの人もいるのでパソコンを同じにすることは難しいですよね。
ですが、仮想環境ならみんな同じ環境で開発ができる。というわけです。

Dockerの仮想環境の形はコンテナ型です。

Dockerではこの仮想環境をコンテナのような箱をイメージして提供しています。
コンテナという箱の中に、環境構築をした仮想の環境が存在しているわけですね!!

コンテナ(仮想環境)の中に入ろう!!

コンテナ内には、構築した道具や機械などが揃っているイメージで最初はいいと思います!
代表的には、railsruby gemなどでしょうか。

bin/rails g controller

このコマンドは、現在のRailsアプリケーションの環境(Rubyのバージョン、Railsのバージョンなど)に基づいて実行され、コントローラーが作成されます。
このコマンドをホストマシン(コンテナ外)で実行すると、下記エラーなどが出ます

% bin/rails g controller task
Could not find rails-7.0.3.1, mysql2-0.5.4, puma-5.6.4, actioncable-7.0.3.1, nio4r-2.5.8 in any of the sources

Could not find rails-7.0.3.1,、railsが見つからないよって言われています。
試しにrails -vでrailsのバージョンを確認してみましょう。railsが用意されてたらバージョンが見れるはずです! しかし、同様のエラーが出ます。

$ rails -v
Could not find rails-7.0.3.1

それもそのはずですよね。railsを用意したのはコンテナの中(仮想環境)なのですから。
docker compose exec web bashでコンテナに入ってから、rails -vコマンドを入力してみましょう

# rails -v
Rails 7.0.4

このようにrailsが用意されているのでrailsのバージョンを把握することができます!!

まとめ

上記での例以外にも、bin/rails db:migrateやgemをインストールする際のbundle installなどのコマンドを使う機会が沢山あると思います!
その際に、railsやrubyなどがないよーというようなエラーが出たら、実行したコマンドはコンテナ内なのか、コンテナ外なのかを一度考えてみてほしいと思います!!

最後に

コンテナ内か、コンテナ外かが直ぐにわかる方法があります。

コンテナ外
$ rails -v
コンテナ内
# rails -v

プロンプトが変わります!

参考文献
https://qiita.com/etaroid/items/b1024c7d200a75b992fc

Discussion