實驗所用系統(tǒng) centos 7.0
HAproxy 是負載均衡代理節(jié)點;
App 使用python 基于django的web應用訪問Redis;
Reids 是非關系型數(shù)據(jù)庫,它由一個數(shù)據(jù)庫節(jié)點和兩個從數(shù)據(jù)庫節(jié)點組成。

架構圖
一、安裝、配置docker
1. yum安裝docker
#安裝docker
yum install -y docker
#啟動docker
systemctl start docker.servie
#設置自啟動
systemctl enable docker
2. 使用國內(nèi)鏡像
由于國內(nèi)訪問國外鏡像倉庫慢,需要使用國內(nèi)鏡像加速
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查看倉庫內(nèi)下載的鏡像
#查看鏡像
docker images

倉庫中的鏡像
二、啟動容器節(jié)點
在搭建第一個Hello World 應用,將在同一主機下進行,這里采用docker run 命令 的--link 選項建立容器的互聯(lián)關系來實現(xiàn)容器間的通信。
--link name:alias
name 容器名
alias 別名
1.使用--link 選項
通過--link 選項來建立容器的連接,可方式容器在重啟后ip地址變化導致的訪問失效,它的原理類似于DNS服務器的域名和地址映射。當容器的ip地址發(fā)生變化時,Docker將自動維護映射關系中的ip地址。因此在啟動是需要按照順序啟動
- 啟動redis-master容器節(jié)點
- 兩個redis-slave容器節(jié)點啟動時要連接到redis-master上
- 兩個APP容器節(jié)點啟動時要連接到redis-master上
- HAProxy容器啟動時要連接到兩個APP節(jié)點上
2.容器按順序啟動
小提示:使用Ctrl+p+q 可以退出容器,并保持容器繼續(xù)運行!
#容器啟動順序
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
#如圖所示是全部節(jié)點啟動的狀態(tài)
docker ps

節(jié)點啟動的狀態(tài)
三、應用節(jié)點的配置
1.Redis Master 主數(shù)據(jù)庫容器節(jié)點配置
- 1.1 查看redis-master掛載
#查看容器掛載目錄
docker inspect --format "{{ .Config.Volumes }}" redis-master
#查看主機掛載目錄
docker inspect redis-master | grep Source

redis-master掛載目錄
- 1.2 修改redis.conf 配置文件
#修改內(nèi)容
daemonize yes
pidfile /var/run/redis_6379.pid
- 1.3 在主機內(nèi)
#進入redis-master共享目錄
cd /var/lib/docker/volumes/4503836f46d5c775ed88b82556b033128df0d4c90132aa6a6206920317f46d2e/_data
#復制配置文件至共享目錄
cp redis.conf ./
- 1.4 在容器內(nèi)
#進入容器
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 啟動狀態(tài)
ps aux |grep redis

redis啟動成功
2. Redis Slave 從數(shù)據(jù)庫容器節(jié)點的配置
- 2.1 查看redis-slave1掛載
#查看容器掛載目錄
docker inspect --format "{{ .Config.Volumes }}" redis-slave1
#查看主機掛載目錄
docker inspect redis-slave1 | grep Source
- 2.2 修改redis.conf 配置文件
#修改內(nèi)容
daemonize yes
pidfile /var/run/redis_6379.pid
slaveof master 6379
- 2.3 在主機內(nèi)
#進入redis-slave1共享目錄
cd /var/lib/docker/volumes/208cf56dd93e5e589e9110f5ab2f8f59e6bf6406d6839d5518bf10675bd78620/_data
#復制配置文件至共享目錄
cp redis.conf ./
- 2.4 在容器內(nèi)
#進入容器
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數(shù)據(jù)庫容器節(jié)點測試
#進入Master 容器中
docker attach redis-master
#使用客戶端
redis-cli
127.0.0.1:6379> set master abcd
127.0.0.1:6379> get master
"abcd"

Master 插入查詢數(shù)據(jù)
- 2.7 Slaver Redis數(shù)據(jù)庫容器節(jié)點測試
#進入redis-slave1或redis-slave2 容器中
docker attach redis-slave1 或 docker attach redis-slave2
#查詢先前在Master數(shù)據(jù)庫中存儲的數(shù)據(jù)
redis-cli
127.0.0.1:6379> get master
"abcd"

Slave 查詢數(shù)據(jù)
測試結果,Master 數(shù)據(jù)庫中的數(shù)據(jù)已經(jīng)自動同步到了Slave數(shù)據(jù)庫中
3.APP容器節(jié)點配置
- 3.1容器內(nèi)創(chuàng)建應用
#進入APP1
docker attach APP1
#安裝python語言的Redis支持包
pip install redis
#進入項目目錄并創(chuàng)建頁面app
cd /usr/src/app/
mkdir dockerweb
cd dockerweb
django-admin.py startproject redisweb
cd redisweb
python manage.py startapp helloworld

測試安裝效果
- 3.2主機內(nèi)修改配置
#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+="<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.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容器內(nèi)啟動應用
python manage.py makemigrations
python manage.py migrate
#創(chuàng)建管理員賬戶
python manage.py createsuperuser
#啟動web應用
python manage.py runserver 0.0.0.0:8001
#退出容器
Ctrl+p+q

啟動過程
4.haproxy容器節(jié)點配置
- 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的頁面內(nèi)容

HAProxy輪詢至APP1

HAProxy輪詢至APP2