用docker toolBox 搭建 nginx + flask + redis 环境
本篇博客,主要是了解一下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 环境的更多相关文章
- 在阿里云 ECS 搭建 nginx https nodejs 环境(三、nodejs)
在阿里云 ECS 搭建 nginx https nodejs 环境(三.nodejs) 在阿里云 ECS 搭建 nginx https nodejs 环境(三.nodejs) 第一步 指定版本源 执行 ...
- 在阿里云 ECS 搭建 nginx https nodejs 环境(二、https)
在阿里云 ECS 搭建 nginx https nodejs 环境(二) 这次主要内容是 如何在 ubuntu 的nginx 下配置 二级域名. 一. 域名解析 首先你需要去到你的 域名服务商那边 进 ...
- windows下搭建nginx+php开发环境
windows下搭建nginx+php开发环境 1.前言 windows下大多我们都是下载使用集成环境,但是本地已经存在一个集成环境,但不适合项目的需求.因此准备再自己搭建一个环境. 2.准备 工具: ...
- 使用docker快速搭建nginx+php环境
在朋友的强烈推荐下,走上了docker之路.经过了繁琐的docker环境安装,看了下镜像/容器的简单使用,开始进行nginx+php环境的搭建,本文记录一下在安装过程中的笔记. 原文地址:代码汇个人博 ...
- Docker + node(koa) + nginx + mysql 开发环境搭建
什么是Docker Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然 ...
- 使用Docker快速搭建Nginx+PHP-FPM环境
下载nginx官方镜像和php-fpm镜像 docker pull nginx docker pull bitnami/php-fpm 使用php-fpm镜像开启php-fpm应用容器 docker ...
- 如何基于 Docker 快速搭建 Springboot + Mysql + Redis 项目
目录 前言 项目目录 搭建项目 1. docker安装启动mysql以及redis 1.1 安装mysql 1.2 安装redis 2. 初始化数据库 3.创建项目 4.初始化代码 4.1 全局配置文 ...
- 基于ubuntu 14搭建nginx+php+mysql环境
基于最新的Ubuntu 14.04(2014年9月)搭建nginx.php.mysql环境, 以下全部命令行操作: 1 由于需要大量的权限操作,方便起见临时提升权限,使用root账号 sudo su ...
- 【原创】运维基础之Docker(2)通过docker部署zookeeper nginx tomcat redis kibana/elasticsearch/logstash mysql kafka mesos/marathon
通过docker可以从头开始构建集群,也可以将现有集群(配置以及数据)平滑的迁移到docker部署: 1 docker部署zookeeper # usermod -G docker zookeeper ...
随机推荐
- Socket.io和Redis写Realtime App 之express初试
第一步:用npm下载express前端框架 注意事项:首先要确保已经安装了node.js和 npm 然后在项目中创建一个package.json文件,不能完全为空不写,至少要有两个大括号,不然怎么证明 ...
- swiper横向轮播--3d
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- Configure Apache Virtual Hosts - CentOS 7
Difficulty: 2Time: 15 minutes Want to host websites on your server? Using Apache? Great. This articl ...
- android模拟器genymotion安装virtualbox不能为虚拟电脑启动一个新任务
错误详情如下: Unable to load R3 module C:\Program Files\Oracle\VirtualBox/VBoxDD.DLL (VBoxDD): GetLastErro ...
- angularjs自定义指令
my-directive为指令名称,thisdata为绑定的数据 <span ng-repeat="act in move.casts" style="positi ...
- ios cordova报gap://ready 弹出框,一直弹
The iOS app was not working because there was a plugin missing: https://github.com/apache/cordova-pl ...
- ubuntu16.04安装jdk,tomcat
ubuntu16.04安装jdk,tomcat 最近装了一下tomcat,网上的教程很多,我也试了很多次,但是有一些教程关于tomcat配置是错误的,让我走上了歧途.差点重装系统,还好王总及时出手帮助 ...
- 怎么让我们自己开发的Android程序设为默认启动
怎么让我们自己开发的Android程序设为默认启动呢?其实很简单,只要在AndroidManifest.xml文件中配置一下首次启动的那个Activity即要. <activity ...
- iOS 架构模式--解密 MVC,MVP,MVVM以及VIPER架构
本文由CocoaChina译者lynulzy(社区ID)翻译 作者:Bohdan Orlov 原文:iOS Architecture Patterns 在 iOS 中使用 MVC 架构感觉很奇怪? 迁 ...
- 安装自创建的windows服务。
安装自创建的windows服务. 使用工具InstallUtil.exe进行安装和卸载创建的windows服务 安装:C:/WINDOWS/Microsoft.NET/Framework/v2.0.5 ...