本篇博客,主要是了解一下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. Socket.io和Redis写Realtime App 之express初试

    第一步:用npm下载express前端框架 注意事项:首先要确保已经安装了node.js和 npm 然后在项目中创建一个package.json文件,不能完全为空不写,至少要有两个大括号,不然怎么证明 ...

  2. swiper横向轮播--3d

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  3. Configure Apache Virtual Hosts - CentOS 7

    Difficulty: 2Time: 15 minutes Want to host websites on your server? Using Apache? Great. This articl ...

  4. android模拟器genymotion安装virtualbox不能为虚拟电脑启动一个新任务

    错误详情如下: Unable to load R3 module C:\Program Files\Oracle\VirtualBox/VBoxDD.DLL (VBoxDD): GetLastErro ...

  5. angularjs自定义指令

    my-directive为指令名称,thisdata为绑定的数据 <span ng-repeat="act in move.casts" style="positi ...

  6. ios cordova报gap://ready 弹出框,一直弹

    The iOS app was not working because there was a plugin missing: https://github.com/apache/cordova-pl ...

  7. ubuntu16.04安装jdk,tomcat

    ubuntu16.04安装jdk,tomcat 最近装了一下tomcat,网上的教程很多,我也试了很多次,但是有一些教程关于tomcat配置是错误的,让我走上了歧途.差点重装系统,还好王总及时出手帮助 ...

  8. 怎么让我们自己开发的Android程序设为默认启动

    怎么让我们自己开发的Android程序设为默认启动呢?其实很简单,只要在AndroidManifest.xml文件中配置一下首次启动的那个Activity即要. <activity        ...

  9. iOS 架构模式--解密 MVC,MVP,MVVM以及VIPER架构

    本文由CocoaChina译者lynulzy(社区ID)翻译 作者:Bohdan Orlov 原文:iOS Architecture Patterns 在 iOS 中使用 MVC 架构感觉很奇怪? 迁 ...

  10. 安装自创建的windows服务。

    安装自创建的windows服务. 使用工具InstallUtil.exe进行安装和卸载创建的windows服务 安装:C:/WINDOWS/Microsoft.NET/Framework/v2.0.5 ...