Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
let there be (only) docker
Search
Fumiaki MATSUSHIMA
January 28, 2017
Programming
2
150
let there be (only) docker
DevLOVE199 越境CON
https://devlove.doorkeeper.jp/events/55648
Fumiaki MATSUSHIMA
January 28, 2017
Tweet
Share
More Decks by Fumiaki MATSUSHIMA
See All by Fumiaki MATSUSHIMA
Learning from performance improvements on GraphQL Ruby
mtsmfm
1
1.2k
Ruby で作る Ruby (物理)
mtsmfm
1
230
GraphQL Ruby benchmark
mtsmfm
1
850
タイムアウトにご用心 / Timeout might break application state
mtsmfm
6
2.6k
Build REST API with GraphQL Ruby
mtsmfm
0
340
GraphQL Ruby をちょっとだけ速くした / Make graphql-ruby faster a bit
mtsmfm
1
750
Gaming PC on GCP
mtsmfm
0
750
How to introduce GraphQL to an existing React-Redux application
mtsmfm
1
270
Canary release in StudySapuri
mtsmfm
0
3.1k
Other Decks in Programming
See All in Programming
スキーマ駆動で、Zod OpenAPI Honoによる、API開発するために、Hono Takibiというライブラリを作っている
nakita628
0
330
SidekiqでAIに商品説明を生成させてみた
akinko_0915
0
100
実践Claude Code:20の失敗から学ぶAIペアプログラミング
takedatakashi
18
9.2k
iOSでSVG画像を扱う
kishikawakatsumi
0
180
Pythonに漸進的に型をつける
nealle
1
140
Kotlinで実装するCPU/GPU 「協調的」パフォーマンス管理
matuyuhi
0
110
Vueのバリデーション、結局どれを選べばいい? ― 自作バリデーションの限界と、脱却までの道のり ― / Which Vue Validation Library Should We Really Use? The Limits of Self-Made Validation and How I Finally Moved On
neginasu
3
1.7k
Vue 3.6 時代のリアクティビティ最前線 〜Vapor/alien-signals の実践とパフォーマンス最適化〜
hiranuma
2
330
AkarengaLT vol.38
hashimoto_kei
1
130
テーブル定義書の構造化抽出して、生成AIでDWH分析を試してみた / devio2025tokyo
kasacchiful
0
340
CSC305 Lecture 09
javiergs
PRO
0
330
ALL CODE BASE ARE BELONG TO STUDY
uzulla
28
6.8k
Featured
See All Featured
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.2k
Large-scale JavaScript Application Architecture
addyosmani
514
110k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
9.7k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
36
6.1k
The Language of Interfaces
destraynor
162
25k
Building a Scalable Design System with Sketch
lauravandoore
463
33k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
How To Stay Up To Date on Web Technology
chriscoyier
791
250k
How STYLIGHT went responsive
nonsquared
100
5.9k
Building Applications with DynamoDB
mza
96
6.7k
Making Projects Easy
brettharned
120
6.4k
Bash Introduction
62gerente
615
210k
Transcript
(株)永和システムマネジメント @mtsmfm 松島 史秋 Docker あれ
松島 史秋 GitHub, Twitter @mtsmfm
self.inspect - 永和システムマネジメント勤務 (4年目) - Rails で Web アプリ開発 -
自社インフラの管理
None
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年分の歴史を移行
None
None
None
None
https://github.com/mtsmfm/hubot-test-helper
麻雀
http://mtsmfm.github.io/tegaki-jan
None
https://devlove.doorkeeper.jp/events/55648
開発現場における 新たな越境
None
ゲストとホスト の境界を越える
(株)永和システムマネジメント @mtsmfm 松島 史秋 Docker あれ
Docker 知ってる人? 触ったことある人? 仕事で使ってる人?
※ Docker の説明はしないので 各自調べてください
begin
目次 第一部 出会いと挫折 第二部 初仕事 第三部 本番構築 第四部 ゼロから まとめ
第一部 出会いと挫折
Heroku Docker
$ heroku plugins:install heroku-docker https://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
None
結果
“docker run うんたら どうたらかんたら...”
“こんなめんどくさいこ とするより 手元にある環境で やった方が早い”
Docker を 使うことなく 普通に手元の環境で 開発続行
None
手元で環境を 用意するのが 辛いときは Docker
https://github.com/swagger-api/swagger-codegen Java 入れるのめんどい...
None
まとめ: 慣れた環境と 同じことできないと Docker で 開発辛い
第一部 完
第二部 初仕事
self.inspect - 永和システムマネジメント勤務 (4年目) - Rails で Web アプリ開発 -
自社インフラの管理
管理するものは 減らしたい
ganeti による仮想サーバ群 お客様事情による - CI サーバ - ステージング (本番はお客様先) 社内用サービス
- Redmine - Wiki (qwik) - Git リポジトリ - IRC
ganeti による仮想サーバ群 お客様事情による - CI サーバ - ステージング (本番はお客様先) 社内用サービス
- Redmine - Wiki (qwik) - Git リポジトリ - IRC
精査すると ほぼ無くなる
ステージングも 1つだけ (しかも休止中)
ステージングの用途 - アプリケーションの動作確認 - Ansible のテスト - mina (デプロイスクリプト) の
テスト
本番は変わらない (変えられない)ので 既存のプロビジョニングツー ルはそのまま活用
手元で試せたほうが いいのでは?
Vagrant or Docker
Vagrant or Docker
ステージングも 1つだけ (しかも休止中)
現ステージングと 同等の環境ができたら docker push して 寝かせておく
Ansible on docker
ansible_connection=docker
mina on 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 実行予定のスクリプトを 出力する
None
None
playbook は ある、が...
「playbook を流す ための前提」 が不足
途中から playbook を 書き始めた?
今の環境になら 流れる
一から流すと 動かない
普段通らない handler とか...
ちょいちょい 手でやったと思われる ところがある
まとめ: 手でやり得ると 手でやってしまう 捨てやすい コンテナ便利
第二部 完
第三部 本番構築
お客様先で オンプレから AWS に移行
とりあえず 新しくできるやつは オンプレやめたい
https://aws.amazon.com/jp/ecs/
http://www.slideshare.net/AmazonWebServicesJapan/aws-black-belt-online-seminar-20 16-amazon-ec2-container-service
None
まぁそうなるよね という構成
Docker の image さえできていれば ECS で動かすのは 難しくない
Docker の image さえできていれば ECS で動かすのは 難しくない
誰がどこで build するか問題
CI サービス or 自前
自分たちで 管理するものは 減らしたい
https://circleci.com/
None
None
None
None
None
None
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 を取り出すと...
None
None
修理
代替機で開発
→
俺はあと何回 このパッケージ群を 入れるんだろう
本番 Docker なのに...
なぜかつて 挫けてしまったか
https://speakerdeck.com/takaking22/wo-hanazeyue-jing-surufalseka-yue-jing-m aindosetutotoxian-chang-gai-shan-number-devlove
逃げ道があるのが いけない!!!
Docker 縛りで 圧倒的成長
- rbenv - nodebrew - PostgreSQL etc...
None
$ ruby -v zsh: command not found: ruby
- Atom - Zsh - Git - Docker - Docker
Compose くらい
.rb の実行だって $ cat a.rb | docker run -i ruby
ruby
pry での対話的デバッグだって docker-compose.yml で tty: true stdin_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/a52f1c b3d8ade2029f048d3a3ce7893db875e162
ブログ書くときだって https://github.com/mtsmfm/mtsmfm.github.io/commit/a2200 95383a85c05ad6f55b11744867f74abf3b7
Docker 化されてない もの触るときだって https://github.com/mtsmfm/docker-rails-dev-box
Selenium 使うのとか むしろ楽だったりする https://github.com/mtsmfm/janjan/blob/3433507392ae055a5c4d4f32e74def8cd 50b11bd/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:migrate Rails 触るときに便利
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/9863 aufs な人しか起きない
Docker のバージョンと Storage Driver を 合わせた方が安心かも
最大の問題 lint
Atom の Linter plugin は どれも 手元に Linter が インストール
されている前提
Atom は プロジェクト単位での 設定を持てない
強引な解: ラッパースクリプトに direnv でパスを通す
$ 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
$ 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
https://github.com/docker/compose/pull/4059
一応動いた、が...
Atom の環境変数は 複数起動してたら 共通なのであった
そこで Talk Driven Development
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 “だけ” あれ!
Credits Background pattern from subtlepatterns.com Emoji provided free by Emoji
One
end