搭建我的第一個Docker應(yīng)用棧

參照《Docker容器與容器云》第2.3節(jié)來搭建我的第一個Docker應(yīng)用棧。

1.獲取應(yīng)用棧各節(jié)點所需鏡像

sudo docker pull ubuntu
sudo docker pull django
sudo docker pull haproxy
sudo docker pull redis

2.應(yīng)用棧容器節(jié)點啟動

注意:在啟動每個新的容器時都分配一個終端執(zhí)行,這樣才方便后續(xù)操作


為每個容器開一個終端
# 啟動redis容器
sudo docker run -it --name redis-master redis /bin/bash
sudo docker run -it --name redis-slave1 --link redis-master:master redis /bin/bash
sudo docker run -it --name redis-slave2 --link redis-master:master redis /bin/bash

# 啟動django容器,/Projects/Django/App1(2)若無,需要自己建立
sudo docker run -it --name APP1 --link redis-master:db -v ~/Projects/Django/App1:/usr/src/app django /bin/bash
sudo docker run -it --name APP2 --link redis-master:db -v ~/Projects/Django/App2:/usr/src/app django /bin/bash

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

在新窗口查看啟動的容器信息,如下:


已啟動的容器信息

3.應(yīng)用棧容器節(jié)點的配置

3.1 redis master 主數(shù)據(jù)庫容器節(jié)點配置

容器本身是輕量化的,缺乏文本編輯工具,容器數(shù)據(jù)掛載在主機(jī)上,在主機(jī)上創(chuàng)建和編輯相關(guān)文件可以省去在容器中安裝各類編輯工具的麻煩

  • 查看容器所掛載volume的情況
    按照書中命令報錯,使用下面的命令可以成功
docker inspect --format "{{.Mounts}}" [CONTAINER ID]
查看容器所掛載volume

可以看到,該volume在主機(jī)中目錄為
"/var/lib/docker/volumes/d65f3dd6c0903303a102b1dcb122a6191e63ea89ecddd443b878b10a62f7a666/_data"
在容器中的目錄為"/data"

使用docker inspect 命令可以查看詳細(xì)信息

root@ubuntu:/# docker inspect 9a6e
[
    {
        "Id": "9a6e7ce26056de4448fd594a2ca6de45e158874bcf4d1833e0f97b38ebca4931",
        "Created": "2018-07-20T01:37:00.910970501Z",
        "Path": "docker-entrypoint.sh",
        "Args": [
            "/bin/bash"
        ],
    .......
        "Mounts": [
            {
                "Type": "volume",
                "Name": "d65f3dd6c0903303a102b1dcb122a6191e63ea89ecddd443b878b10a62f7a666",
                "Source": "/var/lib/docker/volumes/d65f3dd6c0903303a102b1dcb122a6191e63ea89ecddd443b878b10a62f7a666/_data",
                "Destination": "/data",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "GOSU_VERSION=1.10",
                "REDIS_VERSION=4.0.10",
                "REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-4.0.10.tar.gz",
                "REDIS_DOWNLOAD_SHA=1db67435a704f8d18aec9b9637b373c34aa233d65b6e174bdac4c1b161f38ca4"
            ],
        ],
    .......
        }
    }
]
  • 進(jìn)入主機(jī)volume目錄,利用啟動配置文件模板來創(chuàng)建主數(shù)據(jù)庫的啟動配置文件
    注意:若主機(jī)未安裝相應(yīng)版本redis。通過上一步docker inspect命令可以看到redis鏡像的redis版本為4.0.10,因此先下載與其兼容的redis(對應(yīng)的大版本即可),已安裝的忽略此步驟
wget http://download.redis.io/releases/redis-4.0.10.tar.gz
tar xzvf redis-4.0.10.tar.gz
cd redis-4.0.10

實例如下:

cd /var/lib/docker/volumes/<your-own-volume-id>/_data
cp <your-own-redis-dir> redis.conf
vim redis.conf
主機(jī)配置文件模板

修改以下參數(shù):
bind 0.0.0.0
daemonize yes
pidfile /var/run/redis.pid

  • 在主機(jī)創(chuàng)建好啟動配置文件后,切換到容器中的volume目錄,并復(fù)制啟動破日志文件到Redis的執(zhí)行工作目錄,然后啟動Redis服務(wù)器,如下
