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

原创 2016年05月10日 14:39:33

使用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 中

总结

该方案的优点在于非常容易对项目进行横向扩充,缺点在于优点复杂。

Docker Compose搭建mycat读写分离

接上篇docker-compose部署mysql主从复制,本文介绍如何搭建mycat中间件,并用mycat来做读写分离.配置文件以及文档地址:mycat-rw系统环境 docker 1.12.3 my...
  • qq457557442
  • qq457557442
  • 2017年01月04日 20:29
  • 1161

Docker-compose使用全解

一、Compose安装 在安装compose之前,要确保已经安装了docker1.3或以上版本  在Linux64位系统上安装compose: curl -L https://github....
  • u010884123
  • u010884123
  • 2017年03月02日 12:01
  • 5834

Docker-compose命令详解

语法: Define and run multi-container applications with Docker. Usage:   docker-compose [-f=...] [...
  • wanghailong041
  • wanghailong041
  • 2016年08月09日 14:16
  • 19172

项目管理:docker-compose一键安装bitnami-redmine项目管理系统

背景:随着新技术的层出不穷和业务逻辑日趋复杂,昔日的前端和后端也早已相互融合,使得软件开发任务逐渐繁重。与此同时,Git等分布式版本控制系统的出现,使得项目开发从数量上来看参与者愈来愈多,从范围上来看...
  • zssureqh
  • zssureqh
  • 2016年07月03日 21:01
  • 6059

Docker-compose使用全解

一、Compose安装在安装compose之前,要确保已经安装了docker1.3或以上版本 在Linux64位系统上安装compose: curl -L https://github.com/d...
  • zhiaini06
  • zhiaini06
  • 2015年04月26日 13:15
  • 37089

Docker Compose的网络设置

Docker Compose的网络相关内容的介绍。
  • gezhonglei2007
  • gezhonglei2007
  • 2016年06月10日 17:19
  • 9487

Docker Compose—简化复杂应用的利器

Docker Compose—简化复杂应用的利器 Compose是用于定义和运行复杂Docker应用的工具。你可以在一个文件中定义一个多容器的应用,然后使用一条命令来启动你的应用,然后所有相关的...
  • samxx8
  • samxx8
  • 2015年08月28日 05:53
  • 2869

使用Compose变量定制Docker网络

用Compose这个组件来给Docker容器设置网络!
  • sisiy2015
  • sisiy2015
  • 2015年12月25日 11:09
  • 936

Docker - 使用 compose 编排服务

入门示例 一般步骤 1、定义Dockerfile,方便迁移到任何地方; 2、编写docker-compose.yml文件; 3、运行docker-compose up启动服务 示例 准备工...
  • u011537073
  • u011537073
  • 2017年03月24日 00:45
  • 2410

Docker学习笔记4: Docker-Compose—简化复杂容器应用的利器

本文转载自http://www.tuicool.com/articles/AnIVJn. 因Python语言,个人也没学过,不是太熟悉,这篇文章的格式让我走了好多坑,不过还是要感谢原文作者。在Cent...
  • yulei_qq
  • yulei_qq
  • 2016年10月31日 22:20
  • 4823
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用docker-compose搭建可以扩展的Web Application
举报原因:
原因补充:

(最多只允许输入30个字)