はじめに
他所で遊んでいたVagrant一式を別の環境に持ってきて遊びたかっただけなんです。MongoDBで遊びたかっただけなんです。
持ってきたVagrantでCentOSを起動して、その中でDockerを使ってMongoDBを動かす。ただそれだけの単純な手順です。
でも物事はそううまくは進まない。
詰まった箇所をメモしておきます。
余談ですが、FF7のリメイク、めっちゃきれいですね。
ジェシーの「なんつって:p」がツボです。特にジェシーの宿舎前ではなくクラウドの下宿前バージョンの方です。あのギャップが良い。
UIDが競合する
まずVagrantでVMが起動しないとは思わなかった。
一度でもvagrant up
したら、そのときのUIDが記録されるようです。コピーするときにVagrantファイル(と、あれば設定ファイル的なもの)だけを持ってくれば問題ないはずです。ただ、隠しファイルを表示しない設定でWindows環境からファイルをまとめてMac環境に持ってきたりすると、余計なものまで紛れ込んでしまうことがあります。
そう御名答!UIDが記録されたファイルです。
Vagrantファイルと同じ階層からみて.vagrant/machines/default/virtualbox/creator_uid
に居ます。
vagrant up
をするとUIDが違うと言われるので、上記ファイルの中身をそのUIDに書き換えます。または、一旦vagrant destroy
をしてVMを作り直します。
ちまちま書き換えるよりdestoryするのが良いと思います。起動時に時間がかかりますが、まっさらな状態からスタートするのでホスト(VagrantのVMを動かしているところ)の環境に合わせてVMを作ることができます。急がば回れです。
共有ディレクトリでアクセス拒否
続きまして、Docker起動でつまづく。
exception in initAndListen: IllegalOperation: Attempted to create a lock file on a read-only directory
なんだこれは?
docker-compose内でVolumesの項目にてホスト(Vagrantで起動したVM)のディレクトリをマウントしたのですが、そのディレクトリで権限周りのエラーが起こっているようです。
docker ps
では起動しているように見えるのですが、1分も経たないうちにRestartループに入ります。(docker-compose.yamlにてrestartするようにしている場合)
起動できたよー なんつって:p
これはかわいくない。
マウントしたいディレクトリのパーミッションを777にしても怒られました。ディレクトリを作り直しても、別のディレクトリを指定しても怒られました。結局、名前付きVolumeを作ってそれを指定しました。
未確認ですが、ホスト側(Vagrantで起動したVM)とコンテナ(docker-compose)でUIDとGIDを一緒にすれば大丈夫なようです。この辺りのことについてはいまいち不案内なのであやふやですが、docker-composeのyamlファイルでその辺りを指定できるんでしょうか?
おまけ:MongoDBにつなげる手段が無い
DBサーバが起動しているものの、ホスト側(VagrantのVMを動かしているところ)からDBに接続する手段がなかった。
mongodbをbrewしようとすると「んなものねーよ」と言われます。
いつのころからかmongodbはOSSではなくなったそうですね?なので、brewできなかったと……
代わりにmongodb-communityを使うことにします。
brew tap mongodb/brew
brew install mongodb-community
それにしてもbashでMongoDBを操作したいだけなのに、その他諸々も入れる必要があるとは。スマートじゃない。Oracleでよく使うSQL*PlusのようなものがMongoDBにもあれば便利なんですけどね。探せば出てきそうですね。
まとめ
ようやくMongoDBに繋げられるようになりました。長かった……
普段は気難しいOracleばかりを相手にしているので、毛色の違うMongoDBはとても興味深いです。OSSではなくなったとかいう話が少し気がかりですが。
ちなみにMongoDBを視覚的に扱うには、MongoDBを立てるついでにmongo-expressも立ててみると幸せになれます。