そろそろ、自分のdocker-compose.yml周りを公開

docker便利ですね。

最近そんなことばかりしか言ってない気がします。

自分がdockerを使い始めた頃は、dockerってなんなのかわからない人が多く

話すと便利そうだけどプロダクションで使う想像がつかないとか

環境がめんど臭いとか

色々言われていました。

今現在は、開発環境として使うのであれば

docker for macというのがあって、これ入れるだけでかなり簡単にdockerが試せるようになりました。

環境を作るのが簡単になったのであれば、使えるdockerfileとかdocker-compose.ymlとかも

そろそろテンプレ的な何かがあった方が良いかな、と思い

今自分の手元でよく使っている構成でdocker-compose.ymlを公開してみます。

まずは、作りたい環境ですが

サーバサイドとしてRuby on Railsを使うことが多いので、Ruby on Railsを立ち上げる

という前提で行きます。

必要なコンテナとしては

  • Ruby on Railsが動くコンテナ

このコンテナの中には

/productsというディレクトリを作って、この中にRuby on Railsのプロジェクトを置くようにします。

  • mysqlが動くコンテナ

この二つが最低限なので、この構成を作って行きます。

まずは手元にRuby on Railsのプロジェクトを適当に作ります。

docker-compose-templateの中に入ってDockerfileを作成します。

主な構成ですが、プロジェクトのファイル以外に以下のようなファイルが追加になります。

それぞれのファイルについて中身とその解説をして行きます。

#Dockerfile

FROMのベースになるイメージは、officialのrubyにRuby on Railsで良く使うパッケージを追加したものを使用しています。

あと、特徴は

entrypoint.shという物を作成しており、ここで毎回コンテナ起動するたびに実行したい処理などを入れておきます。

#entrypoint.sh

bundle、db:migrate、pidファイル削除などを毎回起動時に行う

#Dockerfiles/mysql/conf.d/default.cnf

mysqlのコンテナで、新らし目のコンテナだとsocketの置き場所が変わったりしているので

後ほどdocker-compose.ymlでmysqlのバージョン指定はしますが、今回はdockerのofficialのmysql:5.5.54を前提に書きます。

#Dockerfiles/mysql/docker-entrypoint-initdb.d/init-user-db.sh

mysqlインスタンスの初回起動時に実行されるスクリプトになります。

これはofficialのmysqlで、コンテナ内の

/docker-entrypoint-initdb.d

というディレクトリに置かれたシェルはインスタンスの作成時に実行される

という仕組みがあるので、そこにファイルを置くように設定します。

(あとでdocker-compose.ymlでファイルを指定します)

最後、docker-compose.yml

#docker-compose.yml

ここまでで、docker-compose.ymlでRuby on Railsを起動するために必要なものは完成しました。

プロジェクトを起動するには

とやると、mysqlを起動して

init-user-db.shによってデータベースが作成され

その後にmainコンテナが起動して

entrypoint.shで初期化されて

プロジェクトが起動します。

init-user-db.sh

は、色々とカスタマイズすることで、すでにマイグレーションされたmysqlのダンプを置いて

それを初期データとして投入したり出来ます。

そうすると、

とするだけで、データベースの初期化が完了します。

また、entrypoint.shで細工しているので

の時はdocker-compose.ymlに指定したcommandが実行されてプロジェクトが起動します。

railsコマンドを叩きたい時は

とやると、コマンドが実行出来るようになっています。

なるべくシンプル構成でなるべく便利に使う想定で、今回このテンプレートっぽいファイルを作ってみました。

参考にしていただけたら幸いです。

一応githubリポジトリ

https://github.com/gendosu/docker-compose-template

 

Docker for Mac bata(1.12)とpowが共存出来ない

Docker for Mac bataがリリースされ、早速インストールしてみました。

docker-app-icon

アプリケーションディレクトリに入れて、このアイコンをダブルクリックするだけで

Dockerの環境が自動的に構築されるようです。

docker-menu-iconメニューバーにはDockerのアイコンが表示されるようになります。

1.11以前にDocker ToolboxでDockerを使っていた場合、この初回の起動時に

既存環境を新しい環境で使えるように変換が行われます。(yesにした場合)

今回は、全く新しい環境にインストールをしているので

変換も何もなく、すぐにインストールが終わりました。

変換した場合には、既存環境に応じて、それなりのディスク消費があるので

ディスクの空きが少ない場合は要注意です。

さて、Dockerの環境としては、まだこれから試してみる事はたくさんありそうですが

ここで出てきた問題が、タイトルの通り

powと相性が悪そう、という点です。

powは、Rackサーバで、ローカルでバーチャルホストを提供します。

なので、test-appというプロジェクトであれば、http://test-app.devでアクセスができるようになりますが
test-app.devは127.0.0.1になるので、localhostです。

一方、Docker for Macもポートを80番で指定してコンテナを起動したりすると

http://localhost/でアクセスができるようになります。

Docker for Macは、今までのDocker toolboxとは違い

Mac上でネイティブにハイパーバイザーを使って環境を構築しているようです。

ですので、標準の設定のままだと、これらが衝突し、Dockerのコンテナにアクセスできない、といった状況が発生します。

自分でもこのあたりが今出来る設定で回避可能なのかどうかは、調査中ではありますが

覚書として書いてみました。

 

関連情報

http://pow.cx/

https://www.docker.com/

https://github.com/docker/hyperkit

http://bhyve.org/