之前就有聽說過 Docker, 看了他的介紹和 documents 感覺超潮的阿!
最近試著把它加入日常生活的 workflow, 結論是只有找到 database 的 usecase 比較合用...
日常 workflow
我日常生活(?)的 workflow 是在 Ubuntu 的電腦上跑 Rails + database (MySQL/Postgresql) + RSpec。我預期 Docker 可以幫我做到的是讓我可以不用裝相關的 dependencies 在我 local 的機器上,這樣好像就可以無痛切換 dependencies (像是 ruby 升級之類的),或者是可以順利地讓 local 的環境複製到 server 上。
但是這樣的 settings 必須要讓我可以輕鬆地做:
- 跑 RSpec test case
- 跑
migration
,bundle install
等等的東西
現在的解法
目前以 Rails(或其他 ruby 相關的 project)來說,bundler 好像解決了 project 之間 dependencies 的問題。然後用 Capistrano deploy 再搭配 bundler, 可以做到一鍵 deploy.
可能的施力點
這樣看起來好像沒有什麼太多的施力點可以讓 docker 來解決問題,但是我還是想了一些:
- project level dependencies (ex: 不同的 projects 需要同一個 gem 的不同版本)
- service level dependencies (ex: 不同的 projects 需要不同版本的 Postgresql / ngxin)
- 把環境加到 code 裡面一起 version control, 這樣就可以有系統地 upgrade 環境
結果
project level dependencies:
像上面提到的,這個問題 bundler 似乎就解決惹,用 Docker 的優勢好像沒有很明顯。
service level dependencies:
這個部份好像用 docker 就很不錯,目前有試著把 database 交給 docker 來管:
目前的作法是在 local 就不裝 db 了,而是直接 run 一個 Docker 的 container 當作 database, 然後再把相關的 data link 到 local 的檔案
這樣的話可以做到每個 project 有自己專屬的 database, 所以如果需要不同版本的話也可以做到。
以 Postgresql
來說,我的作法是:
- 在
$HOME/var/postgres/data
裡面放Postgresql
相關的 data - run 一個 docker container:
$ docker run --name postgres_svr -d -p 9527:5432 -v /home/mz026/var/postgres/data:/var/lib/postgresql/data postgres:9.3
這樣就可以在 0.0.0.0:9527
連到一個 Postgresql
的 server
把環境加到 code 裡面一起 version control, 這樣就可以有系統地 upgrade 環境:
這個野望後來沒有被實現 orz, 我想到的作法是在不要自己 maintain 一個 image host 又不要付錢的前提下:
- 加入一個 Dockerfile 在 source code 裡面,用這個檔案來控制 project 所需要的環境,
- deploy 的時候,在 server 的機器上 build 這個 docker image
這個作法遇到的問題就是,每次在 server 上 build 的時候,bundle install
這步要重來 orz, 所以每次根本都超慢 der。
這個問題的解法應該是只要自己 host 一個 image host (或者付錢給 docker hub),然後隨著每次的 code update, 把相關的 image update 也 check in 進去 image host。如此一來,在 deploy 的時候就只要在 server 上 pull image host 上面對應版本的 image 就好了。但是目前這個的 deployment 的作法 (Capistrano + bundler)好像也相安無事,所以等有遇到困難再來研究。
心得與感想:
感想就是這個 docker 真的是很潮阿,因為 run 起來相當的快,感覺等到有需要的時候應該會是很有力的解法。
又或者如果跳離 Rails 的環境需求的話,可能又會有更有趣的應用方式。
TODO:
要試一下用 Docker 在 continuous integration 的時候來 run test
書
然後我買了這本書 The Docker Book 但是還沒看 orz, 希望可以變成 docker 達人阿!如果有任何好用的 usecase 請告訴我!