這篇文章將為大家詳細講解有關Docker如何搭建簡單的應用棧與容器Hello World訪問,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
創(chuàng)新互聯(lián)公司專注于壽光企業(yè)網(wǎng)站建設,成都響應式網(wǎng)站建設,成都做商城網(wǎng)站。壽光網(wǎng)站建設公司,為壽光等地區(qū)提供建站服務。全流程按需設計,專業(yè)設計,全程項目跟蹤,創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務系統(tǒng)環(huán)境
操作系統(tǒng)版本
$ cat /etc/issue Debian GNU/Linux 8 \n \l
內核版本
$ 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
應用棧搭建
我們將搭建一個包含6個節(jié)點的Docker應用棧,其中包括一個代理節(jié)點、兩個Web應用節(jié)點、一個主數(shù)據(jù)庫節(jié)點及兩個從數(shù)據(jù)庫節(jié)點。應用棧的具體結構如圖所示:
獲取應用棧節(jié)點所需的鏡像
根據(jù)應用棧結構,需要從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
應用棧容器節(jié)點互聯(lián)
docker run --link redis:redis --name console ubuntu bash
此處將在Ubuntu鏡像上啟動一個容器,并命名為console,同時將新啟動的console容器連接到名為redis的容器上。docker run 命令的 --link選項用于添加連接到一個容器。這里還使用了 --name選項為容器指定名稱。
關于Docker link用法可參考本站《Docker如何使用link建立容器之間的連接》
應用棧節(jié)點啟動
啟動應用棧節(jié)點之前先整理應用棧節(jié)點的連接過程:
啟動redis-master容器節(jié)點;
兩個redis-slave容器節(jié)點啟動時連接到redis-master;
兩個APP容器節(jié)點啟動時連接到redis-master;
HAProxy容器節(jié)點啟動時連接到兩個APP節(jié)點。
此外,為了能夠從外網(wǎng)訪問應用棧,并通過HAproxy節(jié)點訪問應用棧中的APP,在啟動HAProxy節(jié)點時使用-p參數(shù)將端口暴露給主機。
綜上,容器啟動順序為:
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 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
應用棧容器節(jié)點配置
Redis Master主數(shù)據(jù)庫容器節(jié)點配置
我們知道通過volume可以在宿主機和容器之間共享數(shù)據(jù),因此可在宿主機上創(chuàng)建和編輯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。
執(zhí)行如下命令創(chuàng)建Redis的啟動配置文件redis.conf:
# cd /var/lib/docker/volumes/5920a23b5e230a449230bbd4807912793bbc3bab0a05ae085ff95423301f0d6c/_data # cp /~/redis.conf . # vim redis.conf
對于redis主數(shù)據(jù)庫,修改如下模板文件中的幾個參數(shù):
daemonize yes pidfile /var/run/redis.pid
redis.conf模板下載:https://github.com/yhsong-linux/docker-redis/blob/master/redis.conf
在宿主機上創(chuàng)建好啟動配置文件后,切換到容器中的/data目錄,將redis.conf拷貝到執(zhí)行工作目錄,然后啟動redis服務:
# cd /data # cp redis.conf /usr/local/bin # cd /usr/local/bin # redis-server redis.conf
Redis Slave從數(shù)據(jù)庫容器節(jié)點配置
與Redis Master容器節(jié)點類似,在啟動Redis Slave容器節(jié)點之后,需要查看vloume信息,并創(chuàng)建啟動配置文件。
對于Redis從數(shù)據(jù)庫,需要修改如下幾個參數(shù):
daemonize yes pidfile /var/run/redis.pid slaveof master 6379
在宿主機上創(chuàng)建好啟動配置文件后,切換到容器中的/data目錄,將redis.conf拷貝到執(zhí)行工作目錄,然后啟動redis服務:
# cd /data # cp redis.conf /usr/local/bin # cd /usr/local/bin # redis-server redis.conf
Redis數(shù)據(jù)庫容器節(jié)點測試
在Redis Master和Redis Slave容器節(jié)點的配置和服務啟動后,可以通過啟動Redis的客戶端程序來測試數(shù)據(jù)庫。
首先,在Redis Master容器內,啟動Redis的客戶端程,并存儲一個數(shù)據(jù):
# redis-cli 127.0.0.1:6379> set master 518b OK 127.0.0.1:6379> get master "518b"
接著,在兩個Redis Slave容器內,分別啟動Redis的客戶端程,查詢之前在Master數(shù)據(jù)庫中存儲的數(shù)據(jù):
# redis-cli 127.0.0.1:6379> get master "518b"
根據(jù)響應可知,Master數(shù)據(jù)庫中的數(shù)據(jù)已經(jīng)同步到Slave數(shù)據(jù)庫中。至此,應用棧的數(shù)據(jù)庫部分搭建完成。
APP容器節(jié)點(Django)的配置
Django容器啟動后,需要利用Django框架,開發(fā)一個簡單的Web程序。為了訪問數(shù)據(jù)庫,需要在容器中安裝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
如上面的輸出,則表示現(xiàn)在可以使用Pythob語言調用Redis數(shù)據(jù)庫了。接下來創(chuàng)建Web程序。以APP1為例,進入宿主機的volume目錄對新建APP進行編輯。
在容器的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后,切換到宿主機的volume目錄~/Projects/Django/App1下:
# cd ~/Projects/Django/App1 # ls dockerweb
可以看到,在容器內創(chuàng)建的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數(shù)據(jù)庫時,使用–link參數(shù)創(chuàng)建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模式調用的視圖函數(shù)之間的映射表:
# vim urls.py
在url.py文件中,引入helloworld應用的hello視圖,并為hello視圖添加一個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容器的配置已經(jīng)完成,APP2容器的配置也是同樣的過程。配置完成APP1和APP2的容器后,就完成了應用棧的APP部分的全部配置。
在啟動APP容器的Web服務器時,可以指定服務器的端口和IP地址,為了通過HAproxy容器節(jié)點接受外網(wǎng)所有的公共IP地址訪問,實現(xiàn)負載均衡,需要指定服務器的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容器節(jié)點配置
所有對應用棧的訪問均通過HAproxy負載均衡代理容器節(jié)點實現(xiàn)負載均衡。
首先,將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,如下圖所示(外網(wǎng)其他主機訪問應用棧):
說明:192.168.1.104是宿主機的IP地址。
關于“Docker如何搭建簡單的應用棧與容器Hello World訪問”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
新聞名稱:Docker如何搭建簡單的應用棧與容器HelloWorld訪問-創(chuàng)新互聯(lián)
文章起源:http://muchs.cn/article8/dhepop.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設計、響應式網(wǎng)站、品牌網(wǎng)站設計、網(wǎng)站改版、網(wǎng)站排名、建站公司
聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內容