Docker如何搭建簡(jiǎn)單的應(yīng)用棧與容器HelloWorld訪問

這篇文章將為大家詳細(xì)講解有關(guān)Docker如何搭建簡(jiǎn)單的應(yīng)用棧與容器Hello World訪問,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

“只有客戶發(fā)展了,才有我們的生存與發(fā)展!”這是成都創(chuàng)新互聯(lián)公司的服務(wù)宗旨!把網(wǎng)站當(dāng)作互聯(lián)網(wǎng)產(chǎn)品,產(chǎn)品思維更注重全局思維、需求分析和迭代思維,在網(wǎng)站建設(shè)中就是為了建設(shè)一個(gè)不僅審美在線,而且實(shí)用性極高的網(wǎng)站。創(chuàng)新互聯(lián)對(duì)網(wǎng)站設(shè)計(jì)制作、網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、網(wǎng)站開發(fā)、網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站優(yōu)化、網(wǎng)絡(luò)推廣、探索永無(wú)止境。

系統(tǒng)環(huán)境

操作系統(tǒng)版本

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

內(nèi)核版本

$ uname -r
3.16.0-4-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

應(yīng)用棧搭建

我們將搭建一個(gè)包含6個(gè)節(jié)點(diǎn)的Docker應(yīng)用棧,其中包括一個(gè)代理節(jié)點(diǎn)、兩個(gè)Web應(yīng)用節(jié)點(diǎn)、一個(gè)主數(shù)據(jù)庫(kù)節(jié)點(diǎn)及兩個(gè)從數(shù)據(jù)庫(kù)節(jié)點(diǎn)。應(yīng)用棧的具體結(jié)構(gòu)如圖所示:

Docker如何搭建簡(jiǎn)單的應(yīng)用棧與容器Hello World訪問

獲取應(yīng)用棧節(jié)點(diǎn)所需的鏡像

根據(jù)應(yīng)用棧結(jié)構(gòu),需要從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

應(yīng)用棧容器節(jié)點(diǎn)互聯(lián)

docker run --link redis:redis --name console ubuntu bash

此處將在Ubuntu鏡像上啟動(dòng)一個(gè)容器,并命名為console,同時(shí)將新啟動(dòng)的console容器連接到名為redis的容器上。docker run 命令的 --link選項(xiàng)用于添加連接到一個(gè)容器。這里還使用了 --name選項(xiàng)為容器指定名稱。

關(guān)于Docker link用法可參考本站《Docker如何使用link建立容器之間的連接》

應(yīng)用棧節(jié)點(diǎn)啟動(dòng)

啟動(dòng)應(yīng)用棧節(jié)點(diǎn)之前先整理應(yīng)用棧節(jié)點(diǎn)的連接過程:

  • 啟動(dòng)redis-master容器節(jié)點(diǎn);

  • 兩個(gè)redis-slave容器節(jié)點(diǎn)啟動(dòng)時(shí)連接到redis-master;

  • 兩個(gè)APP容器節(jié)點(diǎn)啟動(dòng)時(shí)連接到redis-master;

  • HAProxy容器節(jié)點(diǎn)啟動(dòng)時(shí)連接到兩個(gè)APP節(jié)點(diǎn)。

此外,為了能夠從外網(wǎng)訪問應(yīng)用棧,并通過HAproxy節(jié)點(diǎn)訪問應(yīng)用棧中的APP,在啟動(dòng)HAProxy節(jié)點(diǎn)時(shí)使用-p參數(shù)將端口暴露給主機(jī)。

綜上,容器啟動(dòng)順序?yàn)椋?/p>

redis-master -》redis slave -》APP -》HAProxy

啟動(dòng)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

啟動(dòng)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

啟動(dòng)HAproxy容器

# docker run -it --name HAProxy --link APP1:APP1 --link APP2:APP2 -p 6301:6301 -v ~/Projects/HAProxy:tmp haproxy /bin/bash

說(shuō)明:?jiǎn)?dòng)每個(gè)容器時(shí)都需分配一個(gè)終端。

容器啟動(dòng)信息查看:

# 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

應(yīng)用棧容器節(jié)點(diǎn)配置

Redis Master主數(shù)據(jù)庫(kù)容器節(jié)點(diǎn)配置

我們知道通過volume可以在宿主機(jī)和容器之間共享數(shù)據(jù),因此可在宿主機(jī)上創(chuàng)建和編輯Redis的啟動(dòng)配置文件。使用docker inpect命令查看volume掛載情況:

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

可以看出,redis-master的volume在宿主機(jī)上為目錄/var/lib/docker/volumes/5920a23b5e230a449230bbd4807912793bbc3bab0a05ae085ff95423301f0d6c/_data,在容器中為/data。

執(zhí)行如下命令創(chuàng)建Redis的啟動(dòng)配置文件redis.conf:

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

對(duì)于redis主數(shù)據(jù)庫(kù),修改如下模板文件中的幾個(gè)參數(shù):

daemonize yes
pidfile /var/run/redis.pid

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

在宿主機(jī)上創(chuàng)建好啟動(dòng)配置文件后,切換到容器中的/data目錄,將redis.conf拷貝到執(zhí)行工作目錄,然后啟動(dòng)redis服務(wù):

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

Redis Slave從數(shù)據(jù)庫(kù)容器節(jié)點(diǎn)配置

與Redis Master容器節(jié)點(diǎn)類似,在啟動(dòng)Redis Slave容器節(jié)點(diǎn)之后,需要查看vloume信息,并創(chuàng)建啟動(dòng)配置文件。

對(duì)于Redis從數(shù)據(jù)庫(kù),需要修改如下幾個(gè)參數(shù):

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

