实验所用系统 centos 7.0
HAproxy 是负载均衡代理节点;
App 使用python 基于django的web应用访问Redis;
Reids 是非关系型数据库,它由一个数据库节点和两个从数据库节点组成。
架构图
一、安装、配置docker
1. yum安装docker
#安装dockeryum install -y docker#启动dockersystemctl start docker.servie#设置自启动systemctl enable docker
2. 使用国内镜像
由于国内访问国外镜像仓库慢,需要使用国内镜像加速
https://www.daocloud.io/
vim /lib/systemd/system/docker.service#添加ExecStart=/usr/bin/dockerd-current --registry-mirror='http://*******.m.daocloud.io'
3.获取所需要的镜像
3.1从Docker Hub获取镜像
#需要从Docker Hub获取ubuntu、django、haproxy、redis镜像docker pull ubuntu docker pull django docker pull haproxy docker pull redis
3.2查看仓库内下载的镜像
#查看镜像docker images
仓库中的镜像
二、启动容器节点
在搭建第一个Hello World 应用,将在同一主机下进行,这里采用docker run 命令 的--link 选项建立容器的互联关系来实现容器间的通信。
--link name:alias
name 容器名
alias 别名
1.使用--link 选项
通过--link 选项来建立容器的连接,可方式容器在重启后ip地址变化导致的访问失效,它的原理类似于DNS服务器的域名和地址映射。当容器的ip地址发生变化时,Docker将自动维护映射关系中的ip地址。因此在启动是需要按照顺序启动
启动redis-master容器节点
两个redis-slave容器节点启动时要连接到redis-master上
两个APP容器节点启动时要连接到redis-master上
HAProxy容器启动时要连接到两个APP节点上
2.容器按顺序启动
小提示:使用Ctrl+p+q 可以退出容器,并保持容器继续运行!
#容器启动顺序redis-master -> redis-slave-> APP ->HAProxy
#启动redis 容器docker run -it --name redis-master redis /bin/bash docker run -it --name redis-slave1 --link redis-master:master redis /bin/bash docker run -it --name redis-slave2 --link redis-master:master redis /bin/bash#启动django容器docker run -it --name APP1 --link redis-master:db -v ~/Projects/Django/App1:/usr/src/app django /bin/bash docker run -it --name APP2 --link redis-master:db -v ~/Projects/Django/App2:/usr/src/app django /bin/bash#启动HAProxy容器docker run -it --name HAProxy --link APP1:APP1 --link APP2:APP2 -p 6301:6301 -v ~/Projects/HAProxy:/tmp haproxy /bin/bash
#如图所示是全部节点启动的状态docker ps
节点启动的状态
三、应用节点的配置
1.Redis Master 主数据库容器节点配置
1.1 查看redis-master挂载
#查看容器挂载目录docker inspect --format "{{ .Config.Volumes }}" redis-master#查看主机挂载目录docker inspect redis-master | grep Source
redis-master挂载目录
1.2 修改redis.conf 配置文件
#修改内容daemonize yes pidfile /var/run/redis_6379.pid
1.3 在主机内
#进入redis-master共享目录cd /var/lib/docker/volumes/4503836f46d5c775ed88b82556b033128df0d4c90132aa6a6206920317f46d2e/_data#复制配置文件至共享目录cp redis.conf ./
1.4 在容器内
#进入容器docker attach redis-master #复制配置文件并启动cd /data cp redis.conf /usr/local/bin/redis.confcd /usr/local/bin/ redis-server redis.conf#退出容器Ctrl +p+q
1.5 查看redis 启动状态
ps aux |grep redis
redis启动成功
2. Redis Slave 从数据库容器节点的配置
2.1 查看redis-slave1挂载
#查看容器挂载目录docker inspect --format "{{ .Config.Volumes }}" redis-slave1#查看主机挂载目录docker inspect redis-slave1 | grep Source
2.2 修改redis.conf 配置文件
#修改内容daemonize yes pidfile /var/run/redis_6379.pid slaveof master 6379
2.3 在主机内
#进入redis-slave1共享目录cd /var/lib/docker/volumes/208cf56dd93e5e589e9110f5ab2f8f59e6bf6406d6839d5518bf10675bd78620/_data#复制配置文件至共享目录cp redis.conf ./
2.4 在容器内
#进入容器docker attach redis-master #复制配置文件并启动cd /data cp redis.conf /usr/local/bin/redis.confcd /usr/local/bin/ redis-server redis.conf#退出容器Ctrl +p+q
2.5 修改 redis-slave2 类似redis-slave1,这里不在重复。
2.6 Master Redis数据库容器节点测试
#进入Master 容器中docker attach redis-master#使用客户端redis-cli 127.0.0.1:6379> set master abcd127.0.0.1:6379> get master"abcd"
Master 插入查询数据
2.7 Slaver Redis数据库容器节点测试
#进入redis-slave1或redis-slave2 容器中docker attach redis-slave1 或 docker attach redis-slave2#查询先前在Master数据库中存储的数据redis-cli 127.0.0.1:6379> get master"abcd"
Slave 查询数据
测试结果,Master 数据库中的数据已经自动同步到了Slave数据库中
3.APP容器节点配置
3.1容器内创建应用
#进入APP1docker attach APP1#安装python语言的Redis支持包pip install redis#进入项目目录并创建页面appcd /usr/src/app/ mkdir dockerwebcd dockerweb django-admin.py startproject rediswebcd redisweb python manage.py startapp helloworld
测试安装效果
3.2主机内修改配置
#cd ~/Projects/Django/App1/dockerweb/redisweb/helloworld#修改views.pyfrom django.shortcuts import renderfrom django.http import HttpResponse# Create your views here.import redisdef hello(request): strs=redis.__file__ strs+="<br>" r = redis.Redis(host='db',port=6379,db=0) info =r.info() strs+=("Set Hi <br>") r.set('Hi','HelloWorld-APP1') strs+=("Get Hi: %s <br>" % r.get('Hi')) strs+=("Redis Info: <br>") strs+=("key :Info Value") for key in info: strs+=("%s:%s <br>" % (key,info[key])) return HttpResponse(strs)
#cd ~/Projects/Django/App1/dockerweb/redisweb/redisweb#修改settings.pyALLOWED_HOSTS = ['*'] INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'helloworld']
#cd ~/Projects/Django/App1/dockerweb/redisweb/redisweb#修改urls.pyfrom django.conf.urls import urlfrom django.contrib import adminfrom helloworld.views import hello urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^helloworld$',hello), ]
3.3容器内启动应用
python manage.py makemigrationspython manage.py migrate#创建管理员账户python manage.py createsuperuser#启动web应用python manage.py runserver 0.0.0.0:8001#退出容器Ctrl+p+q
启动过程
4.haproxy容器节点配置
4.1 在主机修改配置文件
#将haproxy.cfg复制在改目录下(git下载)#cd ~/Projects/HAProxy#haproxy.cfgglobal log 127.0.0.1 local2 chroot /usr/local/sbin pidfile /usr/local/sbin/haproxy.pid maxconn 4096 #user haproxy #group haproxy daemon defaults mode http log global option httplog option dontlognull option http-server-close option forwardfor except 127.0.0.0/8 option redispatch retries 3 timeout http-request 10s timeout queue 1m timeout connect 10s timeout client 1m timeout server 1m timeout http-keep-alive 10s timeout check 10s maxconn 3000 listen redis_proxy bind 0.0.0.0:6301 stats enable stats uri /haproxy-stats stats auth admin:admin #log 127.0.0.1 local0 debug server APP1 APP1:8001 check inter 2000 rise 2 fall 5 server APP2 APP2:8002 check inter 2000 rise 2 fall 5
4.2 进入容器中
cd /tmp/ cp haproxy.cfg /usr/local/sbin/cd /usr/local/sbin/#启动haproxyhaproxy -f haproxy.cfg
5.集群访问测试
整个应用部署完成后,可以进行访问测试。在浏览器访问(主机ip地址)http://192.168.153.129:6301/helloworld 可以查看到APP1和APP2的页面内容
HAProxy轮询至APP1
HAProxy轮询至APP2
作者:_简_述_
链接:https://www.jianshu.com/p/7331af461066
共同学习,写下你的评论
评论加载中...
作者其他优质文章