实验所用系统 centos 7.0
HAproxy 是负载均衡代理节点;
App 使用python 基于django的web应用访问Redis;
Reids 是非关系型数据库,它由一个数据库节点和两个从数据库节点组成。
一、安装、配置docker
1. yum安装docker
#安装docker
yum install -y docker
#启动docker
systemctl 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
- 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.conf
cd /usr/local/bin/
redis-server redis.conf
#退出容器
Ctrl +p+q
- 1.5 查看redis 启动状态
ps aux |grep 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.conf
cd /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 abcd
127.0.0.1:6379> get master
"abcd"
- 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"
测试结果,Master 数据库中的数据已经自动同步到了Slave数据库中
3.APP容器节点配置
- 3.1容器内创建应用
#进入APP1
docker attach APP1
#安装python语言的Redis支持包
pip install redis
#进入项目目录并创建页面app
cd /usr/src/app/
mkdir dockerweb
cd dockerweb
django-admin.py startproject redisweb
cd redisweb
python manage.py startapp helloworld
- 3.2主机内修改配置
#cd ~/Projects/Django/App1/dockerweb/redisweb/helloworld
#修改views.py
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
import redis
def hello(request):
strs=redis.__file__
strs+="
"
r = redis.Redis(host='db',port=6379,db=0)
info =r.info()
strs+=("Set Hi
")
r.set('Hi','HelloWorld-APP1')
strs+=("Get Hi: %s
" % r.get('Hi'))
strs+=("Redis Info:
")
strs+=("key :Info Value")
for key in info:
strs+=("%s:%s
" % (key,info[key]))
return HttpResponse(strs)
#cd ~/Projects/Django/App1/dockerweb/redisweb/redisweb
#修改settings.py
ALLOWED_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.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),
]
- 3.3容器内启动应用
python manage.py makemigrations
python 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.cfg
global
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/
#启动haproxy
haproxy -f haproxy.cfg
5.集群访问测试
整个应用部署完成后,可以进行访问测试。在浏览器访问(主机ip地址)http://192.168.153.129:6301/helloworld 可以查看到APP1和APP2的页面内容