多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > 綜合技術 > Docker-搭建簡單的應用棧

Docker-搭建簡單的應用棧

來源:程序員人生   發布時間:2017-01-10 14:35:22 閱讀次數:2967次

本文參考《Docker容器和容器云》 2.3.2章節利用棧搭建進程,對原書中出現的問題 -鏡像不斷的更新致使- 做了修改,特此說明。

系統環境

操作系統版本

$ cat /etc/issue
Debian GNU/Linux 8 \n \l

內核版本

$ uname -r
3.16.0⑷-amd64

Docker版本

 docker version
Client:
 Version:      1.12.1
 API version:  1.24
 Go version:   go1.6.3
 Git commit:   23cf638
 Built:        Thu Aug 18 05:02:53 2016
 OS/Arch:      linux/amd64

Server:
 Version:      1.12.1
 API version:  1.24
 Go version:   go1.6.3
 Git commit:   23cf638
 Built:        Thu Aug 18 05:02:53 2016
 OS/Arch:      linux/amd64

利用棧搭建

我們將搭建1個包括6個節點的Docker利用棧,其中包括1個代理節點、兩個Web利用節點、1個主數據庫節點及兩個從數據庫節點。利用棧的具體結構如圖所示:
Dokcer應用棧結構圖

獲得利用棧節點所需的鏡像

根據利用棧結構,需要從Docker Hub獲得HAProxy、Redis和Django的鏡像:

# docker pull ubuntu:14.04
# docker pull haproxy   
# docker pull redis
# docker pull django
# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
haproxy             latest              65599e2ea3f2        2 weeks ago         139.1 MB
redis               latest              0d1cbfaa41da        2 weeks ago         185 MB
ubuntu              14.04               4a725d3b3b1c        3 weeks ago         188 MB
django              latest              79d802ec2b6c        4 weeks ago         437.4 MB

利用棧節點啟動

啟動利用棧節點之前先整理利用棧節點的連接進程:

  • 啟動redis-master容器節點;
  • 兩個redis-slave容器節點啟動時連接到redis-master;
  • 兩個APP容器節點啟動時連接到redis-master;
  • HAProxy容器節點啟動時連接到兩個APP節點。

另外,為了能夠從外網訪問利用棧,并通過HAproxy節點訪問利用棧中的APP,在啟動HAProxy節點時使用-p參數將端口暴露給主機。

啟動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

啟動Gjango容器

# 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

說明:啟動每一個容器時都需分配1個終端。

容器啟動信息查看:

# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
ab25650701f0        haproxy             "/docker-entrypoint.s"   3 hours ago         Up 3 hours          0.0.0.0:6301->6301/tcp   HAProxy
ace790044e06        django              "/bin/bash"              3 hours ago         Up 3 hours                                   APP2
64963af16131        django              "/bin/bash"              3 hours ago         Up 3 hours                                   APP1
aa77330aee2a        redis               "docker-entrypoint.sh"   3 hours ago         Up 3 hours          6379/tcp                 redis-slave2
1fd72289d4f2        redis               "docker-entrypoint.sh"   3 hours ago         Up 3 hours          6379/tcp                 redis-slave1
518b41200dab        redis               "docker-entrypoint.sh"   3 hours ago         Up 3 hours          6379/tcp                 redis-master

利用棧容器節點配置

Redis Master主數據庫容器節點配置

我們知道通過volume可以在宿主機和容器之間同享數據,因此可在宿主機上創建和編輯Redis的啟動配置文件。使用docker inpect命令查看volume掛載情況:

# docker inspect -f '{{ .Mounts }}' redis-master
[{5920a23b5e230a449230bbd4807912793bbc3bab0a05ae085ff95423301f0d6c /var/lib/docker/volumes/5920a23b5e230a449230bbd4807912793bbc3bab0a05ae085ff95423301f0d6c/_data /data local  true }]

可以看出,redis-master的volume在宿主機上為目錄/var/lib/docker/volumes/5920a23b5e230a449230bbd4807912793bbc3bab0a05ae085ff95423301f0d6c/_data,在容器中為/data。
履行以下命令創建Redis的啟動配置文件redis.conf:

# cd /var/lib/docker/volumes/5920a23b5e230a449230bbd4807912793bbc3bab0a05ae085ff95423301f0d6c/_data
# cp /~/redis.conf .
# vim redis.conf

