還記得連接指令(link)嗎?html
若是你已經閱讀過 Hands-on Docker tutorial,那麼你應該已經可使用命令行連接 Docker 容器。經過命令行將 Node.js 的計數器連接到 Redis 服務器,其命令可能以下所示:前端
$ docker run -d -P --name redis1 $ docker run -d hit_counter -p 3000:3000 --link redis1:redis
如今假設你的應用程序分爲三層:linux
經過「--link」的顯式連接只是管理幾個容器是能夠的,可是可能會由於咱們嚮應用程序添加更多層或容器而失控。git
加入 docker-composegithub
Docker Compose logoweb
docker-compose 工具是標準 Docker 工具箱的一部分,也能夠單獨下載。 它提供了一組豐富的功能,經過純文本 YAML 文件配置全部應用程序的部件。redis
上面的例子看起來像這樣:docker
version: "2.0" services: redis1: image: redis hit_counter: build: ./hit_counter ports: - 3000:3000
從 Docker 1.10 開始,咱們能夠利用網絡覆蓋(network overlays)來幫助咱們在多個主機上進行擴展。 在此以前,連接僅能工做在單個主機上。 「docker-compose scale」命令能夠用來在須要時帶來更多的計算能力。
查看 docker.com 上的 docker-compose 參考數據庫
真實工做示例:Raspberry PI 庫存警示api
新的 Raspberry PI Zero v1.3 圖片,由 Pimoroni 提供
Raspberry PI Zero 嗡嗡做響 - 它是一個極小的微型計算機,具備 1GHz CPU 和 512MB RAM,能夠運行完整的Linux、Docker、Node.js、Ruby 和其餘許多流行的開源工具。 PI Zero 最好的優勢之一就是它成本只有 5 美圓。 這也意味着它銷售的速度很是之快。
原始網站:whereismypizero.com
我發現一個網頁,它使用屏幕抓取以找出 4-5 個最受歡迎的折扣網店是否有庫存。
每一次對 /public/api/ 的調用,其執行花 3 秒鐘,而使用 Apache Bench(ab),我每秒只能完成 0.25 個請求。
從新發明輪子
零售商彷佛並不介意 whereismypizero.com 抓取他們的網站的商品庫存信息,因此我開始從頭寫一個相似的工具。 我嘗試經過緩存和解耦 web 層來處理更多的抓取請求。 Redis 是執行這項工做的完美工具。 它容許我設置一個自動過時的鍵/值對(即一個簡單的緩存),還能夠經過 pub/sub 在 Node.js 進程之間傳輸消息。
復刻或者追蹤放在 github 上的代碼: alexellis/pizerostock
若是以前使用過 Node.js,你確定知道它是單線程的,而且任何 CPU 密集型任務,如解析 HTML 或 JSON 均可能致使速度放緩。一種緩解這種狀況的方法是使用一個工做進程和 Redis 消息通道做爲它和 web 層之間的鏈接組織。
version: "2.0" services: web: build: ./web/ ports: - "3000:3000" stock_fetch: build: ./stock_fetch/ redis: image: redis
一旦本地正常工做,再向 Azure 的 Ubuntu 16.04 鏡像雲部署就輕車熟路,只花了不到 5 分鐘。 我登陸、克隆倉庫並鍵入「docker compose up -d」, 這就是全部的工做 - 快速實現整個系統的原型不會比這幾個步驟更多。 任何人(包括 whereismypizero.com 的全部者)只需兩行命令就能夠部署新解決方案:
$ git clone https://github.com/alexellis/pi_zero_stock $ docker-compose up -d
更新網站很容易,只須要一個「git pull」命令,而後執行「docker-compose up -d」命令,該命令須要帶上「--build」參數。
一睹測試網站芳容
目前測試網站使用 docker-compose 部署:stockalert.alexellis.io