Docker 第一個Hello word

實驗所用系統(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掛載目錄
#修改內(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
#修改內(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
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • Docker — 云時代的程序分發(fā)方式 要說最近一年云計算業(yè)界有什么大事件?Google Compute Engi...
    ahohoho閱讀 15,850評論 15 147
  • 轉載自 http://blog.opskumu.com/docker.html 一、Docker 簡介 Docke...
    極客圈閱讀 10,755評論 0 120
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,586評論 19 139
  • 我不知道今天怎么了,我會一直想起那個人,讓我傷過的人,也許這時的事情,他會教我怎么做,并且怎么做好,害怕依賴他,他...
    小宜香不香閱讀 194評論 0 1
  • 不要把對不起,變成來不及 不管是欠別人,還是欠自己,你曾欠下過多少個“對不起”? 時間無情第一,它才不在乎你是否還...
    吞大象的蛇閱讀 1,681評論 0 0

友情鏈接更多精彩內(nèi)容