いつもの長い発端の話
仮想化ソフトウェアって便利ですね〜。
VMwareとか昔からあったので、どういう感じに使うのか何となくわかっていました。Macを使っているとWindowsしか動作しないアプリがあるのでVMware Fusionとかよく買っていました。
VMware FusionはmacOSがアプデするたびに購入しなければならないのが憂鬱でした。その後、 VirtualBoxが出てきてくれたおかげでその面倒さから開放されました。しかも無料。。。
ここまでの話は2010年くらいの話だと思います。
今でもVirtualBoxは入れていますし、Windowsが必要なとき(最近はあまり出番がありませんが)、例えば、Mac版のExcelで印刷するとズレてしまうやつを印刷するとき、とか、非常勤先でのOfficeの入門解説をするときにWindowsでのスクショが必要なので使う。。。くらいに利用しています。
その後、Dockerっていうキーワードを目にするようになりました。Wikipediaによると2013年頃からのようです。
プロセス単位で仮想化できる。。。ので、VMwareなどに比べると高速・効率的っていう話を見聞きしていました。
でも、実態はどう使うのかよくわからなかったし、必要性も感じなかったのでスルーしてきました。
で、たまたま、学生さんから、ある企業の入社選考用の課題がわからないので。。。と質問されたので環境構築してやってみたのがdockerでした。その企業が提供してくれている手順書にしたがってコマンドを入力するだけでしたが、何となく使い方がイメージできました。
Railsの授業もしているし。。。AWS Cloud9に頼っているのも不安です(残クレジットを気にする必要があり、万が一サービスが停止すると演習ができなくなるリスクもあり)ので代替手段は用意しておくべきですので。
で、やったこと
ちょうど連休で、特に用事もなかったので、自宅で少し勉強してみました。
とりあえず、ネットの「dockerとは」みたいなエントリーが山のようにあったので、ざーっと見てみました。
メリットや概略は何となくわかりましたが、やはりわからない。しっくりきません。
書籍もいくつか出版されていたので買おうかとも思いましたが、実際に中身を読んでみるとなかなか詳しすぎて。。。うーんここまで必要何だろうか?と疑問もありました。
で、とりあえず、Dockerが公開している公式チュートリアル(以下)をやってみることにしました。これが今朝のことで。
dockerコマンドを手に馴染ませる程度の練習にはなりましたが。。。概念がしっくりきたか?と言われると「?」でした。頭が固いので。。。自分で言うのもなんですが理解できるまでが本当に大変です。。。
次に、もう少し具体的に何かしてみようと思い、以下のRails開発環境を構築するエントリーを写経してみました。参考にしたのは以下の公式ページでした。
その後、自分でイメージを作らなくても、Railsくらいなら世界中の誰かさんがDocker Hubに公開しているので、それを利用した方が早いな。。。と思い、docker pullしてイメージを操作したり、コンテナを操作しているうちに、イメージとコンテナの違いも見えてきました。コンテナを開始したり停止したり、イメージを入れたり削除したり、具体的にdockerの内部の仕組みまでは理解できていませんが、VirtualBoxでイメージを作成して起動・停止で使うくらいには何をどうすればいいのか理解できました。やっぱり具体的にやらないと。。。わかった気になれません。
まだまだですが、あとは必要に応じて、使いながら必要な知識を調べていこうと思います。
大学の演習室はシンクライアント環境なのですが、これと仮想化ソフトウェアとの相性が悪いようで、Linux for Windowsもまともにインストールできない状態でした。Dockerが導入できるのか?あと、イメージファイルの格納場所がネットワークドライブになるのと、ユーザプロファイルの保存場所(再起動すると消える可能性とか)とかは、実際に動かしてみないと見えません。
来期、試してみたいと思います。
学習メモ
間違っているかもしれませんが、VirtualBox(以降VB)との対比でDockerについて理解したことをメモしておきたいと思います。
- VBではOSのイメージをOSのディスクやisoファイルなどを利用して自作することもできますし、以下のような配布サイトがあると思います。DockerではDocker Hubという公式リポジトリ?があり、OSだけでなくOS+プロセス(rubyとかrailsとか)を同梱したイメージを管理しています。VBでは配布のみでしたが、Docker Hubではユーザ登録すれば各ユーザが自分のイメージをpushすることができるところも素晴らしいところだと思います。
OSBoxes - Virtual Machines for VirtualBox & VMware
- VBでは下図の赤枠のようにローカルに作成したイメージファイルを保存して使用することができます。そして、このイメージファイルを起動してOSにログインして利用する感じになると思います。Dockerでも同じようにイメージをローカルに作成(あるいはDocker Hubなどからダウンロード)してきて利用します。具体的には、utubntuのイメージをダウンロードするには docker pull ubuntu とターミナルに入力します。ダウンロード済みのイメージをみるには docker images と叩けば一覧がみれます。ちなみにこのイメージを削除するには docker rmi [イメージID] で消せます。最初、このイメージをどこにおいてどうやって管理するんだろう。。。というのが気持ち悪かったです。保存場所はあるにはあるのですが、VBのようにVDIファイルのような単一ファイルではないため、あまり意識しなくていいのかな。。。と思っています。Dockerが管理するフォルダに保存される。。。という理解でいいようです。
- で、次がコンテナです。イメージをメモリにロードしてOSを動かす(コンテナを作成して起動する)には、docker run ubuntu と入力します(runはcreateとstartを実行してくれるよう)。VBの場合は、イメージとコンテナ?は1:1でしたが(←感覚的に)、Dockerの場合は、1つのイメージ(例えば、ubuntu)をもとに、別個のコンテナを作成して起動することができます。最初、イメージとコンテナというキーワードが出てくるのですが、何がどう対応しているのかわかりにくかったですが。。。イメージはあくまでファイルイメージであって、そのイメージファイルをメモリにあげて具体的に操作できるようにしたまとまりがコンテナ。。。という感覚であることがわかりました。例えば、同じアプリ(ファイル)から別個のアプリが何個でも起動できるのと似ていると理解しました。それぞれ別個のOSとして扱えディスクもメモリ空間もコンテナ単位の管理になるようです。
- コンテナはDockerによって管理されたプロセスでもありますので、docker ps というコマンドで起動状態をみることができます。まさにLinuxなどのプロセスと同じですね。そのプロセスに「OSも入っちゃっている」というのがDockerの素晴らしさなのだと思います。
- コンテナの状態を docker ps -a コマンドで確認し、もし停止していて再度使うときに docker start [コンテナID] とすればよいですし、作業を途中でやめたければ docker stop [コンテナID] とすればいいようです。コンテナがいらなくなったら、docker rm [コンテナID] とすればいいようです。
- コンテナは削除されるまでコンテナ内で行ったファイル操作などは保存されます。ここは知っている人からすると当然のことだと思いますが、手順書通りにやっているだけだと意識しないので。。。最初に理解する上でミソだと思います。
- 起動しているコンテナにアタッチ(gdbのアタッチに似ていますね)するため、docker attach [コンテナID] と入力すると接続できます。
docker-compose で自作のイメージが作れるようで、チュートリアルをやってみましたが、まだこの辺はしっくりきていません。ネットワークの設定などもあるようですが。こちらもですね。。。個人的には git も最初はよくわからない「やつ」でした。なんでaddとcommitがあるのか。。。エントリーや書籍を読んだだけではわからないんですね。。。使っていくうちにだんだんとわかっていきます。
dockerに限らず、まだまだ勉強しなければならないことがたくさんありますが。。。必要性がないとなかなか具体的に手が動きません。
とりあえず、今日はこんなところでおしまい。