使用docker-compose搭建可以擴展的Web Application

使用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
  1. nginx需要使用volumes
    /var/run/docker.sock:/tmp/docker.sock:ro

啓動項目

  1. 運行 docker-compose up -d
  2. scale項目 docker-compose scale web=5
  3. 查看系統信息 docker-compose ps
  4. 瀏覽器訪問 http://yourwebsite

補充說明

如果要按照上面的代碼實踐的話,一般不會成功。因爲還缺少一些必要的條件:本地的nginx 做反向代理 和修改 本地 /etc/hosts 文件,將web地址指向docker. 這裏就不在詳細說明了。 具體的架構圖如下:

這裏寫圖片描述

其中 nginx 是在 host 機上, nginx-proxy 在 docker 中

總結

該方案的優點在於非常容易對項目進行橫向擴充,缺點在於優點複雜。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章