CentOS6 on Google Compute EngineにDockerを入れ、コンテナ上でNginx + Unicorn + Redmineを動かしてみる
1. CentOS6 on GCEにDockerをインストールします。
sudo yum -y install http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
sudo yum -y install docker-io
sudo service docker start
sudo chkconfig docker on
2. コンテナ用の自前のDockerfileと初期化用ファイルを取得します。
(Ubuntu 14.04にruby+chefをインストールするお試し設定)
sudo yum install curl
curl -o Dockerfile https://raw.githubusercontent.com/t-oginogin/dockerfiles/master/ubuntu/Dockerfile_chef
3. Dockerfileをビルドします。
sudo docker build -t t.oginogin/chef .
4. Dockerコンテナを起動します。
(Redmineのポートを3000にしてるのでポートフォワードも設定します)
sudo docker run -p 3000:3000 -it --name chef t.oginogin/chef /bin/bash
5. rootでbashが起動するので、ユーザーubuntuでシェルを起動します。
su - ubuntu
6. ChefでRedmine起動に必要なものをインストールします
6.1. recipe取得
git clone https://github.com/t-oginogin/chef-recipes-ubuntu.git ~/chef-repo
6.2. localhost.json内のパラメータ(user,passwordなど)を適宜変更します
6.3. solo.rb内のcookbook_pathを適宜変更します
6.4. recipeを実行します
cd ~/chef-repo
sudo chef-solo -c solo.rb -j ./localhost.json
7. recipe実行が終わればredmine起動まで終わったので、Ubuntuから抜けます
exit
exit
8. Dockerイメージを保存します
sudo docker commit chef t.oginogin/redmine
9. 保存したイメージからコンテナを起動します
sudo docker run -p 3000:3000 -it --name redmine t.oginogin/redmine /bin/bash
10. 起動したコンテナ内でサービスを起動します(ユーザーubuntuで起動)。
su - ubuntu
sudo service mysql start
sudo service redmine start
sudo service nginx start
※redmine起動時にtmp/sockets/unicorn.sock
はソケットファイルでないというエラーが発生した場合は、tmp/sockets/unicorn.sock
を削除して再度redmineを起動します。
11. Host側(今回はGCE上のCentOS)からredmineへ接続確認します
curl http://localhost:3000/
無事にindex.htmlが取得できました。
12. インターネットからredmineへ接続確認します
12.1. GCEのFirewall設定にport:3000を追加します
Developers Consoleから対象インスタンスのネットワークを選択し、
[ファイアウォール ルール]-[新規作成]から追加します。
- 名前:
rails
- ソース IP の範囲:
0.0.0.0/0
- プロトコルとポート:
tcp:3000
- 説明:
空白(任意)
- ソース タグ:
空白(任意)
- ターゲット タグ:
空白(任意)
12.2. ブラウザでGCEインスタンスの外部アドレスにアクセスします
Redmineのページが表示されました。
課題
手順10でサービスを手動で起動しています。
手順9でコンテナを起動すると、
serviceに登録したデーモンが自動起動されることを期待していたのですが、
起動されなかったためです。
これはDockerコンテナ起動時にプログラムを一つしか指定できないため、
登録していたサービス群を自動起動させることが難しい?のです。
(後述する/sbin/initを起動させる方法を試してみましたが断念しました。)
Dockerのサイトではsupervisord
を起動することで登録してある複数のサービスを起動する方法が紹介されています。
supervisordとserviceコマンドとは使い勝手が違っていたので、
supervisordを使うのを見送りました。
なんとか通常の仮想環境のようにLinux丸ごとコンテナで動かしたかったので
他のやり方を調べていると、次のサイトで紹介されていました。
こちらを参考に調整したのですが、Ubuntu14.04では別の問題が発生したためかうまくいきませんでした。
そもそもコンテナの使い方として、一つのコンテナにいくつもサービスを詰め込むやり方が効率良くない気がしてきました。
コンテナを有効に使うベストプラクティスを勉強したいと思います。