Dockerを使って各プロセスを分離し、Redmineを構築してみました。
環境について
用意するコンテナは3種類。コンテナ間はDocker Linkで連携する。
-
Nginx用コンテナ
-
CentOS
6.5 -
nginx
-
-
Redmine用コンテナ
-
CentOS
6.5 unicorn
-
ruby
2.1.0 -
redmine
2.5.2
-
-
MySQL用コンテナ
-
CentOS
6.5 -
MySQL
5.5
-
環境構築
MySQLコンテナの起動
docker run
コマンドで起動する。
Dockerfileはこちら。
$ docker run -d --name mysql mattuso/redmine_mysql
Dockerfile作成の際は実行順序や実行コマンドに気をつける。
MySQLはフォアグラウンドで実行する必要があるのでCMD /usr/bin/mysqld_safe
とした。
※ service mysql start
とするとMySQL起動後にプロセス自体が終了してしまう。
Redmineコンテナの起動
次にunicornとredmineの入ったコンテナを起動する。
※ bundle install
とか走るので時間がかかります。
Dockerfileはこちら。
$ docker run -d --name unicorn --link mysql:db mattuso/redmine_unicorn
ここで、--link mysql:db
とすることで mysql というコンテナの情報を、 db というエイリアスで利用切るようにしている。これにより下記のような環境変数が利用できるようになる。
DB_NAME=/unicorn/db
DB_PORT=tcp://172.17.0.12:3306
DB_PORT_3306_TCP_PORT=3306
DB_PORT_3306_TCP_PROTO=tcp
DB_PORT_3306_TCP_ADDR=172.17.0.12
DB_PORT_3306_TCP=tcp://172.17.0.12:3306
これをRedmineの設定ファイルに記述することで自動的に連携させることが出来る。
production:
adapter: mysql2
database: redmine
host: <%= ENV.fetch('DB_PORT_3306_TCP_ADDR') %>
port: <%= ENV.fetch('DB_PORT_3306_TCP_PORT') %>
username: redmine
password: "redmine"
encoding: utf8
NginXコンテナの起動
最後にNginxコンテナを起動する。
Dockerfileはこちら。
$ docker run -d --name nginx --link unicorn:app -p 80:80 mattuso/redmine_nginx
先ほど同様、 unicorn コンテナを app として連携する。
今回は環境変数ではなく hosts の連携機能を利用し、Nginxの設定を記述している。
※ upstream
のディレクティブでは環境変数の引用が出来ないみたいです。。ポートの記述を排除するためにアプリとの連携用のポートは80にした方が無難かもしれません。
http {
upstream webapps{
server app; ←appはhostsで名前解決できる
}
}
server {
listen 80;
server_name localhost.com;
location / {
proxy_pass http://webapps;
}
}
また、-p 80:80
とすることでホストサーバへのアクセスがフォワードされるようにしておく。
アクセス
http://<ホストサーバIP> にアクセスすればOKです。
残件
データとかログをホストサーバと共有しないと、コンテナを入れ替えるとデータが飛びます。
あと、静的コンテンツはNginxが返すようにしてあげるのもいいかも。
こうしたらいいんじゃない?みたいなのありましたら、GitHubまでお願います。