中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2022-05-20 15:12:13 來源:億速云 閱讀:169 作者:iii 欄目:大數據

本篇內容介紹了“Docker怎么搭建簡單的應用棧與容器Hello World訪問”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

系統環境

操作系統版本

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

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

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

根據應用棧結構,需要從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

應用棧容器節點互聯

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 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模板下載:

在宿主機上創建好啟動配置文件后,切換到容器中的/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的客戶端程,并存儲一個數據:

# 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框架,開發一個簡單的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視圖添加一個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的頁面(本地主機訪問應用棧):

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

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

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

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

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

“Docker怎么搭建簡單的應用棧與容器Hello World訪問”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

永德县| 南城县| 扶风县| 顺昌县| 广南县| 裕民县| 安福县| 孝义市| 伽师县| 泰顺县| 新平| 辽宁省| 沐川县| 阿图什市| 绵竹市| 托克逊县| 集安市| 北安市| 泰安市| 吴川市| 黄冈市| 冷水江市| 揭西县| 乌兰县| 阜城县| 滦平县| 安宁市| 濮阳市| 如东县| 都兰县| 东明县| 朔州市| 武安市| 远安县| 张掖市| 贵阳市| 怀安县| 东平县| 册亨县| 丰镇市| 阿城市|