さよならインターネット

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

必要なもの

fig

OS Xでは、Docker containerにアクセスするまでに

OS X -> boot2docker -> docker container

boot2dockerを一旦挟まなければならなかった.
これをfigを利用することで、透過的に

OS X -> docker container

このようにアクセスしているかのようにラッピングができる

どのように使うか

とある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

Dockerfilefig.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で色々上げるコンテナ用意するのは
それはそれでいいかもしれないという気がしてきた

まとめ

figの使い方はオフィシャルサイトのドキュメントを読んでもらえば
そんなに難しいことはやっていないのですぐ理解できます.

今まで手間だと思っていた

OS X -> boot2docker -> docker container

この操作が

OS X -> docker container

  • このように透過的にDocker containerを操作できる
  • ポートフォワードの設定が直感的に設定ができる
  • コンテナ同士のリンクも直感的に設定ができる

boot2docker + fig、最高の組み合わせです

参考