對redis主數據庫,修改以下模板文件中的幾個參數:

daemonize yes
pidfile /var/run/redis.pid

redis.conf模板下載:https://github.com/yhsong-linux/docker-redis/blob/master/redis.conf

在宿主機上創建好啟動配置文件后,切換到容器中的/data目錄,將redis.conf拷貝到履行工作目錄,然后啟動redis服務:

# cd /data 
# cp redis.conf /usr/local/bin
# cd /usr/local/bin
# redis-server redis.conf

Redis Slave從數據庫容器節點配置

與Redis Master容器節點類似,在啟動Redis Slave容器節點以后,需要查看vloume信息,并創建啟動配置文件。
對Redis從數據庫,需要修改以下幾個參數:

daemonize yes
pidfile /var/run/redis.pid
slaveof master 6379

在宿主機上創建好啟動配置文件后,切換到容器中的/data目錄,將redis.conf拷貝到履行工作目錄,然后啟動redis服務:

# cd /data 
# cp redis.conf /usr/local/bin
# cd /usr/local/bin
# redis-server redis.conf

Redis數據庫容器節點測試

在Redis Master和Redis Slave容器節點的配置和服務啟動后,可以通過啟動Redis的客戶端程序來測試數據庫
首先,在Redis Master容器內,啟動Redis的客戶端程,并存儲1個數據:

# redis-cli
127.0.0.1:6379> set master 518b
OK
127.0.0.1:6379> get master
"518b"

接著,在兩個Redis Slave容器內,分別啟動Redis的客戶端程,查詢之前在Master數據庫中存儲的數據:

# redis-cli
127.0.0.1:6379> get master
"518b"

根據響應可知,Master數據庫中的數據已同步到Slave數據庫中。至此,利用棧的數據庫部份搭建完成。

APP容器節點(Django)的配置

Django容器啟動后,需要利用Django框架,開發1個簡單的Web程序。為了訪問數據庫,需要在容器中安裝Python的Redis支持包:

# pip install redis

安裝完成后,驗證支持包是不是安裝成功:

# python
Python 3.4.5 (default, Aug 22 2016, 20:55:07) 
[GCC 4.9.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import redis
>>> print(redis.__file__)
/usr/local/lib/python3.4/site-packages/redis/__init__.py

如上面的輸出,則表示現在可使用Pythob語言調用Redis數據庫了。接下來創建Web程序。以APP1為例,進入宿主機的volume目錄對新建APP進行編輯。
在容器的volume目錄下/usr/src/app下,開始創建APP:

# cd /usr/src/app
# mkdir dockerweb
# cd dockerweb
# django-admin.py startproject redisweb
# ls
redisweb 
# cd redisweb
# ls
manage.py  redisweb
# python manager.py startapp helloworld
# ls
helloworld  manage.py  redisweb

在容器中創建APP后,切換到宿主機的volume目錄~/Projects/Django/App1下:

# cd ~/Projects/Django/App1
# ls
dockerweb

可以看到,在容器內創建的APP文件在宿主機的volume目錄下一樣可見。然后修改helloword利用的視圖文件views.py:

# cd dockerweb/redisweb/helloworld
# ls
admin.py  __init__.py  migrations  models.py  tests.py  views.py
# vim views.py

修改后的views.py文件以下:

from django.shortcuts import render
from django.http import HttpResponse

# Create your views here.
import redis

def hello(requset):
    str=redis.__file__
    str+="<br>"
    r = redis.Redis(host='db', port=6379, db=0)
    info = r.info()
    str+=("Set Hi <br>")
    r.set('Hi', 'HelloWorld-APP1')
    str+=("Get Hi: %s <br>" % r.get('Hi'))
    str+=("Redis Info: <br>")
    str+=("Key: Info Value")
    for key in info:
        str+=("%s: %s<br>" % (key, info[key]))
    return HttpResponse(str)

注意,連接Redis數據庫時,使用–link參數創建db連接來代替具體的IP地址;同理,對APP2,使用想要的db連接便可。
接下來,修改redisweb項目的配置文件setiing.py,添加新建的helloworld利用:

# cd ../redisweb
# ls
__init__.py  __pycache__  settings.py  urls.py  wsgi.py

在setting.py文件中的INSTALLED_APPS選項下添加helloworld:

# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'helloworld',
]

