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