DevLOVE199 越境CON
https://devlove.doorkeeper.jp/events/55648
(株)永和システムマネジメント@mtsmfm松島 史秋Docker あれ
View Slide
松島 史秋GitHub, Twitter@mtsmfm
self.inspect- 永和システムマネジメント勤務 (4年目)- Rails で Web アプリ開発- 自社インフラの管理
https://www.wantedly.com/projects/28670
self.inspect- 永和システムマネジメント勤務 (4年目)- Rails で Web アプリ開発- 自社インフラの管理- 西日暮里.rb 主催
https://ninirb.github.io
https://nishinipporirb.doorkeeper.jp/events/55942
self.inspect- 永和システムマネジメント勤務 (4年目)- Rails で Web アプリ開発- 自社インフラの管理- 西日暮里.rb 主催- Ruby と麻雀 が好き
Ruby
https://github.com/mtsmfm/annotate_routes
https://github.com/mtsmfm/qwik2md
http://qwik.jp
https://asakusarb.esa.io/
8年分の歴史を移行
https://github.com/mtsmfm/hubot-test-helper
麻雀
http://mtsmfm.github.io/tegaki-jan
開発現場における新たな越境
ゲストとホストの境界を越える
Docker知ってる人?触ったことある人?仕事で使ってる人?
※ Docker の説明はしないので各自調べてください
begin
目次第一部 出会いと挫折第二部 初仕事第三部 本番構築第四部 ゼロからまとめ
第一部出会いと挫折
HerokuDocker
$ heroku plugins:installheroku-dockerhttps://blog.heroku.com/introducing_heroku_docker_release_build_deploy_heroku_apps_with_docker※今は deprecated
$ heroku docker:init# Dockerfile とかができる$ # なんか変更$ heroku docker:start# build しなおして up が走る
変更の度コマンド叩くとかやってらんない
http://qiita.com/mtsmfm/items/bb6af62c4cf878a1e3ee
結果
“docker run うんたらどうたらかんたら...”
“こんなめんどくさいことするより手元にある環境でやった方が早い”
Docker を使うことなく普通に手元の環境で開発続行
手元で環境を用意するのが辛いときは Docker
https://github.com/swagger-api/swagger-codegenJava 入れるのめんどい...
まとめ:慣れた環境と同じことできないとDocker で開発辛い
第一部完
第二部初仕事
管理するものは減らしたい
ganeti による仮想サーバ群お客様事情による- CI サーバ- ステージング (本番はお客様先)社内用サービス- Redmine- Wiki (qwik)- Git リポジトリ- IRC
精査するとほぼ無くなる
ステージングも1つだけ(しかも休止中)
ステージングの用途- アプリケーションの動作確認- Ansible のテスト- mina (デプロイスクリプト) のテスト
本番は変わらない(変えられない)ので既存のプロビジョニングツールはそのまま活用
手元で試せたほうがいいのでは?
Vagrant or Docker
現ステージングと同等の環境ができたらdocker push して寝かせておく
Ansibleon docker
ansible_connection=docker
minaon docker
$ mina deploy to=staging -S | \head -n -1 | \docker exec -i container bash
$ mina deploy to=staging -S | \head -n -1 | \docker exec -i container bash実行予定のスクリプトを出力する
playbook はある、が...
「playbook を流すための前提」が不足
途中からplaybook を書き始めた?
今の環境になら流れる
一から流すと動かない
普段通らないhandler とか...
ちょいちょい手でやったと思われるところがある
まとめ:手でやり得ると手でやってしまう捨てやすいコンテナ便利
第二部完
第三部本番構築
お客様先でオンプレからAWS に移行
とりあえず新しくできるやつはオンプレやめたい
https://aws.amazon.com/jp/ecs/
http://www.slideshare.net/AmazonWebServicesJapan/aws-black-belt-online-seminar-2016-amazon-ec2-container-service
まぁそうなるよねという構成
Docker の imageさえできていればECS で動かすのは難しくない
誰がどこで buildするか問題
CI サービスor自前
自分たちで管理するものは減らしたい
https://circleci.com/
build 遅い
http://qiita.com/na-o-ys/items/d16fd4959d4aec405f4f
https://app.shippable.com/
10分+ → 2分
しかし...
唐突に cache が飛んだり
30 分待ってもbulid が始まらなかったり
あまりに不安定だったのでCircle CI に出戻り
https://circleci.com/beta-access
https://semaphoreci.com/
個人のアプリで素振りしている範囲だとSemaphore CIよさそう
まとめ:ECS らくちんbuild どうするよCircle CI 2.0 はよ
第三部完
第四部ゼロから
ある日
出社してカバンからPC を取り出すと...
修理
代替機で開発
→
俺はあと何回このパッケージ群を入れるんだろう
本番 Dockerなのに...
なぜかつて挫けてしまったか
https://speakerdeck.com/takaking22/wo-hanazeyue-jing-surufalseka-yue-jing-maindosetutotoxian-chang-gai-shan-number-devlove
逃げ道があるのがいけない!!!
Docker 縛りで圧倒的成長
- rbenv- nodebrew- PostgreSQLetc...
$ ruby -vzsh: command not found: ruby
- Atom- Zsh- Git- Docker- Docker Composeくらい
.rb の実行だって$ cat a.rb | docker run -i ruby ruby
pry での対話的デバッグだってdocker-compose.yml でtty: truestdin_open: trueしといてから$ docker attach $(docker-compose ps -q web)
ワンライナーだってgit ls-files | xargs -L 1 docker run --rm -i -v \$PWD:/$PWD -w /$PWD \ruby ruby -i -e \'puts gets(nil).gsub("docker", "Docker")'
自分のパッケージをメンテするときだってhttps://github.com/mtsmfm/hubot-test-helper/commit/a52f1cb3d8ade2029f048d3a3ce7893db875e162
ブログ書くときだってhttps://github.com/mtsmfm/mtsmfm.github.io/commit/a220095383a85c05ad6f55b11744867f74abf3b7
Docker 化されてないもの触るときだってhttps://github.com/mtsmfm/docker-rails-dev-box
Selenium 使うのとかむしろ楽だったりするhttps://github.com/mtsmfm/janjan/blob/3433507392ae055a5c4d4f32e74def8cd50b11bd/docker-compose.yml#L51-L58
なんかもううまくいかないみたいな場合も$ docker-compose down -v$ docker-compose run web bin/setup$ docker-compose up
エイリアス
alias dc="docker-compose"
alias rails="docker-compose exec\web bin/rails"$ rails db:migrateRails 触るときに便利
alias drv="\docker run --rm -it \-v $PWD:/$PWD -w /$PWD"$ drv node npm install雑になんか書くとか誰かのパッケージ触るときとかに頻出パターン
alias ruby="\docker run --rm -it \-v $PWD:/$PWD \-w /$PWD ruby ruby"
.rb の実行$ cat a.rb | docker run -i ruby ruby
.rb の実行$ cat a.rb | docker run -i ruby ruby$ ruby a.rb
alias -g @ruby="\docker run --rm -i \-v $PWD:/$PWD \-w /$PWD ruby ruby"
ワンライナーgit ls-files | xargs -L 1 docker run --rm -i -v \$PWD:/$PWD -w /$PWD \ruby ruby -i -e \'puts gets(nil).gsub("docker", "Docker")'
ワンライナーgit ls-files | xargs -L 1 docker run --rm -i -v \$PWD:/$PWD -w /$PWD \ruby ruby -i -e \'puts gets(nil).gsub("docker", "Docker")'git ls-files | xargs -L 1 @ruby -i -e \'puts gets(nil).gsub("docker", "Docker")'
あれ、わりといける?
みんなで Docker にしてもXX でしか起きない現象はあったりする
https://github.com/npm/npm/issues/9863aufs な人しか起きない
Docker のバージョンとStorage Driver を合わせた方が安心かも
最大の問題lint
Atom のLinter plugin はどれも手元に Linter がインストールされている前提
Atom はプロジェクト単位での設定を持てない
強引な解:ラッパースクリプトにdirenv でパスを通す
$ cat .envrcPATH_add ./docker/bin$ cat docker/bin/ruby#!/usr/bin/env shif [ -p /dev/stdin ]; thencat - | docker exec -i app_web_1 ruby "$@"elsedocker exec -i app_web_1 ruby "$@"fi
https://github.com/docker/compose/pull/4059
一応動いた、が...
Atom の環境変数は複数起動してたら共通なのであった
そこでTalk DrivenDevelopment
https://atom.io/packages/docker-linter-rubocop
https://github.com/mtsmfm/docker-linter-rubocop/blob/v0.2.2/lib/index.coffee#L39-L44
1. 動いてるコンテナを探す2. そのうち rubocop が入ってるものを探す3. rubocop を動かす
動きはする
- 他の linter- デバッグ用にファイルを開く類- save_and_open_screenshot- letter_opener- bundle open- Mac だと遅い- Linux のときにコンテナ内から作ったもののPermission と Owner- エディタも on docker であるべき?- docker-linter-rubocop が雑困りごとはまだまだ
俺達の戦いはまだ始まったばかり
第四部完
この発表で伝えたかったこと
Docker を本番で使う事例をよく聞くようになった
わりとなんとかなる
開発環境どうですか
Dockerありますか
Docker“だけ”あればいいですか
“XXさんのところでだけ再現する”
“マシンセットアップ”
やめたい
すべての環境に
Docker あれ!
Docker“だけ” あれ!
CreditsBackground pattern from subtlepatterns.comEmoji provided free by Emoji One
end