使用docker-compose搭建可以擴展的Web Application
這是一次使用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.0
gem 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/bash
ruby -rubygems app.rb
新建構建文件 Dockerfile
FROM xudonghe/sinatra:v2
EXPOSE 4567
COPY . /app
WORKDIR /app
RUN chmod a+x ./start.sh
CMD ["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=yourwebsiteurl
nginx:
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 做反向代理 和修改 本地 /etc/hosts 文件,將web地址指向docker. 這裏就不在詳細說明了。 具體的架構圖如下:
其中 nginx
是在 host 機上, nginx-proxy
在 docker 中
總結
該方案的優點在於非常容易對項目進行橫向擴充,缺點在於優點複雜。