CodeBuild Docker キャッシュの損益分岐点:S3 vs ローカル
AWS CodeBuild の Docker キャッシュは S3 とローカルどちらを選ぶべきか。結論から言うと、ほとんどの場合ローカルキャッシュが最適です。本記事では具体的な損益分岐点を示します。
AWS CodeBuild の Docker キャッシュは S3 とローカルどちらを選ぶべきか。結論から言うと、ほとんどの場合ローカルキャッシュが最適です。本記事では具体的な損益分岐点を示します。
Dockerfile 内に以下のように shell の実行を記述していました。
1 | RUN chmod +x hoge.sh \ |
上記記述のある状態で docker build 実行した所、以下のようなエラーに遭遇しました。
1 | /bin/sh: hoge.sh: Text file busy |
書き込みのために現在開いている手続きのみの (共用テキスト) ファイルを実行しようとした場合や、実行中の手続きのみのファイルを書き込みのために開こうとしたり、削除しようとしたりする場合に発生します。
上記鑑みるとchmod +x hoge.sh 実行中に hoge.sh を実行しようとしたが為に発生しているということ??
と推測。
以下 sync 処理を追加し無事問題解決できました。
1 | RUN chmod +x hoge.sh \ |
自身の Rails 開発環境の雛形として利用している docker-compose です。
以下設定手順です。
1 | macOS%$ git clone https://github.com/kenzo0107/vagrant-docker |
1 | // on vagrant |
1 | vagrant%$ cp puma.rb ./rails/config/ |
1 | threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }.to_i |
1 | vagrant%$ cp database.yml ./rails/config/ |
1 | default: |
1 | vagrant%$ docker-compose run --rm web rails db:create |
以上で必要最低限の Rails プロジェクトの準備ができました!
1 | vagrant%$ docker-compose up -d |
ブラウザより http://192.168.35.101 へアクセスし
Rails トップページが表示されることが確認できます。
docker でコンテナ化しているので Nginx, MySQL 等、
バージョンアップしたい時でもコンテナを置き換えるだけで簡単に使用感を確認できたり
機能を確認できたりと便利です。
これに Elasticsearch + Kibana でログを可視化したり
Mailcatcher でメール送信を確認できるようにしたりと
開発するには十分な状況が用意できます。
是非開発の一助になれば幸いです。
簡易的に Rails 環境を構築・開発できる様にすべく構築しました。
こんな時に利用してます。
構築手順をまとめました。
1 | macOS%$ git clone https://github.com/kenzo0107/vagrant-docker |
1 | // database = mysql |
1 | // backup |
1 | threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }.to_i |
1 | // backup |
1 | default: |
1 | vagrant%$ docker-compose run --rm web rails db:create |
1 | vagrant%$ docker-compose up -d |
http://192.168.35.101 にアクセスすると Rails のウェルカムページが表示されます。
rails g 実行時は基本 one-off container で実行するのが良いです。
例えば以下は articles テーブルを作成、また、関連する controller, view, model を作成します。
1 | vagrant%$ docker-compose run --rm web rails g scaffold article title:string body:text |
Gemfile 更新した際はビルドし再起動します。
1 | vagrant%$ docker-compose stop web |
Rack server との接続は一癖ありましたが、そこさえ乗り越えたら
すっと行きました ♪
DB は 3306 でオープンしてるので
Mac のローカルから Sequel Pro で接続して確認できます。
これをベースに EFK でログ確認できる様にしたり、
mailcatcher でメール機能を試験できる様にしたりと
何かと便利です。
Docker 有難や ♪
Docker コンテナがいつの間にか Exit していた!
なんてことを防ぐ為の Mackerel Agent の設定です。
1 | $ sudo mkdir -p /etc/mackerel-agent/conf.d |
1 | pidfile = "/var/run/mackerel-agent.pid" |
1 | $ sudo service mackerel-agent restart |
しばらくするとグラフが表示されます。
※0 or 1 のみのグラフなので積み重ねグラフの方が見やすかったです
※上記グラフではコンテナ 2 つが起動しています。
running で検索すると出てきます。
3 分間の平均が 1 より低くなったら
コンテナが停止(Exit)と見なし通知する様にしました。
今回たまたま Mackerel の入ったサービスを触る機会を頂きました。
Mackerel の様なマネージドサービスを利用するメリットは
監視サーバを監視しないで良い、
という省運用コストだなぁと改めて実感。
前回構築した Vagrant 環境上で docker-compose による開発環境構築をします。
今回は前回の続きで Nginx のアクセスログを Elasticsearch + Fluentd + Kibana で可視化してみます。
アプリ
1 | macOS% $ git clone https://github.com/kenzo0107/vagrant-docker |
Git にまとめています。
1 | ├── docker-compose.yml |
volume 指定しホスト側とシンク。 それを fluentd 側でも volume 指定し tail するようにしました。以下のようなイメージです。
ブラウザから http://192.168.35.101/ にアクセスすると
Nginx の Welcome ページが確認できます。
先程の docker-compose up 後に以下のようなログが見え
fluentd が Nginx アクセスログを捕まえているのがわかります。
ブラウザから http://192.168.35.101:5601 にアクセスすると
Kibana ページが表示されます。
Index name or pattern
Time-field name
Create ボタン押下
レフトメニューから Discover クリック
当然ながら macOS と vagrant とシンクしているので
macOS 上からもログが tail できます。
1 | macOS%$ tail -f <path/to/vagrant-docker>/docker/nginx-efk/_log/nginx/access.log |
以上です。
参考になれば幸いです。
1 | docker --version |
1 | docker ps # running コンテナ一覧 |
1 | docker pull <IMAGE NAME>[:tag] # イメージダウンロード |
1 | docker build -t NAME[:TAG] |
1 | docker-compose up -d # デタッチモードでイメージよりコンテナ起動 |
開発環境構築用に作成した、
Vagrant (Ubuntu) に Docker と Docker Compose をインストールする手順をまとめました。
かなりシンプルにしてます。
1 | # -*- mode: ruby -*- |
vagrant provision で docker compose をインストールすることも可能ですが
vagrant ならではの provision だと他環境で利用できない為、OS 上でインストールする方針です。
1 | MacOS%$ vagrant up |
1 | vagrant%$ lsb_release -a |
1 | vagrant%$ uname -r |
カーネルバージョンが 3.10 より低いとバグを引き起こす危険性があるので NG。
別のカーネルバージョンの高い box を使用しましょう。
1 | vagrant%$ sudo apt-get remove docker docker-engine |
Docker に aufs ストレージを使用許可する為です。
1 | vagrant%$ sudo apt-get update |
1 | // Docker インストール |
1 | vagrant%$ curl -L "https://github.com/docker/compose/releases/download/1.12.0/docker-compose-$(uname -s)-$(uname -m)" > ~/docker-compose |
1 | vagrant%$ exit |
Docker を使用していない時にメモリのオーバーヘッドとパフォーマンス劣化を低減させる様、
GRUB (GRand Unified Bootloader: グラブ or ジーラブ) に設定する必要があります。
1 | vagrant%$ sudo vi /etc/default/grub |
1 | vagrant%$ sudo update-grub |
以上で準備完了です ♪
簡単なチュートリアルとして nginx コンテナを立ててみます。
1 | vagrant%$ docker run --rm -p 80:80 nginx:mainline-alpine |
ローカルの Mac からブラウザでアクセス
※192.168.35.101 … Vagrant で指定した private ip
問題なく Welcome ページが表示されました。
先程のログに以下のようにアクセスログが出力されるのがわかります。
1 | 192.168.35.1 - - [13/Apr/2017:10:45:46 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36" "-" |
MacOS → Vagrant → Docker
とアクセスできるようになりました ♪
今回作成した Box を Vagrant Cloud に置きました。
https://atlas.hashicorp.com/kenzo0107/boxes/ubuntu14.04.5LTS-docker-dockercompose/
こちら設定を元にこれから様々な環境構築を記載していきたいと思います ♪
前回 Vagrant (Ubuntu)で Docker, Docker Compose 環境構築しました。
上記環境を元に Docker Compose チュートリアルを実行しました。
完全な備忘録です。
1 | vagrant%$ mkdir composetest && cd composetest |
1 | from flask import Flask |
pip でインストールするモジュールを列挙します。
1 | flask |
1 | FROM python:3.4-alpine |
1 | version: '2' |
1 | vagrant%$ docker-compose up |
ブラウザにアクセスしてみる。
表示されました!
リロードする度に以下数字部分がインクリメントされるのが確認できます。
1 | Hello from Docker! I have been seen 1 times. |
便利 ♪