About connecting the dots.

data science related trivial things

Ansible経由でDockerイメージを作ってみる

これまで仮想化とかクラウドとか,そんなにお仕事で触ってなかったこともあって割と放置気味だったのだけど,さすがに少しは使えないとねということでちょいと試してみましたというお話.

以前に依頼を受けてWebアプリを作ったことがあって,これを1年くらい前にAnsible化してました.で,これをDockerに乗せてElastic BeanstalkにDokcerコンテナとしてデプロイしようと思ったわけです.

DockerfileとAnsible playbook

最初はplaybookの内容を,全部Dokcerfileに書きかえようと思ったんですけど,これが思った以上に面倒くさい.ていうかDockerfileってAnsibleみたいな丁寧なセットアッププロセスや便利なラッパーがなくて,割とベタに RUN コマンドでスクリプトそのまま書かなきゃいけないの,かなり嫌です.このあたりって,他の人たちはどうやって解決しているんでしょう.細かい粒度でプロセス切り分けて,Dockerfileが肥大化しないようにしているから,そんなに問題にならないってことなんですかね.Ansibleのほうがラッパーなぶん手軽だし,依存関係とかも

ということで,前の資産を生かす形で,Ansible playbookを拡張することにしました.手順としては,まずDockerコンテナを立ちあげるタスクを追加します.そして立ち上げたコンテナに従来のplaybookを流して,あとはイメージを保存,そしてElastic Beanstalkにコンテナをデプロイ,です.

Ansible playbookのタスク追加

sites.yml を以下のように記述します.docker_host に対するタスクとして,docker タスクを追加しています.

---
- hosts: docker_host
  become: yes
  remote_user: docker
  tasks:
    - name: deploy centos container
      docker:
        image: centos:centos6
        name: iroha
        ports: 80:80
        expose: 80
        tty: yes

- hosts: container
  connection: docker
  roles:
    - nginx
    - php
    - iroha
    - mysql

このあたり,Dokcerとの連携については以下のエントリに詳しいです*1

dev.classmethod.jp

Docker machineのセットアップ

Dokcer for Macが出たので,これをインストールしておきましょう*2.いくつかセットアップしておかなければいけないことがありますが,このあたりは以下のエントリをみて適当にやってください.docker-machineでちゃんとホストVMをセットアップしておかないと,ちゃんとDockerコンテナを立てることはできません.

qiita.com

playbookの実行とイメージの保存

ここまで準備できたら,あとはplaybookを流せば,Webアプリの載ったDockerコンテナが立ち上がります.

ansible-playbook -i hosts site.yml

docker psで実際にコンテナができてるか確認して,imageを作成します.

$ docker ps
CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS              PORTS                              NAMES
3985cf72cf58        centos:centos6                 "/bin/bash"              13 days ago         Up 13 days          0.0.0.0:80->80/tcp                 iroha
b6ca8a876c82        jupyter/datascience-notebook   "tini -- start-notebo"   13 days ago         Up 13 days          0.0.0.0:8888->8888/tcp             compassionate_joliot
3879d9ab028a        tokyor/rstudio                 "/init"                  2 weeks ago         Up 2 weeks          1410/tcp, 0.0.0.0:8787->8787/tcp   awesome_noether
$ docker commit -m"initial commit for irohajirui-sho container" 3985cf72cf58 iroha:latest
sha256:1455b4022f1977361d78d96a23aaca3a0c287d0f6a6ae14bc7c5607d04945e4a

このあとは

できあがったイメージをDocker hubにでもあげて,Elastic Beanstalkあたりでデプロイすれば,すらばしい継続的デリバリー体制の完成,めでたしめでたし.というところなんですが,現状まだElastic Beanstalkでちゃんと動作していない次第.うまくいったら別エントリにでもしますかね... ほんとうはMySQLをRDSに分離して,アプリケーションはDockerfileに切り出して,DockerfileでのElastic Beanstalkへのデプロイにしたほうが,より洗練されている感はあります.

dev.classmethod.jp

*1:だいたいこのエントリみながら試してみた次第です.

*2:WindowsもDocker for Winが出てるので,同じようにできるはずだと思います.