Docker之应用栈搭建

    搭建一个包含`6`个节点的`Docker`应用栈,其中包括一个负载均衡代理节点、两个`Web`应用节点、一个主数据库节点及两个从数据库节点。
    会用到数据卷的知识
  • 获取镜像:

获取Django镜像

$ docker pull django

获取HAProxy镜像

$ docker pull haproxy

获取Redis镜像

$ docker pull redis

查看本地镜像列表

$ docker images

在这里插入图片描述

  • 应用容器节点间的互联,由于我们使用的为同一台宿主机,若为真正的分布式架构集群,还应处理容器的跨主机通信问题,在使用run命令创建容器时,添加--link选项,通过容器名,进行容器间安全的交互通信;
  • 容器启动顺序:
    1. 启动1redis-master容器节点;
    2. 启动2redis-slave容器节点并连接redis-master节点;
    3. 启动2Web APP容器节点并连接redis-master节点;
    4. 启动1HAProxy容器节点并连接2个Web APP节点;
      +打开之前创建好的容器
      docker start “redis-master”
      docker start “redis-slave1”
      docker start “redis-slave2”
      在这里插入图片描述

    总共打开宿主机的7个终端, 每个终端连接一个容器

     包含宿主机
     ![在这里插入图片描述](https://img-blog.csdnimg.cn/2020042216114122.png)
    

    启动redis数据库节点

    $ docker exec -it redis-master /bin/bash(或docker run -it -h="redis-master" --name redis-master redis /bin/bash)
    
    $ docker exec -it redis-slave1 /bin/bash(或$ docker run -it -h="redis-slave1" --name=redis-slave1 --link redis-master:master redis /bin/bash)
    
    $ docker exec -it redis-slave2 /bin/bash(或$ docker run -it -h="redis-slave2" --name=redis-slave2 --link redis-master:master redis /bin/bash)
    
    

启动APP节点(分别在APP1和APP2容器节点中进行)

$ docker run -it -h=“APP1” --name APP1 --link redis-master:db -v ~/Projects/Django/App1:/usr/src/app django /bin/bash

$ docker run -it -h=“APP2” --name APP2 --link redis-master:db -v ~/Projects/Django/App2:/usr/src/app django /bin/bash

启动HAProxy节点

~# docker run -it -h=“HAProxy” --name HAProxy --link APP1:APP1 --link APP2:APP2 -p 6301:6301 -v ~/Projects/HAProxy:/tmp haproxy /bin/bash
在这里插入图片描述

查看运行中的容器

$ docker ps

配置redis数据库:

适用于1.12版本及以上

配置redis数据库,在宿主机上创建redis数据库的配置文件(注意目录)

  • redis-master配置文件(直接新建即可):
$ vim redis-master.conf
daemonize yes
pidfile /var/run/redis.pid
port 6379
timeout 0
tcp-keepalive 0
databases 1
 
stop-writes-on-bgsave-error no
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /tmp/
 
maxmemory 2gb
maxmemory-policy allkeys-lru
appendonly no
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 512mb
hash-max-ziplist-entries 64
hash-max-ziplist-value 128
list-max-ziplist-entries 64
list-max-ziplist-value 128
set-max-intset-entries 64
zset-max-ziplist-entries 64
zset-max-ziplist-value 128
activerehashing yes
  • redis-slave配置文件:
$ vim redis-slave.conf
daemonize yes
pidfile /var/run/redis.pid
port 6379
slaveof redis-master 6379
timeout 0
tcp-keepalive 0
databases 1
 
stop-writes-on-bgsave-error no
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /tmp/
 
maxmemory 2gb
maxmemory-policy allkeys-lru
appendonly no
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 512mb
hash-max-ziplist-entries 64
hash-max-ziplist-value 128
list-max-ziplist-entries 64
list-max-ziplist-value 128
set-max-intset-entries 64
zset-max-ziplist-entries 64
zset-max-ziplist-value 128
activerehashing yes

获取数据卷的挂载点

$ docker inspect -f ‘{{ .Mounts }}’ redis-master
$ docker inspect -f ‘{{ .Mounts }}’ redis-slave1
$ docker inspect -f ‘{{ .Mounts }}’ redis-slave2
#示例截图
在这里插入图片描述

分别记录挂载点

形如:/var/lib/docker/volumes//_data

拷贝配置文件

$ cp redis-master.conf <redis-master的挂载点>
$ cp redis-slave.conf <redis-slave1的挂载点>
$ cp redis-slave.conf <redis-slave2的挂载点>

#示例截图
在这里插入图片描述
#将redis-master.conf 和redis-slave.conf 分别copy到容器内部(数据卷知识)

#切换到redis-master 容器中操作
在这里插入图片描述
#进入 终端 slave1 中操作
在这里插入图片描述
#进入 终端 slave2 中操作
在这里插入图片描述

配置Web APP节点

在Web APP节点上
  • 安装redis模块:
    可能会更新安装 pip install --upgrade pip

$ pip install redis

+ 测试操作:
$ python

import redis
print(redis.__file__)
exit()
  • 创建Hello-WorldAPP
$ cd /usr/src/app
$ mkdir dockerweb
$ cd dockerweb
$ django-admin.py startproject redisweb
$ cd redisweb
$ python manage.py startapp helloworld

示例截图:
在这里插入图片描述
在这里插入图片描述

进入宿主机
  • 切换目录:

    docker inspect -f ‘{{ .Mounts }}’ APP1
    cd /root/Projects/Django/APP1
    cd dockerweb/
    cd redisweb
    在这里插入图片描述
    docker inspect -f ‘{{ .Mounts }}’ APP2
    cd /root/Projects/Django/APP2
    cd dockerweb/
    cd redisweb
    在这里插入图片描述

  • 配置视图(View):

$ vim helloworld/views.py
from django.shortcuts import render
from django.http import HttpResponse
import redis


def hello(requset):
    r = redis.Redis(host='db', port=6379, db=0)
    # 在APP2节点修改为HelloWorld-APP2
    r.set('app_info', 'HelloWorld-APP1')
    app_info = bytes.decode(r.get('app_info'))
    stu_num_info = int(4321)
    info = "Hello, everyone!<br/>Get Hi: {0}<br/>Get stu_num: {1}<br/>".format(app_info, stu_num_info)
    return HttpResponse(info)
  • 更改配置文件:
$ vim redisweb/settings.py
# 文件内容
ALLOWED_HOSTS = ['*',]
INSTALLED_APPS = [
    ...
    'helloworld',
]
  • 配置url
$ vim 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),
]
Web APP节点上 两个分别都要
  • 初始化项目:root@1b787e4ab53b:/usr/src/app/dockerweb/redisweb#
    $ python manage.py makemigrations
    $ python manage.py migrate
    示例截图:
    在这里插入图片描述
    在这里插入图片描述
  • 启动服务:

