亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 服務器 > Web服務器 > 正文

Docker搭建簡單的應用棧與容器Hello World訪問詳解

2024-09-01 13:55:07
字體:
來源:轉載
供稿:網友

本文實例講述了Docker搭建簡單的應用棧與容器Hello World訪問。分享給大家供大家參考,具體如下:

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

系統環境

操作系統版本

$ cat /etc/issueDebian GNU/Linux 8 /n /l

內核版本

$ uname -r3.16.0-4-amd64

Docker版本

 docker versionClient: 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/amd64Server: 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個節點的Docker應用棧,其中包括一個代理節點、兩個Web應用節點、一個主數據庫節點及兩個從數據庫節點。應用棧的具體結構如圖所示:

Docker,應用棧,容器

獲取應用棧節點所需的鏡像

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

# docker pull ubuntu:14.04# docker pull haproxy# docker pull redis# docker pull django# docker imagesREPOSITORY     TAG         IMAGE ID      CREATED       SIZEhaproxy       latest       65599e2ea3f2    2 weeks ago     139.1 MBredis        latest       0d1cbfaa41da    2 weeks ago     185 MBubuntu       14.04        4a725d3b3b1c    3 weeks ago     188 MBdjango       latest       79d802ec2b6c    4 weeks ago     437.4 MB

應用棧容器節點互聯

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

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

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

應用棧節點啟動

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

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

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

綜上,容器啟動順序為:

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 psCONTAINER ID    IMAGE        COMMAND         CREATED       STATUS       PORTS          NAMESab25650701f0    haproxy       "/docker-entrypoint.s"  3 hours ago     Up 3 hours     0.0.0.0:6301->6301/tcp  HAProxyace790044e06    django       "/bin/bash"       3 hours ago     Up 3 hours                  APP264963af16131    django       "/bin/bash"       3 hours ago     Up 3 hours                  APP1aa77330aee2a    redis        "docker-entrypoint.sh"  3 hours ago     Up 3 hours     6379/tcp         redis-slave21fd72289d4f2    redis        "docker-entrypoint.sh"  3 hours ago     Up 3 hours     6379/tcp         redis-slave1518b41200dab    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 yespidfile /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 yespidfile /var/run/redis.pidslaveof 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的客戶端程,并存儲一個數據:

# redis-cli127.0.0.1:6379> set master 518bOK127.0.0.1:6379> get master"518b"

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

# redis-cli127.0.0.1:6379> get master"518b"

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

APP容器節點(Django)的配置

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

# pip install redis

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

# pythonPython 3.4.5 (default, Aug 22 2016, 20:55:07)[GCC 4.9.2] on linuxType "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# lsredisweb# cd redisweb# lsmanage.py redisweb# python manager.py startapp helloworld# lshelloworld manage.py redisweb

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

# cd ~/Projects/Django/App1# lsdockerweb

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

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

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

from django.shortcuts import renderfrom django.http import HttpResponse# Create your views here.import redisdef 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 definitionINSTALLED_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視圖添加一個urlpatterns變量。修改后的urls.py文件如下:

from django.conf.urls import *from django.contrib import adminadmin.autodiscover()from helloworld.views import hellourlpatterns = [  url(r'^admin/', include(admin.site.urls)),  url(r'^helloworld$', hello),]

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

# python manage.py makemigrationsNo changes detected# python manage.py migrateOperations to perform: Apply all migrations: admin, auth, contenttypes, sessionsRunning 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:8001Performing system checks...System check identified no issues (0 silenced).September 20, 2016 - 23:16:44Django 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.piddefaults  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 50000mslisten 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# lshaproxy haproxy-systemd-wrapper haproxy.cfg

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

# haproxy -f haproxy.cfg

應用棧訪問測試

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

Docker,應用棧,容器

說明:172.17.0.7是HAProxy容器的地址。

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

Docker,應用棧,容器

說明:192.168.1.104是宿主機的IP地址。

希望本文所述對大家docker容器使用有所幫助。


