DockerDocker容器NoSQL

Docker 第一个Hello word

2017-03-31  本文已影响158人  _简_述_

实验所用系统 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.获取所需要的镜像

#需要从Docker Hub获取ubuntu、django、haproxy、redis镜像
docker pull ubuntu
docker pull django
docker pull haproxy
docker pull redis
#查看镜像
docker images 
仓库中的镜像

二、启动容器节点

在搭建第一个Hello World 应用,将在同一主机下进行,这里采用docker run 命令 的--link 选项建立容器的互联关系来实现容器间的通信。
--link name:alias
name 容器名
alias 别名

1.使用--link 选项

通过--link 选项来建立容器的连接,可方式容器在重启后ip地址变化导致的访问失效,它的原理类似于DNS服务器的域名和地址映射。当容器的ip地址发生变化时,Docker将自动维护映射关系中的ip地址。因此在启动是需要按照顺序启动

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 主数据库容器节点配置

#查看容器挂载目录
docker inspect --format "{{ .Config.Volumes }}" redis-master
#查看主机挂载目录
docker inspect redis-master | grep Source
redis-master挂载目录
#修改内容
daemonize yes
pidfile /var/run/redis_6379.pid
#进入redis-master共享目录
cd /var/lib/docker/volumes/4503836f46d5c775ed88b82556b033128df0d4c90132aa6a6206920317f46d2e/_data

#复制配置文件至共享目录
cp redis.conf ./
#进入容器
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
ps aux |grep redis
redis启动成功

2. Redis Slave 从数据库容器节点的配置

#查看容器挂载目录
docker inspect --format "{{ .Config.Volumes }}" redis-slave1
#查看主机挂载目录
docker inspect redis-slave1 | grep Source
#修改内容
daemonize yes
pidfile /var/run/redis_6379.pid
slaveof master 6379
#进入redis-slave1共享目录
cd /var/lib/docker/volumes/208cf56dd93e5e589e9110f5ab2f8f59e6bf6406d6839d5518bf10675bd78620/_data

#复制配置文件至共享目录
cp redis.conf ./
#进入容器
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
#进入Master 容器中
docker attach redis-master
#使用客户端
redis-cli 
127.0.0.1:6379> set master abcd
127.0.0.1:6379> get master
"abcd"
Master 插入查询数据
#进入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容器节点配置

#进入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

测试安装效果
#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),
]

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容器节点配置

#将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



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的页面内容

HAProxy轮询至APP1 HAProxy轮询至APP2
上一篇下一篇

猜你喜欢

热点阅读