(株)永和システムマネジメント@mtsmfm松島 史秋シュッと学ぶDocker
View Slide
松島 史秋GitHub, Twitter@mtsmfm
興味あるもの- Docker- GraphQL
https://www.meetup.com/ja-JP/GraphQL-Tokyo/
勢いで作った
217
大事なことは最初に
百聞は一見に如かず
$ docker run \hello-world
習うより慣れろ
想定読者- Docker コマンドを叩いたことがない- Git はわかる
1. Docker とは2. なぜ必要か3. 初手の使いどころ
Docker とは
雑に言うと
/ 以下全ファイルを$ git commit
そのファイルだけの世界で指定したコマンドを実行
hello-world という名前のGit リポジトリからリポジトリに設定されたデフォルトのコマンド(/hello) を実行する
そのファイルだけの世界を見てみる
hello-world リポジトリについてのメタ情報コミット
コミットの中身 (/以下の全て)
/hello だけ
ほんとに?
Git リポジトリを見に行こう
https://hub.docker.com/_/hello-world/
Dockerfile
~= git commit の手順書
https://github.com/docker-library/hello-world/blob/bdee60d7ff6b98037657dc34a10e9ca4ffd6785f/hello-world/Dockerfilegit inithello というファイルを/ 以下に置いてコミットデフォルトのコマンドの設定
たしかに /helloだけっぽい
hello-world という名前のGit リポジトリから/hello を実行する
bash どころかls すらない
ubuntu を見てみる
https://github.com/tianon/docker-brew-ubuntu-core/blob/fb06b03251856d9a3c143332398512b3895e33b6/xenial/Dockerfilegit init配布されているUbuntu のファイルを展開してまるっとコミットrm, sed, mkdir などコマンドを実行して起きたファイルの変更をコミット
https://github.com/tianon/docker-brew-ubuntu-core/blob/fb06b03251856d9a3c143332398512b3895e33b6/xenial/Dockerfile12345
12345
なるほど全部っぽい
作ったファイルが消えた?
おさらい
ubuntu という名前のGit リポジトリからbash を実行するubuntu という名前のGit リポジトリからbash を実行する
ubuntu という名前のGit リポジトリからbash を実行するubuntu という名前のGit リポジトリからbash を実行するどちらも一から実行
ubuntudocker run -it \ubuntu bashtouch hogels hogedocker run -it \ubuntu bash
ubuntudocker run -it \ubuntu bashtouch hogels hogedocker run -it \ubuntu bashImageContainer
なぜ Docker が必要か
https://www.docker.com/what-docker
”俺のマシンでは動いたよ”問題を無くす
- Ruby はどこにどうやってインストールされている?- 他に入っているものは?- ディレクトリ構成は?- 実行ユーザは?
しれっとあったりする依存
$ rails db:structure:load
https://github.com/rails/rails/blob/f73b845610931ddf03c756d804982776a3cc69a4/activerecord/lib/active_record/tasks/postgresql_database_tasks.rb#L80psql コマンドに依存している
プロジェクトでバージョン揃ってる?
アプリケーションサーバを動かすまで
1. 手元のマシンで開発する2. 本番用のマシンを用意する3. OS を入れる4. アプリケーションの動作に必要なパッケージのインストールをする5. デプロイ用のセットアップをする6. デプロイする
B.C.(BeforeContainer)
1. 手元のマシンで開発する2. 本番用のマシンを用意する3. OS を入れる4. アプリケーションの動作に必要なパッケージのインストールをする5. デプロイする物理CD職人の手作業職人の手作業
1. 手元のマシンで開発する2. 本番用のマシンを用意する3. OS を入れる4. アプリケーションの動作に必要なパッケージのインストールをする5. デプロイするIaaSOS のイメージCapistranoAnsible
こういったツールは今動いてる環境に「うまく継ぎ足す」ためのもの
ゼロから流すときと今動いているものに変更を加えるとき
全く同じになるかはわからない
特にロールバック
A.C.(AfterContainer)
1. 手元のマシンで開発する2. 本番用のマシンを用意する3. OS を入れる4. アプリケーションの動作に必要なパッケージのインストールをする5. デプロイするIaaSDocker が動く何かDocker のクラスタ管理する何かDocker
/ 以下をまるっと入れかえるから現在の状態を気にしないで済む
/ 以下をまるっと入れかえるからロールバックも確実
Docker のImage とそれを管理する環境さえあればそれでいい
やりたいことはだいたい PaaSみたいなもの
1. 手元のマシンで開発する2. 本番用のマシンを用意する3. OS を入れる4. アプリケーションの動作に必要なパッケージのインストールをする5. デプロイするIaaSDocker が動く何かDocker のクラスタ管理する何かDockerここも Docker であるべき
開発環境はあまり Docker にやさしくない
エディタのサポートが乏しい
使いやすいところ
1. DB
DB のバージョン揃ってますか
$ docker run \-p 5432:5432 \postgres:9.6.3たったこれだけで起動する
がんばってインストールする必要などない
2. Selenium
https://groups.google.com/forum/#!topic/phantomjs/9aI5d-LDuNE
PhantomJS is dead
次はHeadless Chrome
次はHeadless Chrome普通にChrome使え
PhantomJS の何がよかったか- (capybara-webkit より) インスコが楽- ヘッドレスで邪魔にならない
PhantomJS の何がつらいか- PhantomJS でテストを通すためのハックが要るときがある
PhantomJS が一番確認されてるサポートブラウザになっている!!!
Chrome が邪魔にならずに楽に使えればそれでいいはず
$ docker run \-p 5900:5900 \selenium/standalone-chrome-debugたったこれだけで起動するmacOS だと finder からvnc://localhost:5900でパスワード secret で中が見れる
https://speakerdeck.com/eileencodes/building-the-new-rails-system-test-framework?slide=48
https://github.com/mtsmfm/rails-system-test-example
Headless Chrome だと画面に描画しない分速いかもしれないが速度で優位に立てないなら微妙に違うブラウザを使う意味はない
まとめ- Docker は / 以下を git commit管理しているようなもの- Docker によって今すぐにでも楽になる部分があるよ
開発環境がやさしくないのはDocker 使うのをサボってる人が多いからとしか思えない
https://atom.io/packages/docker-linter-rubocop
https://github.com/mtsmfm/languageserver-ruby
CreditsBackground pattern from subtlepatterns.comEmoji provided free by Emoji One