您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“Docker怎么搭建簡單的應(yīng)用棧與容器Hello World訪問”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)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ù)庫節(jié)點(diǎn)及兩個(gè)從數(shù)據(jù)庫節(jié)點(diǎn)。應(yīng)用棧的具體結(jié)構(gòu)如圖所示:
獲取應(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
說明:啟動(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ù)庫容器節(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ù)庫,修改如下模板文件中的幾個(gè)參數(shù):
daemonize yes pidfile /var/run/redis.pid
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ù)庫容器節(jié)點(diǎn)配置
與redis master容器節(jié)點(diǎn)類似,在啟動(dòng)redis slave容器節(jié)點(diǎn)之后,需要查看vloume信息,并創(chuàng)建啟動(dòng)配置文件。
對(duì)于redis從數(shù)據(jù)庫,需要修改如下幾個(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ù)庫容器節(jié)點(diǎn)測(cè)試
在redis master和redis slave容器節(jié)點(diǎn)的配置和服務(wù)啟動(dòng)后,可以通過啟動(dòng)redis的客戶端程序來測(cè)試數(shù)據(jù)庫。
首先,在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ù)庫中存儲(chǔ)的數(shù)據(jù):
# redis-cli 127.0.0.1:6379> get master "518b"
根據(jù)響應(yīng)可知,master數(shù)據(jù)庫中的數(shù)據(jù)已經(jīng)同步到slave數(shù)據(jù)庫中。至此,應(yīng)用棧的數(shù)據(jù)庫部分搭建完成。
app容器節(jié)點(diǎn)(django)的配置
django容器啟動(dòng)后,需要利用django框架,開發(fā)一個(gè)簡單的web程序。為了訪問數(shù)據(jù)庫,需要在容器中安裝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語言調(diào)用redis數(shù)據(jù)庫了。接下來創(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ù)庫時(shí),使用–link參數(shù)創(chuàng)建db連接來代替具體的ip地址;同理,對(duì)于app2,使用想要的db連接即可。
接下來,修改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的頁面(本地主機(jī)訪問應(yīng)用棧):
說明: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)用棧):
說明:192.168.1.104是宿主機(jī)的ip地址。
“Docker怎么搭建簡單的應(yīng)用棧與容器Hello World訪問”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。