標籤:
使用docker-compose搭建可以擴充的Web Application
- 使用docker-compose搭建可以擴充的Web Application
- 構建 web application
- 構建一個簡單的base image
- 寫app
- 建立startsh 檔案
- 建立構建檔案 Dockerfile
- 測試容器
- 使用docker-compose編排項目
- 啟動項目
- 補充說明
- 總結
這是一次使用docker-compose搭建的可以橫向擴充的web application“架構”。說架構有點大,但整體的思路的確可以作為架構選型有參考價值。
我在這次實踐中所使用的技術棧有:
1. sinatra: 一個非常簡單的ruby的web架構
2. docker
3. docker-compose
直接進入本文
構建 web application構建一個簡單的base image
為什麼要構建一個簡單的base image? 這方便我們在構建項目的時候,統一一下環境。本次實踐構建的base image非常簡單。代碼如下
FROM ruby:2.3.0gem install sinatra
構建命令: docker build -t xudonghe/sinatra:v1 .
構建完成後,我們可以運行 docker images查看結果
寫app
第一步,建立一個簡單的app.rb 檔案
第二部,輸入如下代碼
require ‘sinatra‘set :bind, ‘0.0.0.0‘get ‘/‘ do ‘Hello world!‘end
這裡有一個值得注意的地方是,需要設定將伺服器綁定在 0.0.0.0 地址上,否則 容器外部將無法訪問。
建立start.sh 檔案
該檔案主要在於用來啟動web application
#!/bin/bashruby -rubygems app.rb
建立構建檔案 Dockerfile
FROM xudonghe/sinatra:v2EXPOSE 4567COPY . /appWORKDIR /appRUN chmod a+x ./start.shCMD ["bash", "start.sh"]
為啥繼承的是xudonghe/sinatra:v2?因為我在本地構建了一個新的版本,其實很簡單。就是開了 4567連接埠,並且將檔案複製到了容器中。在新的構建檔案中,我給start.sh 賦予了可執行許可權,並在容器啟動的時候,會運行該檔案。
測試容器
運行如下測試命令
docker build -t xudonghe/sinatra:v3 .docker run --rm -ti -P -v $(pwd):/app xudonghe/sinatra:v3 ruby -rubygems app.rb
然後在本地訪問
curl http://$(docker-machine ip):4567
使用docker-compose編排項目
整個系統中,就有兩個組件:web 和 nginx-proxy. 我選用的是 jwilder/nginx-proxy. 使用比較簡單。 先將鏡像下載到本地 : docker pull jwilder/nginx-proxy. 然後運行 docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy. 當然,如果需要使用 docker-compose , 我們就不需要這麼手動啟動。 這裡只是做一個簡單的介紹。如果需要繼續下去,需要關閉這個容器。
如下是我的docker-compose.yml檔案
web: build: . volumes: - .:/app expose: - 4567 environment: - VIRTUAL_HOST=yourwebsiteurlnginx: image: jwilder/nginx-proxy:latest links: - web volumes: - /var/run/docker.sock:/tmp/docker.sock:ro ports: - 80:80 - 443:443
此處有一個關鍵的地方
1. 環境變數要定義好 environment
environment: - VIRTUAL_HOST=yourwebsiteurl
- nginx需要使用volumes
/var/run/docker.sock:/tmp/docker.sock:ro
啟動項目
- 運行
docker-compose up -d
- scale項目
docker-compose scale web=5
- 查看系統資訊
docker-compose ps
- 瀏覽器訪問
http://yourwebsite
補充說明
如果要按照上面的代碼實踐的話,一般不會成功。因為還缺少一些必要的條件:本地的nginx 做反向 Proxy 和修改 本地 /etc/hosts 檔案,將web地址指向docker. 這裡就不在詳細說明了。 具體的架構圖如下:
其中 nginx 是在 host 機上, nginx-proxy 在 docker 中
總結
該方案的優點在於非常容易對項目進行橫向擴充,缺點在於優點複雜。
使用docker-compose搭建可以擴充的Web Application