OS Xでfigを利用してDockerのコンテナを操作する
October 25, 2014
Docker v1.3
fig 1.0.0
TL;DR
OS XでDockerコンテナを操作するのが手間だったけどfigを使えば解決した.
OS Xで本番環境と同じような環境をつくりたくてboot2docker + figを利用した
目を通しておいてもらいたい最高のエントリー
Docker1.3版 boot2docker+fig入門 - Qiita
boot2dockerでのVolume問題が解決しそう | SOTA
必要なもの
fig
OS Xでは、Docker containerにアクセスするまでに
OS X -> boot2docker -> docker container
boot2dockerを一旦挟まなければならなかった.
これをfigを利用することで、透過的に
OS X -> docker container
このようにアクセスしているかのようにラッピングができる
update 2014/10/27
完全に勘違い!OS Xでも普通にdocker
コマンド使えます.
$ boot2docker up
$ boot2docker ssh
$ docker build .
などと操作しなくても0.7.3の頃から
DockerはOS Xに対応していて
$ boot2docker up
$ docker build .
のようにログインせずともTiny Core Linuxのリモートクライアントとして
コマンドを発行できた.全然アップデート見てないことがバレた〜
Thanks @deeeet!!!
figとは
@deeeet @kenjiskywalker fig、foremanとかprocletに近い用途なイメージあります
— ゆううき (@y_uuk1) October 27, 2014
とのことです.わかりやすい.
figを利用しない場合
$ boot2docker up
$ docker build .
$ docker run -p 3000:3000 8c6d6a1339b6 bundle exec rackup -p 3000
のような操作で起動できる.
figをどのように使うか
とあるRailsのアプリケーションがあった時に、そのアプリケーションを
Docker containerで透過的に操作する為にどのようなことが必要なのかの例
.
├── Gemfile
├── Gemfile.lock
├── README.rdoc
├── Rakefile
├── app
├── bin
├── build
├── config
├── config.ru
├── db
├── lib
├── log
├── myapp
├── public
├── test
├── tmp
└── vendor
このようにRailsアプリケーションのディレクトリに
.
├── Dockerfile
├── Gemfile
├── Gemfile.lock
├── README.rdoc
├── Rakefile
├── app
├── bin
├── build
├── config
├── config.ru
├── db
├── fig.yml
├── lib
├── log
├── myapp
├── public
├── test
├── tmp
└── vendor
Dockerfile
とfig.yml
を置く
- Dockerfile
日本に住む人々は魂をRedHatに引かれてUbuntuを利用しにくいので
CentOS 6.5でRuby 2.1.3が使えるコンテナを用意した(名前の通りsqliteも入っている)
FROM kenjiskywalker/dockerfile-centos-ruby-sqlite:ruby213
WORKDIR /tmp
ADD Gemfile Gemfile
ADD Gemfile.lock Gemfile.lock
RUN bundle install
RUN mkdir /myapp
WORKDIR /myapp
ADD . /myapp
- fig.yml
web:
build: .
command: bundle exec rackup -p 3000
volumes:
- .:/myapp
ports:
- "3000:3000"
この状態で
$ boot2docker up
$ fig up
とコマンドを発行し
$ boot2docker ip
The VM's Host only interface IP address is: 192.168.59.103
$
で利用しているIPアドレスを確認して
http://192.168.59.103:3000/
にアクセスすると
コンテナ上で起動しているアプリケーションにアクセスすることができる.
手元のデータベース・サーバで何を選択するか
development環境がsqlite3を利用する設定であれば
データベースのミドルウェアを立ち上げる必要はないので
1コンテナで完結するのでこの方法が利用できます.
- config/database.yml
development: &default
adapter: sqlite3
database: db/development.sqlite3
pool: 5
timeout: 5000
しかし、裏側にMySQLを利用する場合は
- fig.yml
db:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: "pass"
ports:
- "3306"
web:
build: .
command: bundle exec rackup -p 3000
volumes:
- .:/myapp
ports:
- "3000:3000"
links:
- db
environment:
DB_HOST: db
- config/database.yml
development: &default
adapter: mysql2
encoding: utf8
pool: 5
database: mysql
username: root
password: 'pass'
host: <%= ENV['DB_HOST'] %>
このようにデータベースサーバ用コンテナの設定をRails側に記載しなければならない.
アプリケーションもデータベースもsupervisorなどで動くコンテナを
作成すれば良いのではないか、という話になるが、
本番サーバも同じようにsupervisorを利用しているならまだしも
手元でのテストをするためだけに専用のコンテナを用意するのは
本質的ではない気がします.
> 今書いていて、supervisorで色々上げるコンテナ用意するのは
> それはそれでいいかもしれないという気がしてきた
まとめ
@deeeet @kenjiskywalker fig、foremanとかprocletに近い用途なイメージあります
— ゆううき (@y_uuk1) October 27, 2014
です.