前書き
Windows環境(Macも)のBoot2Dockerの共有フォルダ上ではMeteorが起動できません。下のリンク先はVagrantの話ですが、どちらもWindowsではVirtualBoxのGuestAdditionsを使用して共有フォルダを実現しているので、本質は同一です。
mongodb - Can't create working meteor.js project on a vagrant box - Stack Overflow
(特にMongoはvboxsfファイルシステムに対応していないため?)
でも、慣れた環境で開発するには共有フォルダ上で作業できると楽ちんですよね。
そこで、
DanielDent/docker-meteor
のイメージを使用して作業環境を作ります。
・・・というよりこのリンク先を見たらすべて書いてありますが・・・
準備
boot2dockerとMeteorをホストPCにインストールしている前提です。
まずは、boot2docker up
もしくはデスクトップ上のBoot2docker startを実行して仮想マシンを起動します。
一応、起動した仮想マシンにssh接続してみます。
$ boot2docker ssh
## .
## ## ## ==
## ## ## ## ## ===
/"""""""""""""""""\___/ ===
~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ / ===- ~~~
\______ o __/
\ \ __/
\____\_______/
_ _ ____ _ _
| |__ ___ ___ | |_|___ \ __| | ___ ___| | _____ _ __
| '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__|
| |_) | (_) | (_) | |_ / __/ (_| | (_) | (__| < __/ |
|_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_|
Boot2Docker version 1.7.1, build master : c202798 - Wed Jul 15 00:16:02 UTC 2015
Docker version 1.7.1, build 786b29d
docker@boot2docker:~$
ssh接続しなくても、通常のコマンドプロンプト上でdockerコマンドが使えますが、これはなまじ透過的な環境が提供されると誤解しがちになることが多いと思いますので、初学者こそssh接続したほうがかえってわかりやすいのでは、と感じます(自分のことですが)。
起動した画面上でDFを実行すると、共有フォルダがマウントされています。
(/c/Users
の部分)
docker@boot2docker:~$ df
Filesystem Size Used Available Use% Mounted on
tmpfs 1.8G 180.4M 1.6G 10% /
tmpfs 1000.9M 0 1000.9M 0% /dev/shm
/dev/sda1 18.2G 6.1G 11.1G 36% /mnt/sda1
cgroup 1000.9M 0 1000.9M 0% /sys/fs/cgroup
none 238.5G 93.2G 145.3G 39% /c/Users
/dev/sda1 18.2G 6.1G 11.1G 36% /mnt/sda1/var/lib/docker/aufs
このように、boot2dockerでは、何も指定しなくとも
Windows環境であればc:\Users
フォルダ以下にアクセスできます。
docker@boot2docker:~$ cd /c/Users
docker@boot2docker:/c/Users$ ls
All Users Default/ Default User Public/ desktop.ini
この時、ドライブ名は小文字になっていること、Users
は先頭のUが大文字になっているのに注意してください。
また、共有できるのは通常ではc:\Users
フォルダよりも下層のフォルダに限定されています。なので、c:\temp
フォルダなどは共有できません。
ホスト環境に共有させたいMeteorアプリを作成 or git clone
ホスト環境に共有させたいMeteorアプリを作成します or git cloneなどして配備します。
ただし、先に説明した通りc:\Users
以下しか共有対象になりませんので、ここではc:\Users\<ユーザー名>\
以下に新規にMeteorアプリを配置します。
新規にコマンドプロンプトを起動して
cd %userprofile%
meteor create app
と、Meteorアプリを新規に配置します。ここで大事なのは、フォルダ名が「app」限定となっています。
なので既存プロジェクトをgit clone とする際にも、appフォルダに配備するように、名称を変更してください。
dockerのイメージファイルを取得
ssh接続しているほうのコマンドプロンプトで、先ほど作成したappフォルダに移動します。
docker@boot2docker:/$ cd /c/Users/<ユーザー名>/app/
そのフォルダ上で
docker run --cap-add SYS_ADMIN -it --rm -p 3000:3000 -v "$(pwd)":/app danieldent/meteor vboxsf-shim meteor
を実行します。(1行で入力してください)すると、しばらく待っていたらイメージをダウンロード、インストール、そしてMeteorの起動までをします。
[[[[[ /app ]]]]]
=> Started proxy.
=> Started MongoDB.
=> Started your app.
=> App running at: http://localhost:3000/
試しに、ホスト側のブラウザで起動確認です。
boot2docker ip
でIPアドレスを確認、ポート3000でアクセスします。
無事起動しています。
ホスト側でファイルをいじってみましょう。
...
<body>
<h1>Welcome to Meteor!</h1>
{{> hello}}
</body>
...
h1のメッセージでも書き換えてみましょうか。
...
<body>
<h1>ようこそ Meteor!</h1>
{{> hello}}
</body>
...
終わり
これで、ファイルはホスト側と共有、環境はDockerに、といったような状態が構築できました。
要は、.meteor/localがvboxsf上にあるとMongoが起動できなくってコケるので、それ以外の通常のファイルシステム上にフォルダを適当に作成して、mount --bind
でremapしたようにしてしまえば、Mongoも起動する、ということのようです。
(本当は推奨する解決策としては、データ専用のコンテナを作成、linkや--volume-forオプションを指定、という流れがいいようですが、面倒なので、簡単な方法でいきました)
今回は準備してもらっているイメージで動作させましたが、今後は、Vagrantで再度何をしているのか、動作確認をしながら構築してみたいです。
追記:書いてみましたWindows環境でVagrant+CoreOS+Dockerをセットアップして共有フォルダ上でMeteorが走るまで - Qiita