dockerの勉強のため、実例で学ぶDockerハンズオンの構成をベースに、aws上で動かしてみた。
s3のbucketを用意
ログファイル書き込み先のaws s3 bucketを作成、access keyとsecret keyを取得。
参考:https://joppot.info/2014/06/14/1621
Docker Hubにimageを登録
Dockerfileを作成してGitHubにpush。
Docker HubでAutomated Buildを作成してimageを登録。
GitHubの1リポジトリ上に3種のDockerfileを置いたため、Automated Buildは3つ作成した。
https://hub.docker.com/r/khwada/nginx/
https://hub.docker.com/r/khwada/sinatra/
https://hub.docker.com/r/khwada/fluentd-s3/
なお、s3のbucketなどの情報は、コンテナ起動時に環境変数で指定する。
aws ec2上でdocker containerを起動
参考: http://docs.aws.amazon.com/AmazonECS/latest/developerguide/docker-basics.html#install_docker
ssh(22)とhttp(80)を開けてec2インスタンスを作成。
dockerをインストール。
Docker Hubからdocker imageをpull。
docker pull khwada/fluentd-s3
docker pull khwada/sinatra
docker pull khwada/nginx
docker containerを起動。
nginxからsinatraへは、link。
nginxおよびsinatraからfluentdへは、log driverで連携。
docker run --name fluentd-s3 -d -p 8888:8888 \
-e "AWS_ACCESS_KEY_ID={s3のaccess key}" \
-e "AWS_SECRET_ACCESS_KEY={s3のsecret key}" \
-e "FLUENTD_S3_BUCKET={s3のbucket名}" \
-e "FLUENTD_S3_REGION={s3のregion、例;aps-northeast-1}" \
khwada/fluentd-s3
docker run --name sinatra -d --log-driver=fluentd --log-opt=fluentd-address=localhost:8888 --log-opt fluentd-tag=docker.{{.Name}} khwada/sinatra
docker run --name nginx -d -p 80:80 --link sinatra:sinatra --log-driver=fluentd --log-opt fluentd-address=localhost:8888 --log-opt fluentd-tag=docker.{{.Name}} khwada/nginx
動作確認
ブラウザから、作成したec2インスタンスにアクセス(http)。
"Hello World!"と表示されれば、nginxとsinatraが正しくlinkできている。
またnginxとsinatraのログが、fluentdで集約され、s3に送られる(10秒ごとにflushするようにしている)。
fluentdコンテナのログでも確認可能(デバッグ用)。
docker logs fluentd-s3
詰まったところ
ローカルマシーンのVM上でdockerを動かしていたとき、s3にログファイルを送れない事象が発生した。
⇒docker run -vでマウントしているディレクトリを、buffer先に指定していると発生する模様。
docker run --name td-agent -d -v /vagrant/log/:/var/log/td-agent -p 8888:8888 khwada/td-agent
path /var/log/td-agent/s3
2016-05-05 09:05:36 +0000 [error]: error on output thread error="Text file busy @ sys_fail2 - (/var/log/td-agent/s3.20160505-0842.b5321452e6036d6fa.log, /var/log/td-agent/s3.20160505-0842.q5321452e6036d6fa.log)"
2016-05-05 09:05:36 +0000 [error]: /opt/td-agent/embedded/lib/ruby/gems/2.1.0/gems/fluentd-0.12.20/lib/fluent/plugin/buf_file.rb:68:in `rename'
2016-05-05 09:05:36 +0000 [error]: /opt/td-agent/embedded/lib/ruby/gems/2.1.0/gems/fluentd-0.12.20/lib/fluent/plugin/buf_file.rb:68:in `mv'
2016-05-05 09:05:36 +0000 [error]: /opt/td-agent/embedded/lib/ruby/gems/2.1.0/gems/fluentd-0.12.20/lib/fluent/plugin/buf_file.rb:185:in `enqueue'
2016-05-05 09:05:36 +0000 [error]: /opt/td-agent/embedded/lib/ruby/gems/2.1.0/gems/fluentd-0.12.20/lib/fluent/buffer.rb:296:in `block (2 levels) in push'
2016-05-05 09:05:36 +0000 [error]: /opt/td-agent/embedded/lib/ruby/2.1.0/monitor.rb:211:in `mon_synchronize'
2016-05-05 09:05:36 +0000 [error]: /opt/td-agent/embedded/lib/ruby/gems/2.1.0/gems/fluentd-0.12.20/lib/fluent/buffer.rb:295:in `block in push'
2016-05-05 09:05:36 +0000 [error]: /opt/td-agent/embedded/lib/ruby/2.1.0/monitor.rb:211:in `mon_synchronize'
2016-05-05 09:05:36 +0000 [error]: /opt/td-agent/embedded/lib/ruby/gems/2.1.0/gems/fluentd-0.12.20/lib/fluent/buffer.rb:289:in `push'
2016-05-05 09:05:36 +0000 [error]: /opt/td-agent/embedded/lib/ruby/gems/2.1.0/gems/fluentd-0.12.20/lib/fluent/output.rb:534:in `block (2 levels) in configure'
2016-05-05 09:05:36 +0000 [error]: /opt/td-agent/embedded/lib/ruby/gems/2.1.0/gems/fluentd-0.12.20/lib/fluent/output.rb:533:in `each'
2016-05-05 09:05:36 +0000 [error]: /opt/td-agent/embedded/lib/ruby/gems/2.1.0/gems/fluentd-0.12.20/lib/fluent/output.rb:533:in `block in configure'
2016-05-05 09:05:36 +0000 [error]: /opt/td-agent/embedded/lib/ruby/gems/2.1.0/gems/fluentd-0.12.20/lib/fluent/output.rb:585:in `call'
2016-05-05 09:05:36 +0000 [error]: /opt/td-agent/embedded/lib/ruby/gems/2.1.0/gems/fluentd-0.12.20/lib/fluent/output.rb:585:in `enqueue_buffer'
2016-05-05 09:05:36 +0000 [error]: /opt/td-agent/embedded/lib/ruby/gems/2.1.0/gems/fluentd-0.12.20/lib/fluent/output.rb:297:in `block in try_flush'
2016-05-05 09:05:36 +0000 [error]: /opt/td-agent/embedded/lib/ruby/2.1.0/monitor.rb:211:in `mon_synchronize'
2016-05-05 09:05:36 +0000 [error]: /opt/td-agent/embedded/lib/ruby/gems/2.1.0/gems/fluentd-0.12.20/lib/fluent/output.rb:295:in `try_flush'
2016-05-05 09:05:36 +0000 [error]: /opt/td-agent/embedded/lib/ruby/gems/2.1.0/gems/fluentd-0.12.20/lib/fluent/output.rb:140:in `run'
下記に変更したら、正常に送られるようになった。
buffer_path /var/tmp/s3