本篇博客,主要是了解一下docker-compose的使用,docker-compose是官方给出的同时部署多个容器的解决方案;当你需要多个容器同时运行作为你的解决方案时:比如构建一个网站,需要php + apache + postgrel ,这里面的每一个组件(web server,数据库等)都是一个容器,如果自己一个一个建立,并且还要维护容器之间的互联关系的话,是一件复杂的事情;docker-compose就是来帮助我们来做这个事情的;

本文从一个简单的例子开始来介绍一下docker-compose的使用方法,本文章涉及的工程代码放在了附件中 http://files.cnblogs.com/files/yuhan-TB/docker-compose-test.tar.gz 可以下载;;

场景如下:

ngnix在最前端做负载均衡;nginx之后是三个flask web server容器,用来处理实际用户的请求;redis用来存储一些数据,flask app与redis相连来获取数据,然后根据实际情况来输出相应的消息;

我的系统是mac os,

(1) 首先安装docker toolbox工具箱,toolbox工具箱集成了很多工具,docker-compose,docker-machine,docker-client, virtualBox等等;

为啥需要virtualBox呢,因为docker是不支持mac 和 windows 的,所以要想在这两个OS上运行的话,做法是安装一个虚拟机,然后在虚拟机上启动docker,然后安装docker-client,docker-client与虚拟机中的docker engine连接;

之前mac 或 windows下的安装都是使用boot2docker,原理也是采用虚拟机实现的。从docker官方发布docker toolBox之后,就不建议使用boot2docker了。

(2) 用docker machine 建立一个虚拟机,docker-machine的作用是在本机或在云端环境建立一个docker的运行环境;以下是建立命令;

docker-machine create --driver virtualbox hehe-dev    这里面我起的虚拟机的名字是hehe-dev 呵呵~

docker-machine ls  建立好之后,可以通过ls命令来查看自己建立的虚拟机是否已经起来;

docker-machine env  hehe-dev, 接下来,通过env命令可以查看 hehe-dev 虚拟机的环境变量,对这些环境变量(就是弹出的一些export,这些export 要自己在终端中设置一下)要进行设置一下,好让docker client可以找到 docker engine的地址;

docker version,然后 docker version一下,看看docker-machine是否安装成功;

(3)接下来就是docker-compose了。

mkdir docker-compse-test    首先建立一个docker-compose的文件夹,这里我起名叫做docker-compose-test;

touch docker-compose.yml  在文件夹下建立一个yml文件;docker-compose是通过yml文件来对各个容器进行配置的;下面将我的配置贴出来:

flask_a:

restart: always

build: ./flask_a

ports:

- "5002:5000"

links:

- redis:redis

flask_b:

restart: always

build: ./flask_b

ports:

- "5003:5000"

links:

- redis:redis

flask_c:

restart: always

build: ./flask_c

ports:

- "5004:5000"

links:

- redis:redis

nginx:

restart: always

build: ./nginx

ports:

- "5001:80"

links:

- flask_a:flask_a

- flask_b:flask_b

- flask_c:flask_c

redis:

restart: always

build: ./redis

ports:

- "6379:6379"

首先是三个flask_server的实例,分别连上redis,将flask的5000端口与docker-machine虚拟机的端口进行映射,由于有三个flask实例:flask_a, flask_b,flask_c,所以分别映射端口 5002,5003,5004;

然后是nginx,nginx由于要做负载均衡,需要与三个flask server都link起来;nginx映射的虚拟机的端口是 5001;

这里在docker-compose-test文件夹下,分别建立flask_a, flask_b, flask_c, nginx, redis的文件夹,在里面分别创建Dockerfile;

为了了解一下简要的逻辑,将flask中的app代码这里列出来:

from flask import Flask,request

import os

import redis

app = Flask(__name__)

@app.route('/index', methods=['POST','GET'])

def hello_world():

request_args = {}

if request.method == 'POST':

request_args = request.form

elif request.method == 'GET':

request_args = request.args

username = request_args.get('username','')

r = redis.Redis(host=os.environ['REDIS_1_PORT_6379_TCP_ADDR'], port=6379, db=0)

if r.get(username):

return 'flask instance a: %s exists' % (username,)

else:

return 'flask instance a: %s not exists' % (username,)

if __name__ == '__main__':

app.run(debug=True,host='0.0.0.0')

就是接受用户请求的参数,去redis中去查一下用户是否存在,存在打印exists信息,不存在打印not exists信息,并且打印instance a、b或者c的消息,这个主要来判断负载均衡是不是起作用了。

dockeer-compose在build的过程中,可能会遇到两个问题:

(a)当build flask的时候的可能会遇到:

Retrying (Retry(total=4, connect=None, read=None, redirect=None)) after connection broken by 'ReadTimeoutError("HTTPSConnectionPool(host='pypi.python.org', port=443): Read timed out. (read timeout=15)",)': /simple/flask/

这个是dns的问题。解决方法是修改宿主机的 /etc/resolv.conf  在里面添加google的 nameserver

nameserver 8.8.8.8

nameserver 8.8.4.4

然后重启docker-machine docker-machine stop && docker-machine start

(b)第二个问题是,由于初次build,有些需要镜像需要从官方下载,官方的镜像有时下载很慢,这里可以使用daocloud 的官方加速工具;这里也给daocloud 打一个广告;

做法是  docker-machine ssh hehe-dev,登陆到虚拟机中,运行: curl -sSL https://get.daocloud.io/daomonit/install.sh | sh -s db634a0ee990daaf2843cdecbf843907f63825e0

这样就可以在虚拟机中,运用命令 "dao pull 镜像名:tag" 来下载镜像了,这样会很快;