APP1:

$ python manage.py runserver 0.0.0.0:8001

APP2:

$ python manage.py runserver 0.0.0.0:8002
示例截图:
在这里插入图片描述
在这里插入图片描述

配置HAProxy节点

在宿主机上
  • 切换目录:
    $ cd ~/Projects/HAProxy/
  • 创建配置文件:
$ vim haproxy.cfg
global
    log 127.0.0.1   local0
    maxconn 4096
    chroot /usr/local/sbin
    daemon
    nbproc  4
    pidfile /usr/local/sbin/haproxy.pid
 
defaults
    log     127.0.0.1   local3
    mode    http
    option  dontlognull
    option  redispatch
    retries 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
    bind-process 1
    stats uri /haproxy-stats
    stats auth phil:NRG93012
        server APP1 APP1:8001 check inter 2000 rise 2 fall 5
        server APP2 APP2:8002 check inter 2000 rise 2 fall 5

示例截图:
在这里插入图片描述

HAProxy节点
  • 切换目录:
    $ cd /tmp
  • 复制配置文件:
    $ cp haproxy.cfg /usr/local/sbin
  • 切换目录:
    $ cd /usr/local/sbin
  • 启动服务:
    $ haproxy -f haproxy.cfg

示例截图:
在这里插入图片描述

测试操作

  • 使用浏览器访问,http://<宿主机的IP地址>:<6301>/helloworld

示例截图:
在这里插入图片描述
在这里插入图片描述

  • 多次请求代理节点,HAProxy节点会自动分发请求,达到负载均衡的目的;
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

比马胡布

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值