注:相關教程知識閱讀請移步到服務器教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品中文在线| 久久久久久久久久久久久久久久久久av| 亚洲精品少妇网址| 亚洲一级黄色av| 亚洲第一色中文字幕| 日韩视频免费观看| 欧美日本啪啪无遮挡网站| 日韩免费av一区二区| 最近2019好看的中文字幕免费| 一区二区三区回区在观看免费视频| 欧美黄网免费在线观看| 精品少妇一区二区30p| 国模叶桐国产精品一区| 国产精品一区=区| 韩剧1988免费观看全集| 亚洲欧美日韩一区二区在线| 性色av一区二区咪爱| 高清一区二区三区日本久| 欧美性猛xxx| 亚洲人成毛片在线播放| 日韩av电影在线网| 中文字幕亚洲专区| 亚洲国模精品私拍| 欧美日韩午夜剧场| 国产视频精品在线| 久久久免费精品视频| 亚洲国产精品va在线观看黑人| 日韩av在线免费看| 日本不卡免费高清视频| 久久影视三级福利片| 欧美性猛交xxxx富婆| 国产婷婷97碰碰久久人人蜜臀| 午夜剧场成人观在线视频免费观看| 97碰碰碰免费色视频| 亚洲精品午夜精品| 国产91在线播放精品91| 久久成人精品电影| 国产亚洲一区二区在线| 日韩精品中文字| 国产精品视频成人| 国产精品女视频| 欧美性猛交xxxx免费看漫画| 日韩视频免费中文字幕| 欧美在线一区二区三区四| 91欧美日韩一区| 中文字幕欧美日韩va免费视频| 插插插亚洲综合网| 国产精品人人做人人爽| www.久久色.com| 国产在线拍偷自揄拍精品| 韩国福利视频一区| 亚洲国产精品高清久久久| 欧美在线观看视频| 欧美日韩激情视频| 亚洲国产成人91精品| 日韩av中文字幕在线免费观看| 亚洲综合成人婷婷小说| 欧美亚洲成人网| 日韩最新中文字幕电影免费看| 26uuu久久噜噜噜噜| 中文字幕亚洲精品| x99av成人免费| 国产在线拍偷自揄拍精品| 在线观看中文字幕亚洲| 国产性色av一区二区| 国产精品美乳一区二区免费| 亚洲最新视频在线| 国产精品久久久久久av福利| 精品福利樱桃av导航| 国产精品一久久香蕉国产线看观看| 欧美日韩成人精品| 日韩动漫免费观看电视剧高清| 亚洲欧美日韩国产精品| 久久久久久成人精品| 日韩欧美亚洲范冰冰与中字| 亚洲视频综合网| 久久免费观看视频| 日韩精品在线观看一区二区| 欧美性jizz18性欧美| 国产精品国产亚洲伊人久久| 在线色欧美三级视频| 欧美性猛交xxxx免费看久久久| 精品国产电影一区| 成人在线一区二区| 韩国精品美女www爽爽爽视频| 欧美肥婆姓交大片| 欧美大肥婆大肥bbbbb| 亚洲第一av网站| 91国在线精品国内播放| 亚州欧美日韩中文视频| 精品国产鲁一鲁一区二区张丽| 97视频色精品| 热re99久久精品国产66热| 96精品久久久久中文字幕| 欧美超级乱淫片喷水| 国产999在线| 136fldh精品导航福利| 在线观看视频亚洲| 亚洲欧美成人一区二区在线电影| 美日韩精品免费观看视频| 色综合男人天堂| 欧美在线一区二区视频| 久久久久久久久中文字幕| 日韩激情av在线播放| 91在线|亚洲| 亚洲精品国产精品乱码不99按摩| 亚洲人成在线一二| 色无极亚洲影院| 久久99久久99精品中文字幕| 欧美精品18videos性欧美| 色噜噜狠狠狠综合曰曰曰| 国产精品视频久久久久| 欧美亚洲午夜视频在线观看| 北条麻妃一区二区在线观看| 亚洲美女福利视频网站| 国产91免费看片| 18一19gay欧美视频网站| 亚洲精品二三区| 国产91精品黑色丝袜高跟鞋| 欧美日本精品在线| 久久久精品视频在线观看| 亚洲国产成人在线视频| 91精品国产电影| 国产丝袜视频一区| 亚洲国产精品va| 久久久久国产精品www| 久久久久久国产三级电影| 欧美洲成人男女午夜视频| 日本a级片电影一区二区| 国产黑人绿帽在线第一区| 日韩在线视频免费观看| 精品国产欧美一区二区三区成人| 久久国产加勒比精品无码| 尤物tv国产一区| 欧美裸身视频免费观看| 欧美性xxxx在线播放| 国产日韩中文在线| 亚洲夜晚福利在线观看| 在线电影av不卡网址| 国产一区二区久久精品| 亚洲影院高清在线| 精品日韩视频在线观看| 欧美野外wwwxxx| 亚洲一区二区三区在线免费观看| 欧美电影《睫毛膏》| 色综合视频一区中文字幕| 欧美国产日本在线| 97香蕉久久夜色精品国产| 成人网址在线观看| 国内精品久久久久影院优| 久久久这里只有精品视频| www.久久色.com| 日韩色av导航| 亚洲自拍小视频免费观看| 尤物精品国产第一福利三区| 日韩欧美亚洲范冰冰与中字| www.国产精品一二区| 成人国产精品免费视频| 久久精品视频在线观看| zzjj国产精品一区二区| 国产精品久久中文| 亚洲女人被黑人巨大进入al| 日韩中文字幕第一页| 亚洲成年网站在线观看|