本番環境で動いているものをそのままに、ローカルで開発したいのだが、
本番がEC2上で動いているのでどうしたものか。
そんな時にAmazon LinuxがDockerで持ち出せるという記事を見付けたので、
実際にやってみた。
・本番で動いているWebサーバのAMIを元に、インスタンスを2台起動する。
・起動したインスタンスの内、1台を停止する。
・停止したインスタンスのルートボリュームをデタッチする。
・デタッチしたボリュームを、もう片方のインスタンスにアタッチする。
・稼動しているインスタンスに入り、lsblkでアタッチされていることを確認する。
・mkdir /dockerimage (ディレクトリ名は任意) で、ファイル保存先のディレクトリを作成。
・mount /dev/xvdg(デバイス名は適宜変更) /dockerimageでマウント。
(mkfs ext4 /dev/xvdg とかしちゃうとフォーマットしちゃうので、そのままマウント)
・chdir /dockerimage でマウントしたディレクトリに移動
・tar --numeric-owner -cJpf image.tar.xz . で、マウントしたボリュームの内容を丸ごと固める
・固めたファイルをscp等使用して持ち出し。
これで、Dockerにインポートするファイルが用意できた。
ポイントは、ルートボリュームを別のインスタンスにマウントしてから固めること。
ファイルシステムが稼動していると、/proc/kcore とかが2TB以上いってて永遠に終わらなくて焦った汗
■Dockerの準備
・windowsを使用していたので、boot2dockerを使用して、windows上でDocker環境を構築する。
下記サイトからboot2dockerをダウンロード
・boot2dockerは、Virtualization Technology というやつがONになっていないと使用できないので、設定する。(これがわからなくてboot2dockerを起動できなくてまた焦った汗)
→ BIOS起動
→ Virtualization を選択
→ Virtualization Technology をenabledに設定
これでboot2dockerを起動できるようになるはず。
・次にコマンドプロンプトからboot2dockerを起動できるようにする為、
環境変数PATHに下記を通す。
C:\Program Files (x86)\Git\bin
・boot2dockerは初期設定で使用ディスク量が20GBに設定されており、
少なめなので下記で容量を増やしておく。
ついでに使用メモリ量も増やしておく。
※ディスク容量50GB, メモリ4GBにする場合
→ boot2docker config -s 50000 -m 4096 > C:\Users\ユーザ名\.boot2docker\profile
→ boot2docker init -s 50000 -m 4096
→ boot2docker start
→ boot2docker config で、容量が変わっていることを確認
・boot2docker ip で、仮想マシンのIPを控えておく。
・取得したIPで名前解決できるように、
C:\Windows\System32\drivers\etc\hosts ファイルを編集しておく。
ex. 取得したIP hogehoge
・固めたファイルをdockerへインポートする。
→ cat /c/users/ユーザ名/Desktop/ファイル名 | docker import - amazon
※/c/ ~ はホストと共有しているディレクトリなので、windowsで言えば、
C:\Users\ユーザ名\Desktop\ファイル名
・docker images でインポートされていることを確認。
・コンテナを作成する。
docker run -d -it -p 80:80 -v ローカルで作業していた時のドキュメントルート:/container-directory --hostname hogehoge --name hogehoge amazon:latest /bin/bash
・コンテナ起動。
docker start hogehoge
・コンテナに接続。
docker attach hogehoge
・コンテナ内のwebサーバのドキュメントルートを、コンテナ作成時にホストと共有したディレクトリのパスに変更してから、webサーバ起動。
・http://hogehogeにアクセスし、ページが表示されれば成功。
これでDockerを使ってローカルで開発できるようになったはず。
Fuel PHPを使っているのだが、Docker上だと、
Response::__toString の
return (string) $this->body;
に異常に時間がかかっている。
メモリ増やしてみても改善されず、とりあえず一旦放置。
Dockerを使うと、1ソフトウェアにつき、1コンテナを起動させ、コンテナ同士で接続させてアプリケーションを作るイメージ。
ソフトウェアのバージョンを上げたければ別コンテナを作成して、そいつと接続し直すようにすれば良いし、
その構成自体もイメージとして配布しちゃえば共有も簡単なので非常に楽。軽量だし。
Dockerはもっといじり倒そうと思う。
※参考記事