OS Xでfigを利用してDockerのコンテナを操作する
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
. ├── 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
です.