应用栈:Hello World
集群架构
架构——连接关系——启动顺序
Ctrl+P+Q : 退出容器而不关闭容器
redis-cli --version : 查看Redis版本
拉取各节点镜像
docker pull django
docker pull haproxy
docker pull redis
docker images # 查看镜像验证
启动各节点
# 启动redis,数据库
docker run -it --name redis-master redis /bin/bash
docker run -itd --name redis-slave1 --link redis-master:master redis /bin/bash
docker run -itd --name redis-slave2 --link redis-master:master redis /bin/bash
# 启动Django,应用
docker run -itd --name APP1 --link redis-master:db -v ~/Projects/Django/App1:/usr/src/app django /bin/bash
docker run -itd --name APP2 --link redis-master:db -v ~/Projects/Django/App2:/usr/src/app django /bin/bash
# 启动HAProxy,负载均衡,相当于F5
docker run -itd --name HAProxy --link APP1:APP1 --link APP2:APP2 -p 6301:6301 -v ~/Projects/HAProxy:/tmp haproxy /bin/bash
# 验证
docker ps
配置Redis数据库节点
主节点
docker attach redis-master # 进入主redis数据库容器节点
redis-cli --version # 查看redis的版本:7.2.4
Ctrl+P+Q # 退出容器而不关闭容器
# 在宿主机手动下载对应版本的redis
wget http://download.redis.io/releases/redis-7.2.4.tar.gz
tar xzf redis-7.2.4.tar.gz
cd redis-7.2.4
docker inspect --format "{{ .Mounts }}" redis-master # 查看redis主数据库节点的挂载目录
cp redis.conf /var/lib/docker/volumes/0fe2be50ad307e340b4ce89e9771b440d56f941069ecc760f33dc0ee48bf1417/_data/ # 拷贝redis配置文件到节点的挂载目录下
# 配置主数据库节点
cd /var/lib/docker/volumes/0fe2be50ad307e340b4ce89e9771b440d56f941069ecc760f33dc0ee48bf1417/_data/
vim redis.conf
bind 0.0.0.0 # 所有主机都可访问
protected-mode no # 取消保护模式
daemonize yes
pidfile /var/run/redis.pid
# 进入节点启动redis
docker attach redis-master
cd /data # 进入节点挂载目录
/usr/local/bin/redis-server redis.conf # 按照配置文件启动redis
# 验证redis
redis-cli ping # 返回PONG说明redis启动成功
从节点
从节点slave1,slave2与主节点master的配置过程基本相同,除了redis.conf配置文件
vim redis.conf
daemonize yes
pidfile /var/run/redis.pid
slaveof master 6379
测试
# 主
docker attach redis-master
redis-cli # 进入redis客户端
set date 20240401 # 设置数据date
get date # 获取date的值:“20240401”
# 从
docker attach redis-slave1/redis-slave2
redis-cli
get date # 返回“20240401”说明主从同步成功,否则同步失败,需要查找原因
配置Django应用节点
安装redis支持包
docker attach APP1
pip install redis
python # 进入python客户端验证
import redis
print(redis.__file__)
#/usr/local/lib/python3.4/site-packages/redis/__init__.py
创建APP:helloworld
mkdir -p /usr/src/app/dockerweb && cd $_
django-admin.py startproject redisweb # 创建项目
cd redisweb/
python manage.py startapp helloworld # 创建APP
配置APP
回到宿主机环境下配置
# 修改helloworld应用的视图文件
cd ~/Projects/Django/App1/dockerweb/redisweb/helloworld
vim views.py
views.py
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
import redis
def hello(request):
str = redis.__file__
str += "<br>"
r = redis.Redis(host='db',port=6379,db=0)
info = r.info()
str += ("Set Hi <br>")
r.set('Hi','HelloWorld-APP1') # APP2改为:HelloWorld-APP2
str += ("Get Hi: " + r.get('Hi').decode('utf-8') + "<br>")
str += ("Redis Info: <br>")
str += ("Key: Info Value <br>")
for key in info:
str += ("%s : %s <br>" % (key,info[key]))
return HttpResponse(str)
# 修改redisweb项目的配置文件setting.py
cd ../redisweb/
vim settings.py
vim urls.py
settings.py
DEBUG = True # 默认为True:适合开发,可以看到报错信息;False:适合生产,隐藏报错信息,安全
ALLOWED_HOSTS = ['124.222.49.28'] # 设置允许访问的主机IP,若允许所有,则为'*'
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'helloworld', # 添加helloworld应用
]
# 修改redisweb项目的URL模式文件urls.py
vim urls.py
urls.py
from django.conf.urls import url
from django.contrib import admin
from helloworld.views import hello
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^helloworld$',hello),
]
生成项目:helloworld
docker attach APP1
cd /usr/src/app/dockerweb/redisweb/
python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuser # 创建超级用户,输入用户名、邮箱、密码
启动APP
python manage.py runserver 0.0.0.0:8001 # 指定IP和端口启动APP1,APP2端口为8002
nohup python /usr/src/app/dockerweb/redisweb/manage.py runserver 0.0.0.0:8001 & # 优化:后台启动
配置HAProxy代理节点
编辑haproxy启动配置文件
cd ~/Projects/HAProxy/
vim haproxy.cfg
haproxy.cfg
global
log 127.0.0.1 local0 # 日志输出到本机,通过local0输出
maxconn 4096 # 最大连接数
daemon # 后台运行
pidfile /var/lib/haproxy/haproxy.pid # 存放pid文件位置
defaults
log 127.0.0.1 local3
mode http # 设置启动实例的协议类型
option dontlognull # 不记录上级负载发送过来的心跳包
option redispatch # 当服务器挂掉后,强制重定向到其他健康的服务器
retries 2 # 重试2次连接失败,就认为服务器不可用
maxconn 2000
balance roundrobin # 轮询策略转发请求
timeout connect 5000ms # 连接超时时间
timeout client 50000ms # 客户端连接超时时间
timeout server 50000ms # 服务器连接超时时间
listen redis_proxy
bind 0.0.0.0:6301 # 设置监听端口
stats enable
stats uri /haproxy-stats
server APP1 APP1:8001 check inter 2000 rise 2 fall 5 # 均衡节点
server APP2 APP2:8002 check inter 2000 rise 2 fall 5
启动HAProxy代理
docker attach HAProxy
/usr/local/sbin/haproxy -f /tmp/haproxy.cfg # -f:指定配置文件
测试应用栈
- ip//helloworld
- ip/haproxy-stats