Upgrade to Pro — share decks privately, control downloads, hide ads and more …

let there be (only) docker

let there be (only) docker

Fumiaki MATSUSHIMA

January 28, 2017
Tweet

More Decks by Fumiaki MATSUSHIMA

Other Decks in Programming

Transcript

  1. (株)永和システムマネジメント
    @mtsmfm
    松島 史秋
    Docker あれ

    View Slide

  2. 松島 史秋
    GitHub, Twitter
    @mtsmfm

    View Slide

  3. self.inspect
    - 永和システムマネジメント勤務 (4年目)
    - Rails で Web アプリ開発
    - 自社インフラの管理

    View Slide

  4. View Slide

  5. https://www.wantedly.com/projects/28670

    View Slide

  6. self.inspect
    - 永和システムマネジメント勤務 (4年目)
    - Rails で Web アプリ開発
    - 自社インフラの管理
    - 西日暮里.rb 主催

    View Slide

  7. https://ninirb.github.io

    View Slide

  8. https://nishinipporirb.doorkeeper.jp/events/55942

    View Slide

  9. self.inspect
    - 永和システムマネジメント勤務 (4年目)
    - Rails で Web アプリ開発
    - 自社インフラの管理
    - 西日暮里.rb 主催
    - Ruby と麻雀 が好き

    View Slide

  10. Ruby

    View Slide

  11. https://github.com/mtsmfm/annotate_routes

    View Slide

  12. https://github.com/mtsmfm/qwik2md

    View Slide

  13. http://qwik.jp

    View Slide

  14. https://asakusarb.esa.io/

    View Slide

  15. 8年分の歴史を移行

    View Slide

  16. View Slide

  17. View Slide

  18. View Slide

  19. View Slide

  20. https://github.com/mtsmfm/hubot-test-helper

    View Slide

  21. 麻雀

    View Slide

  22. http://mtsmfm.github.io/tegaki-jan

    View Slide

  23. View Slide

  24. https://devlove.doorkeeper.jp/events/55648

    View Slide

  25. 開発現場における
    新たな越境

    View Slide

  26. View Slide

  27. ゲストとホスト
    の境界を越える

    View Slide

  28. (株)永和システムマネジメント
    @mtsmfm
    松島 史秋
    Docker あれ

    View Slide

  29. Docker
    知ってる人?
    触ったことある人?
    仕事で使ってる人?

    View Slide

  30. ※ Docker の説明はしないので
    各自調べてください

    View Slide

  31. begin

    View Slide

  32. 目次
    第一部 出会いと挫折
    第二部 初仕事
    第三部 本番構築
    第四部 ゼロから
    まとめ

    View Slide

  33. 第一部
    出会いと挫折

    View Slide

  34. Heroku
    Docker

    View Slide

  35. $ heroku plugins:install
    heroku-docker
    https://blog.heroku.com/introducing_heroku_docker_release_build
    _deploy_heroku_apps_with_docker
    ※今は deprecated

    View Slide

  36. $ heroku docker:init
    # Dockerfile とかができる
    $ # なんか変更
    $ heroku docker:start
    # build しなおして up が走る

    View Slide

  37. 変更の度コマンド叩くとか
    やってらんない

    View Slide

  38. http://qiita.com/mtsmfm/items/bb6af62c4cf878a1e3ee

    View Slide

  39. View Slide

  40. 結果

    View Slide

  41. “docker run うんたら
    どうたらかんたら...”

    View Slide

  42. “こんなめんどくさいこ
    とするより
    手元にある環境で
    やった方が早い”

    View Slide

  43. Docker を
    使うことなく
    普通に手元の環境で
    開発続行

    View Slide

  44. View Slide

  45. 手元で環境を
    用意するのが
    辛いときは Docker

    View Slide

  46. https://github.com/swagger-api/swagger-codegen
    Java 入れるのめんどい...

    View Slide

  47. View Slide

  48. まとめ:
    慣れた環境と
    同じことできないと
    Docker で
    開発辛い

    View Slide

  49. 第一部

    View Slide

  50. 第二部
    初仕事

    View Slide

  51. self.inspect
    - 永和システムマネジメント勤務 (4年目)
    - Rails で Web アプリ開発
    - 自社インフラの管理

    View Slide

  52. 管理するものは
    減らしたい

    View Slide

  53. ganeti による仮想サーバ群
    お客様事情による
    - CI サーバ
    - ステージング (本番はお客様先)
    社内用サービス
    - Redmine
    - Wiki (qwik)
    - Git リポジトリ
    - IRC

    View Slide

  54. ganeti による仮想サーバ群
    お客様事情による
    - CI サーバ
    - ステージング (本番はお客様先)
    社内用サービス
    - Redmine
    - Wiki (qwik)
    - Git リポジトリ
    - IRC

    View Slide

  55. 精査すると
    ほぼ無くなる

    View Slide

  56. ステージングも
    1つだけ
    (しかも休止中)

    View Slide

  57. ステージングの用途
    - アプリケーションの動作確認
    - Ansible のテスト
    - mina (デプロイスクリプト) の
    テスト

    View Slide

  58. 本番は変わらない
    (変えられない)ので
    既存のプロビジョニングツー
    ルはそのまま活用

    View Slide

  59. 手元で試せたほうが
    いいのでは?

    View Slide

  60. Vagrant or Docker

    View Slide

  61. Vagrant or Docker

    View Slide

  62. ステージングも
    1つだけ
    (しかも休止中)

    View Slide

  63. 現ステージングと
    同等の環境ができたら
    docker push して
    寝かせておく

    View Slide

  64. Ansible
    on docker

    View Slide

  65. ansible_connection=docker

    View Slide

  66. mina
    on docker

    View Slide

  67. $ mina deploy to=staging -S | \
    head -n -1 | \
    docker exec -i container bash

    View Slide

  68. $ mina deploy to=staging -S | \
    head -n -1 | \
    docker exec -i container bash
    実行予定のスクリプトを
    出力する

    View Slide

  69. View Slide

  70. View Slide

  71. playbook は
    ある、が...

    View Slide

  72. 「playbook を流す
    ための前提」
    が不足

    View Slide

  73. 途中から
    playbook を
    書き始めた?

    View Slide

  74. 今の環境になら
    流れる

    View Slide

  75. 一から流すと
    動かない

    View Slide

  76. 普段通らない
    handler とか...

    View Slide

  77. ちょいちょい
    手でやったと思われる
    ところがある

    View Slide

  78. まとめ:
    手でやり得ると
    手でやってしまう
    捨てやすい
    コンテナ便利

    View Slide

  79. 第二部

    View Slide

  80. 第三部
    本番構築

    View Slide

  81. お客様先で
    オンプレから
    AWS に移行

    View Slide

  82. とりあえず
    新しくできるやつは
    オンプレやめたい

    View Slide

  83. https://aws.amazon.com/jp/ecs/

    View Slide

  84. http://www.slideshare.net/AmazonWebServicesJapan/aws-black-belt-online-seminar-20
    16-amazon-ec2-container-service

    View Slide

  85. View Slide

  86. まぁそうなるよね
    という構成

    View Slide

  87. Docker の image
    さえできていれば
    ECS で動かすのは
    難しくない

    View Slide

  88. Docker の image
    さえできていれば
    ECS で動かすのは
    難しくない

    View Slide

  89. 誰がどこで build
    するか問題

    View Slide

  90. CI サービス
    or
    自前

    View Slide

  91. 自分たちで
    管理するものは
    減らしたい

    View Slide

  92. https://circleci.com/

    View Slide

  93. View Slide

  94. View Slide

  95. View Slide

  96. View Slide

  97. View Slide

  98. View Slide

  99. build 遅い

    View Slide

  100. http://qiita.com/na-o-ys/items/d16fd4959d4aec405f4f

    View Slide

  101. https://app.shippable.com/

    View Slide

  102. 10分+ → 2分

    View Slide

  103. しかし...

    View Slide

  104. 唐突に cache が
    飛んだり

    View Slide

  105. 30 分待っても
    bulid が
    始まらなかったり

    View Slide

  106. あまりに
    不安定だったので
    Circle CI に出戻り

    View Slide

  107. https://circleci.com/beta-access

    View Slide

  108. https://semaphoreci.com/

    View Slide

  109. 個人のアプリで
    素振りしている
    範囲だと
    Semaphore CI
    よさそう

    View Slide

  110. まとめ:
    ECS らくちん
    build どうするよ
    Circle CI 2.0 はよ

    View Slide

  111. 第三部

    View Slide

  112. 第四部
    ゼロから

    View Slide

  113. ある日

    View Slide

  114. 出社してカバンから
    PC を取り出すと...

    View Slide

  115. View Slide

  116. View Slide

  117. 修理

    View Slide

  118. 代替機で開発

    View Slide


  119. View Slide

  120. 俺はあと何回
    このパッケージ群を
    入れるんだろう

    View Slide

  121. 本番 Docker
    なのに...

    View Slide

  122. なぜかつて
    挫けてしまったか

    View Slide

  123. https://speakerdeck.com/takaking22/wo-hanazeyue-jing-surufalseka-yue-jing-m
    aindosetutotoxian-chang-gai-shan-number-devlove

    View Slide

  124. 逃げ道があるのが
    いけない!!!

    View Slide

  125. Docker 縛りで
    圧倒的成長

    View Slide

  126. - rbenv
    - nodebrew
    - PostgreSQL
    etc...

    View Slide

  127. View Slide

  128. $ ruby -v
    zsh: command not found: ruby

    View Slide

  129. - Atom
    - Zsh
    - Git
    - Docker
    - Docker Compose
    くらい

    View Slide

  130. .rb の実行だって
    $ cat a.rb | docker run -i ruby ruby

    View Slide

  131. pry での対話的デバッグだって
    docker-compose.yml で
    tty: true
    stdin_open: true
    しといてから
    $ docker attach $(docker-compose ps -q web)

    View Slide

  132. ワンライナーだって
    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")'

    View Slide

  133. 自分のパッケージを
    メンテするときだって
    https://github.com/mtsmfm/hubot-test-helper/commit/a52f1c
    b3d8ade2029f048d3a3ce7893db875e162

    View Slide

  134. ブログ書くときだって
    https://github.com/mtsmfm/mtsmfm.github.io/commit/a2200
    95383a85c05ad6f55b11744867f74abf3b7

    View Slide

  135. Docker 化されてない
    もの触るときだって
    https://github.com/mtsmfm/docker-rails-dev-box

    View Slide

  136. Selenium 使うのとか
    むしろ楽だったりする
    https://github.com/mtsmfm/janjan/blob/3433507392ae055a5c4d4f32e74def8cd
    50b11bd/docker-compose.yml#L51-L58

    View Slide

  137. なんかもううまくいかない
    みたいな場合も
    $ docker-compose down -v
    $ docker-compose run web bin/setup
    $ docker-compose up

    View Slide

  138. エイリアス

    View Slide

  139. alias dc="docker-compose"

    View Slide

  140. alias rails="docker-compose exec\
    web bin/rails"
    $ rails db:migrate
    Rails 触るときに便利

    View Slide

  141. alias drv="\
    docker run --rm -it \
    -v $PWD:/$PWD -w /$PWD"
    $ drv node npm install
    雑になんか書くとか
    誰かのパッケージ触るときと
    かに頻出パターン

    View Slide

  142. alias ruby="\
    docker run --rm -it \
    -v $PWD:/$PWD \
    -w /$PWD ruby ruby"

    View Slide

  143. .rb の実行
    $ cat a.rb | docker run -i ruby ruby

    View Slide

  144. .rb の実行
    $ cat a.rb | docker run -i ruby ruby
    $ ruby a.rb

    View Slide

  145. alias -g @ruby="\
    docker run --rm -i \
    -v $PWD:/$PWD \
    -w /$PWD ruby ruby"

    View Slide

  146. ワンライナー
    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")'

    View Slide

  147. ワンライナー
    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")'

    View Slide

  148. あれ、わりといける?

    View Slide

  149. みんなで Docker にしても
    XX でしか起きない現象は
    あったりする

    View Slide

  150. https://github.com/npm/npm/issues/9863
    aufs な人しか起きない

    View Slide

  151. Docker のバージョンと
    Storage Driver を
    合わせた方が安心かも

    View Slide

  152. 最大の問題
    lint

    View Slide

  153. Atom の
    Linter plugin は
    どれも
    手元に Linter が
    インストール
    されている前提

    View Slide

  154. Atom は
    プロジェクト単位での
    設定を持てない

    View Slide

  155. 強引な解:
    ラッパースクリプトに
    direnv でパスを通す

    View Slide

  156. $ cat .envrc
    PATH_add ./docker/bin
    $ cat docker/bin/ruby
    #!/usr/bin/env sh
    if [ -p /dev/stdin ]; then
    cat - | docker exec -i app_web_1 ruby "$@"
    else
    docker exec -i app_web_1 ruby "$@"
    fi

    View Slide

  157. $ cat .envrc
    PATH_add ./docker/bin
    $ cat docker/bin/ruby
    #!/usr/bin/env sh
    if [ -p /dev/stdin ]; then
    cat - | docker exec -i app_web_1 ruby "$@"
    else
    docker exec -i app_web_1 ruby "$@"
    fi

    View Slide

  158. https://github.com/docker/compose/pull/4059

    View Slide

  159. 一応動いた、が...

    View Slide

  160. Atom の環境変数は
    複数起動してたら
    共通なのであった

    View Slide

  161. そこで
    Talk Driven
    Development

    View Slide

  162. https://atom.io/packages/docker-linter-rubocop

    View Slide

  163. https://github.com/mtsmfm/docker-linter-rubocop/blob/v0.2.2/lib/index.coffee#L39-L44

    View Slide

  164. 1. 動いてるコンテナを探す
    2. そのうち rubocop が
    入ってるものを探す
    3. rubocop を動かす

    View Slide

  165. 動きはする

    View Slide

  166. - 他の linter
    - デバッグ用にファイルを開く類
    - save_and_open_screenshot
    - letter_opener
    - bundle open
    - Mac だと遅い
    - Linux のときにコンテナ内から作ったものの
    Permission と Owner
    - エディタも on docker であるべき?
    - docker-linter-rubocop が雑
    困りごとはまだまだ

    View Slide

  167. 俺達の戦いは
    まだ始まったばかり

    View Slide

  168. 第四部

    View Slide

  169. この発表で
    伝えたかった
    こと

    View Slide

  170. Docker を
    本番で使う
    事例をよく聞く
    ようになった

    View Slide

  171. わりと
    なんとかなる

    View Slide

  172. 開発環境
    どうですか

    View Slide

  173. Docker
    ありますか

    View Slide

  174. Docker
    “だけ”あれば
    いいですか

    View Slide

  175. “XXさんのところで
    だけ再現する”

    View Slide

  176. “マシンセットアップ”

    View Slide

  177. やめたい

    View Slide

  178. すべての環境に

    View Slide

  179. Docker あれ!

    View Slide

  180. Docker
    “だけ” あれ!

    View Slide

  181. Credits
    Background pattern from subtlepatterns.com
    Emoji provided free by Emoji One

    View Slide

  182. end

    View Slide