Docker 第一个Hello word

实验所用系统 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
redis-master挂载目录
#修改内容
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
redis启动成功

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

  • 2.1 查看redis-slave1挂载
#查看容器挂载目录
docker inspect --format "{{ .Config.Volumes }}" redis-slave1
#查看主机挂载目录
docker inspect redis-slave1 | grep Source
#修改内容
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"
Master 插入查询数据
  • 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"

Slave 查询数据

测试结果,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+="<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容器内启动应用
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的页面内容

HAProxy轮询至APP1
HAProxy轮询至APP2
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容

  • Docker — 云时代的程序分发方式 要说最近一年云计算业界有什么大事件?Google Compute Engi...
    ahohoho阅读 15,418评论 15 147
  • 转载自 http://blog.opskumu.com/docker.html 一、Docker 简介 Docke...
    极客圈阅读 10,404评论 0 120
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,100评论 18 139
  • 我不知道今天怎么了,我会一直想起那个人,让我伤过的人,也许这时的事情,他会教我怎么做,并且怎么做好,害怕依赖他,他...
    小宜香不香阅读 166评论 0 1
  • 不要把对不起,变成来不及 不管是欠别人,还是欠自己,你曾欠下过多少个“对不起”? 时间无情第一,它才不在乎你是否还...
    吞大象的蛇阅读 1,463评论 0 0