最后,修改redisweb項目的URL模板文件urls.py,它將設置訪問利用的URL模式,并為URL模式調用的視圖函數之間的映照表:

# vim urls.py

在url.py文件中,引入helloworld利用的hello視圖,并為hello視圖添加1個urlpatterns變量。修改后的urls.py文件以下:

from django.conf.urls import * 
from django.contrib import admin
admin.autodiscover()
from helloworld.views import hello

urlpatterns = [ 
   url(r'^admin/', include(admin.site.urls)),
   url(r'^helloworld$', hello),
]

以上修改完成后,再次進入容器,在目錄/usr/src/app/dockerweb/redisweb下生成項目:

# python manage.py makemigrations
No changes detected
# python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Rendering model states... DONE
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying sessions.0001_initial... OK

至此,所有APP1容器的配置已完成,APP2容器的配置也是一樣的進程。配置完成APP1和APP2的容器后,就完成了利用棧的APP部份的全部配置。
在啟動APP容器的Web服務器時,可以指定服務器的端口和IP地址,為了通過HAproxy容器節點接受外網所有的公共IP地址訪問,實現負載均衡,需要指定服務器的IP地址和端口。對APP1使用8001端口,而APP2使用8002端口,同時,都使用0.0.0.0地址。以APP1為例,啟動服務器的進程以下:

# python manage.py runserver 0.0.0.0:8001
# python manage.py runserver 0.0.0.0:8001
Performing system checks...

System check identified no issues (0 silenced).
September 20, 2016 - 23:16:44
Django version 1.10, using settings 'redisweb.settings'
Starting development server at http://0.0.0.0:8001/
Quit the server with CONTROL-C.

HAproxy容器節點配置

所有對利用棧的訪問均通過HAproxy負載均衡代理容器節點實現負載均衡。
首先,將HAProxy的啟動配置我呢間復制到容器中,在宿主機的volumes目錄~/Projects/HAProxy/下:

# cd ~/Projects/HAProxy/
# vim haproxy.cfg

修改后的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
    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

隨后,進入容器的volume目錄/tmp下,將Haproxy的啟動配置文件復制到HAproxy的工作目錄:

# cd /tmp
# cp haproxy.cfg /usr/local/sbin
# cd /usr/local/sbin
# ls
haproxy  haproxy-systemd-wrapper  haproxy.cfg

然后,利用配置文件啟動HAProxy代理:

# haproxy -f haproxy.cfg

利用棧訪問測試

在閱讀器中訪問http://172.17.0.7:6301/helloworld,可以看到APP1或APP2的頁面:
本地主機訪問應用棧
說明:172.17.0.7是HAProxy容器的地址。
本地測試通過后,嘗試在其他主機上通過利用棧入口地址的IP地址和6301端口訪問利用棧APP,即http://192.168.1.104:6301/helloworld,以下圖所示:
外網其他主機訪問應用棧
說明:192.168.1.104是宿主機的IP地址。

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 亚洲天堂成人在线观看 | 伊人快播 | 欧美成人亚洲国产精品 | h在线观看网站 | 国产成人精品男人免费 | free日本xxxx另类hd | 成人国产欧美精品一区二区 | tubexxxx做受88欧美| 亚洲人成77777在线播放网站不卡 | 秋霞一级黄色片 | 亚洲a级 | 国产大片www | 欧美国产日本 | 国产亚洲一区在线 | 精品无码久久久久久国产 | 久久久成人网 | 亚洲高清在线观看视频 | 中文字幕在第10页线观看 | 亚洲天堂成人在线观看 | 欧美在线视频a | 免费一区二区三区四区五区 | 91久久偷偷做嫩草影院免费 | 午夜dj在线观看免费高清视频在线观看 | 欧美办公室系列激情videos | 香蕉人人超 | 亚洲最新视频在线观看 | 国产欧美国产精品第一区 | 成人永久福利免费观看 | 日本不卡网 | 性欧美wideos| 一区二区三区四区视频 | 日本a一级片| 午夜黄视频 | 亚洲图片另类小说 | 伊人久久大香网 | 亚州天堂网| 欧美精品亚洲精品 | 久久久久久久亚洲精品 | 国产欧美精品一区二区 | 中文字幕福利视频 | 日本三线免费视频观看 |