(3)上面已经将整个工程启动起来了,由于flask需要访问redis,但是redis中还没有数据,需要在redis中加入要访问的数据;从上面的yml文件可以知道。redis的端口是6379;我的做法是在宿主机下载redis程序;

然后使用redis-cli 连接虚拟机上的redis,虚拟机的ip 通过 docker-machine ip hehe-dev获得,然后用redis-cli -h 虚拟机ip -p 6379连接到redis server;接着插入两条数据:

set tom 100

set harry 100

(4)最后一步就是去验证flask 是否已经起作用,通过浏览器访问 http://虚拟机ip:5001/index?username=tom ,连续访问三次,可以看到负载均衡起作用了。tom exists

然后连续访问三次 http://虚拟机ip:5001/index?username=jerry,可以看到负载均衡也起作用了。jerry not exists;

用docker toolBox 搭建 nginx + flask + redis 环境的更多相关文章

  1. 在阿里云 ECS 搭建 nginx https nodejs 环境(三、nodejs)

    在阿里云 ECS 搭建 nginx https nodejs 环境(三.nodejs) 在阿里云 ECS 搭建 nginx https nodejs 环境(三.nodejs) 第一步 指定版本源 执行 ...

  2. 在阿里云 ECS 搭建 nginx https nodejs 环境(二、https)

    在阿里云 ECS 搭建 nginx https nodejs 环境(二) 这次主要内容是 如何在 ubuntu 的nginx 下配置 二级域名. 一. 域名解析 首先你需要去到你的 域名服务商那边 进 ...

  3. windows下搭建nginx+php开发环境

    windows下搭建nginx+php开发环境 1.前言 windows下大多我们都是下载使用集成环境,但是本地已经存在一个集成环境,但不适合项目的需求.因此准备再自己搭建一个环境. 2.准备 工具: ...

  4. 使用docker快速搭建nginx+php环境

    在朋友的强烈推荐下,走上了docker之路.经过了繁琐的docker环境安装,看了下镜像/容器的简单使用,开始进行nginx+php环境的搭建,本文记录一下在安装过程中的笔记. 原文地址:代码汇个人博 ...

  5. Docker + node(koa) + nginx + mysql 开发环境搭建

    什么是Docker Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然 ...

  6. 使用Docker快速搭建Nginx+PHP-FPM环境

    下载nginx官方镜像和php-fpm镜像 docker pull nginx docker pull bitnami/php-fpm 使用php-fpm镜像开启php-fpm应用容器 docker ...

  7. 如何基于 Docker 快速搭建 Springboot + Mysql + Redis 项目

    目录 前言 项目目录 搭建项目 1. docker安装启动mysql以及redis 1.1 安装mysql 1.2 安装redis 2. 初始化数据库 3.创建项目 4.初始化代码 4.1 全局配置文 ...

  8. 基于ubuntu 14搭建nginx+php+mysql环境

    基于最新的Ubuntu 14.04(2014年9月)搭建nginx.php.mysql环境, 以下全部命令行操作: 1 由于需要大量的权限操作,方便起见临时提升权限,使用root账号 sudo su ...

  9. 【原创】运维基础之Docker(2)通过docker部署zookeeper nginx tomcat redis kibana/elasticsearch/logstash mysql kafka mesos/marathon

    通过docker可以从头开始构建集群,也可以将现有集群(配置以及数据)平滑的迁移到docker部署: 1 docker部署zookeeper # usermod -G docker zookeeper ...

随机推荐

  1. AJAX第二发

    开始总结自己在项目上的使用AJAX的情况: 该图为向后台请求的数据,前台返回的结果,返回的数据类型为object,businessObj由许多key组成,我们项目前台需要调用的数据就藏在数组recor ...

  2. php学习函数

    1defined和define区别 2.dirname(__FILE__) 3.set_include_path 4.get_include_path 5.realpath() 6.require_p ...

  3. 转网页WB.ExecWB控件打印方法

    网页WB.ExecWB控件打印方法 2010-02-01 12:48 代码: <table width="100%" cellpadding="1" on ...

  4. Android genymotion安装输入法不兼容

    genymotion 此应用与您的手机不兼容 http://blog.csdn.net/caiwenfeng_for_23/article/details/41692923

  5. Node.js EventEmitter(事件队列)

    Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列. Node.js里面的许多对象都会分发事件:一个net.Server对象会在每次有新连接时分发一个事件, 一个fs.read ...

  6. 关于链接到QQ客服的问题,原来只需要在a标签上加一串话而已呐~~~~

    <a class="btn" target=blank href=tencent://message/?uin=&Site=www.woyouli.com&M ...

  7. MSDN Library for vs 2010安装及使用(MSDN Library)

    VS2010正式版不再有单独的MSDN Library安装选项,VS2010的ISO安装光盘里已经包含有MSDN Library,只不过要手动安装,方法如下: 1.安装完VS2010后,在开始菜单中打 ...

  8. bzoj 3196: Tyvj 1730 二逼平衡树

    #include<cstdio> #include<ctime> #include<cstdlib> #include<iostream> #defin ...

  9. Android中日期函数Calendar的一些用法和注意事项

    1.月份获取时加1 Canlendar.MONTH + 1 因为使用的是罗马历,Calendar.MONTH返回的数值不是一年中月份的值,而是当前月份距离第一个月份的差值 如:当前月份为9月份,距离1 ...

  10. AnyCAD.NET C#开发CAD软件实践(一)

    免费的AnyCAD.NET发布了!俺喜欢的C#有了大展前途的机会了. 打算用这个框架搭建一套实用的CAD系统,目标是能买出去10套以上. 先看看AnyCAD.NET的自我介绍. http://www. ...