cp redis.conf /usr/local/bin
cd /usr/local/bin 
redis-server redis.conf
容器內(nèi)配置redis

容器內(nèi)啟動redis

3.2 redis slave從數(shù)據(jù)庫容器節(jié)點配置

  • 同上,在主節(jié)點的配置基礎(chǔ)上redis.conf多修改一個參數(shù)如下

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

配置完成后,主節(jié)點和兩個從節(jié)點/usr/local/bin目錄下都應(yīng)該有以下文件

/usr/local/bin# ls
docker-entrypoint.sh  gosu  redis-benchmark  redis-check-aof  redis-check-rdb  redis-cli  redis-sentinel  redis-server  redis.conf

3.3 redis 數(shù)據(jù)庫容器節(jié)點的測試

  • 首先,在redis-master容器內(nèi),啟動redis客戶端程序,并存儲一個數(shù)據(jù),執(zhí)行過程如下
# redis-cli        
127.0.0.1:6379> set master redis-master
OK
127.0.0.1:6379> get master
"redis-master"
  • 隨后,在兩個redis-slave容器內(nèi),分別啟動redis的客戶端程序,查詢先前在master數(shù)據(jù)庫中存儲的數(shù)據(jù),過程如下
# redis-cli        
127.0.0.1:6379> get master
"redis-master"

測試通過!

3.4 APP容器節(jié)點(Django)的配置

  • 在容器中使用pip命令安裝redis
pip install redis

發(fā)現(xiàn)一直顯示錯誤ReadTimeoutError

ReadTimeoutError報錯

后面發(fā)現(xiàn)是因為docker數(shù)據(jù)包和網(wǎng)卡默認(rèn)的數(shù)據(jù)包大小不一致導(dǎo)致的,一個是1450,一個是1500


錯誤原因分析

解決辦法:將docker的數(shù)據(jù)包大小改為1450,并重啟Docker


解決方案
  • 測試是否安裝成功
# python
Python 3.4.5 (default, Dec 14 2016, 18:54:20) 
[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
>>> 

沒有報錯,說明已經(jīng)可以使用Python語言來調(diào)用Redis數(shù)據(jù)庫

  • 創(chuàng)建Web程序
    以APP1為例,在容器啟動時,掛載了-v ~/Projects/Django/App1:/usr/src/app的volume,方便進(jìn)入主機(jī)的volume目錄來對新建APP進(jìn)行編輯。
    在容器的volume目錄/user/src/app下,開始創(chuàng)建APP,執(zhí)行過程按照書中來即可。直到 python manage.py syncdb 會報錯, 因為已經(jīng)沒有這個命令了, 需要執(zhí)行的是 python manage.py createsuperuser
python manage.py createsuperuser #設(shè)置后臺管理的用戶名 密碼 郵箱

3.5 HAProxy容器節(jié)點的配置

原書中的

listen redis_proxy 0.0.0.0:6301

改成下面的

listen redis_proxy
    bind 0.0.0.0:6301

如果修改了配置文件的內(nèi)容,需要先結(jié)束所有HAProxy進(jìn)程,并重新啟動代理。

#安裝包含killall命令的包
apt-get update 
apt-get install psmisc
killall haproxy

啟動代理

haproxy -f haproxy.cfg 

本地測試,實現(xiàn)效果如下


測試

還可以查看HAProxy后臺管理頁面


HAProxy后臺管理頁面

以上參考了下面的博客
鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,534評論 19 139
  • feisky云計算、虛擬化與Linux技術(shù)筆記posts - 1014, comments - 298, trac...
    不排版閱讀 4,292評論 0 5
  • 在這里的每一滴山水的墜落,每一片樹葉的煽動,似乎都在歌頌著湯黛之間的愛情 商湯和黛眉娘娘的故事在日益發(fā)達(dá),科技化的...
    火龍果旅游閱讀 689評論 0 0
  • 周末和Pipi去逛杜蕾斯展的時候意外得到了兩張《閨蜜2》的電影票,本身還滿懷期待,但看到一半就忍不了奪門而出了。 ...
    YuliaQin閱讀 250評論 0 0
  • 今天聽了山長對華爾街金融專業(yè)人員樸海娜的分析錄音,讓我認(rèn)識了好多人性上的東西,同時也學(xué)會了一點點如何去分辨一個人的...
    劉昱郡閱讀 497評論 0 1

友情鏈接更多精彩內(nèi)容