2016年5月6日金曜日

Dockerでホストにあるディレクトリをマウントしてみた

昨日はDockerでWebサーバーを立ち上げてみましたが、このままではサイトの中身をいじくることができません。
ドットインストールではADDコマンドを使ってホストで作ったファイルをDockerのコンテナにコピーする方法を紹介していますが、それはちょっとめんどい。Vagrantのsynced_folderみたいにホストのディレクトリとそのまま同期してくれればかなり楽。というわけで、やってみました。

とりあえず適当なディレクトリを用意します。私はDropboxにディレクトリを作ってそれをマウントするのが好みです。まぁとりあえず今回はテストなので適当にホストでディレクトリを作ります。
mkdir mnttest
vi mnttest/index.html
ってやって、index.htmlを適当に作ります。
index.html
<html>
  Hello! Docker!
</html>
で、こいつを/var/www/htmlにマウントできればOK。

というわけで、docker runで-vというオプション機能を使ってみます。
docker run -v ~/mymnt:/var/www/html -p 8080:80 -d mydocker/httpd
これでブラウザでlocalhost:8080を叩くと、先ほどのindex.htmlが表示されるって寸法です。
ついでにホスト側でindex.htmlを編集して、ブラウザに反映されるかも試しましたが、問題無さそう。良かった。Vagrantのsynced_folderだと、Apacheのコンフィグいじらないと反映されなかったりするので同じような罠が無いかちょっとだけ不安でした。

ちなみにVagrantのsynced_folderは複数のディレクトリをマウントできるんですが、Dockerでもやりたいことがあるかもしれません。なので調べてみました。どうやら、-vは複数使える模様。なので、mnttest2ってディレクトリを作って、そっちに適当にファイルを入れて試してみました。
docker run -v ~/mymnt:/var/www/html -v ~/mymnt2:/tmp/mymnt2 -p 8080:80 -d mydocker/httpd
で、これをどうやって確認すりゃいいんだ?と悩むことしばし。起動中のコンテナに入るのってどうすりゃいいんだ?と。
それも調べました。どうもdocker execコマンドってのがあるみたいです。
docker ps
で起動中のコンテナのIDが取れるので、
docker exec -it <コンテナID> /bin/sh
ってやったらrootでコンテナの中に入れたので、lsコマンドとかでtmpディレクトリ内に新しくmymnt2ってディレクトリがコンテナ内に作られて、中身もホストのものと同じになっているのを確認できました。

めでたしめでたし。

(あとがき)
これはさすがにLinuxとMacで挙動に違いはないだろうと思ったので、Linux Mintだけで実験しました。
ちなみに参考にさせて頂いたサイトはこちら。ありがとうございました。
Dockerにホストのフォルダをマウントしたい! - Qiita
コンテナ内でのテータ管理 - Docker User Guide - Qiita
CoreOS で起動中のコンテナの中に入る - Qiita
こう見るとQiitaってすごいね!ね!!
いつもお世話になっております。

今後は自前のChefのレシピを見ながらDockerfileをカスタマイズして、Dockerに同じ環境を構築していきたいと思います。