在宿主機(jī)上創(chuàng)建好啟動(dòng)配置文件后,切換到容器中的/data目錄,將redis.conf拷貝到執(zhí)行工作目錄,然后啟動(dòng)redis服務(wù):

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

Redis數(shù)據(jù)庫(kù)容器節(jié)點(diǎn)測(cè)試

在Redis Master和Redis Slave容器節(jié)點(diǎn)的配置和服務(wù)啟動(dòng)后,可以通過啟動(dòng)Redis的客戶端程序來(lái)測(cè)試數(shù)據(jù)庫(kù)。

首先,在Redis Master容器內(nèi),啟動(dòng)Redis的客戶端程,并存儲(chǔ)一個(gè)數(shù)據(jù):

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

接著,在兩個(gè)Redis Slave容器內(nèi),分別啟動(dòng)Redis的客戶端程,查詢之前在Master數(shù)據(jù)庫(kù)中存儲(chǔ)的數(shù)據(jù):

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

根據(jù)響應(yīng)可知,Master數(shù)據(jù)庫(kù)中的數(shù)據(jù)已經(jīng)同步到Slave數(shù)據(jù)庫(kù)中。至此,應(yīng)用棧的數(shù)據(jù)庫(kù)部分搭建完成。

APP容器節(jié)點(diǎn)(Django)的配置

Django容器啟動(dòng)后,需要利用Django框架,開發(fā)一個(gè)簡(jiǎn)單的Web程序。為了訪問數(shù)據(jù)庫(kù),需要在容器中安裝Python的Redis支持包:

# pip install redis

安裝完成后,驗(yàn)證支持包是否安裝成功:

# 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

如上面的輸出,則表示現(xiàn)在可以使用Pythob語(yǔ)言調(diào)用Redis數(shù)據(jù)庫(kù)了。接下來(lái)創(chuàng)建Web程序。以APP1為例,進(jìn)入宿主機(jī)的volume目錄對(duì)新建APP進(jìn)行編輯。

在容器的volume目錄下/usr/src/app下,開始創(chuàng)建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

在容器中創(chuàng)建APP后,切換到宿主機(jī)的volume目錄~/Projects/Django/App1下:

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

可以看到,在容器內(nèi)創(chuàng)建的APP文件在宿主機(jī)的volume目錄下同樣可見。然后修改helloword應(yīng)用的視圖文件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數(shù)據(jù)庫(kù)時(shí),使用–link參數(shù)創(chuàng)建db連接來(lái)代替具體的IP地址;同理,對(duì)于APP2,使用想要的db連接即可。

接下來(lái),修改redisweb項(xiàng)目的配置文件setiing.py,添加新建的helloworld應(yīng)用:

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

在setting.py文件中的INSTALLED_APPS選項(xiàng)下添加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項(xiàng)目的URL模板文件urls.py,它將設(shè)置訪問應(yīng)用的URL模式,并為URL模式調(diào)用的視圖函數(shù)之間的映射表:

# vim urls.py

在url.py文件中,引入helloworld應(yīng)用的hello視圖,并為hello視圖添加一個(gè)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),
]

以上修改完成后,再次進(jìn)入容器,在目錄/usr/src/app/dockerweb/redisweb下生成項(xiàng)目:

# 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容器的配置已經(jīng)完成,APP2容器的配置也是同樣的過程。配置完成APP1和APP2的容器后,就完成了應(yīng)用棧的APP部分的全部配置。

在啟動(dòng)APP容器的Web服務(wù)器時(shí),可以指定服務(wù)器的端口和IP地址,為了通過HAproxy容器節(jié)點(diǎn)接受外網(wǎng)所有的公共IP地址訪問,實(shí)現(xiàn)負(fù)載均衡,需要指定服務(wù)器的IP地址和端口。對(duì)于APP1使用8001端口,而APP2使用8002端口,同時(shí),都使用0.0.0.0地址。以APP1為例,啟動(dòng)服務(wù)器的過程如下:

# 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容器節(jié)點(diǎn)配置

所有對(duì)應(yīng)用棧的訪問均通過HAproxy負(fù)載均衡代理容器節(jié)點(diǎn)實(shí)現(xiàn)負(fù)載均衡。
首先,將HAProxy的啟動(dòng)配置我呢間復(fù)制到容器中,在宿主機(jī)的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

隨后,進(jìn)入容器的volume目錄/tmp下,將Haproxy的啟動(dòng)配置文件復(fù)制到HAproxy的工作目錄:

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

然后,利用配置文件啟動(dòng)HAProxy代理:

# haproxy -f haproxy.cfg

應(yīng)用棧訪問測(cè)試

在瀏覽器中訪問http://172.17.0.7:6301/helloworld,可以看到APP1或APP2的頁(yè)面(本地主機(jī)訪問應(yīng)用棧):

Docker如何搭建簡(jiǎn)單的應(yīng)用棧與容器Hello World訪問

說(shuō)明:172.17.0.7是HAProxy容器的地址。

本地測(cè)試通過后,嘗試在其他主機(jī)上通過應(yīng)用棧入口地址的IP地址和6301端口訪問應(yīng)用棧APP,即http://192.168.1.104:6301/helloworld,如下圖所示(外網(wǎng)其他主機(jī)訪問應(yīng)用棧):

Docker如何搭建簡(jiǎn)單的應(yīng)用棧與容器Hello World訪問

說(shuō)明:192.168.1.104是宿主機(jī)的IP地址。

關(guān)于“Docker如何搭建簡(jiǎn)單的應(yīng)用棧與容器Hello World訪問”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

標(biāo)題名稱:Docker如何搭建簡(jiǎn)單的應(yīng)用棧與容器HelloWorld訪問
轉(zhuǎn)載源于:http://bm7419.com/article48/jdjcep.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT電子商務(wù)、定制開發(fā)、網(wǎng)站維護(hù)、做網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)