搭建我的第一個Docker應用棧

weixin_34194087發表於2018-07-20

參照《Docker容器與容器雲》第2.3節來搭建我的第一個Docker應用棧。

1.獲取應用棧各節點所需映象

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

2.應用棧容器節點啟動

注意:在啟動每個新的容器時都分配一個終端執行,這樣才方便後續操作


10986759-94578821a05fa8ff.png
為每個容器開一個終端
# 啟動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

在新視窗檢視啟動的容器資訊,如下:


10986759-96683f68701b79e1.png
已啟動的容器資訊

3.應用棧容器節點的配置

3.1 redis master 主資料庫容器節點配置

容器本身是輕量化的,缺乏文字編輯工具,容器資料掛載在主機上,在主機上建立和編輯相關檔案可以省去在容器中安裝各類編輯工具的麻煩

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

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

使用docker inspect 命令可以檢視詳細資訊

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"
            ],
        ],
    .......
        }
    }
]
  • 進入主機volume目錄,利用啟動配置檔案模板來建立主資料庫的啟動配置檔案
    注意:若主機未安裝相應版本redis。通過上一步docker inspect命令可以看到redis映象的redis版本為4.0.10,因此先下載與其相容的redis(對應的大版本即可),已安裝的忽略此步驟
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
10986759-5d6bda8d0a085200.png
主機配置檔案模板

修改以下引數:
bind 0.0.0.0
daemonize yes
pidfile /var/run/redis.pid

  • 在主機建立好啟動配置檔案後,切換到容器中的volume目錄,並複製啟動破日誌檔案到Redis的執行工作目錄,然後啟動Redis伺服器,如下
cp redis.conf /usr/local/bin
cd /usr/local/bin 
redis-server redis.conf
10986759-12833c24a3b5ce2a.png
容器內配置redis

10986759-2fe63d39c8533604.png
容器內啟動redis

3.2 redis slave從資料庫容器節點配置

  • 同上,在主節點的配置基礎上redis.conf多修改一個引數如下

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

配置完成後,主節點和兩個從節點/usr/local/bin目錄下都應該有以下檔案

/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 資料庫容器節點的測試

  • 首先,在redis-master容器內,啟動redis客戶端程式,並儲存一個資料,執行過程如下
# redis-cli        
127.0.0.1:6379> set master redis-master
OK
127.0.0.1:6379> get master
"redis-master"
  • 隨後,在兩個redis-slave容器內,分別啟動redis的客戶端程式,查詢先前在master資料庫中儲存的資料,過程如下
# redis-cli        
127.0.0.1:6379> get master
"redis-master"

測試通過!

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

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

發現一直顯示錯誤ReadTimeoutError

10986759-a24c53a544148582.png
ReadTimeoutError報錯

後面發現是因為docker資料包和網路卡預設的資料包大小不一致導致的,一個是1450,一個是1500


10986759-d53f0d061f593611.png
錯誤原因分析

解決辦法:將docker的資料包大小改為1450,並重啟Docker


10986759-da9f5adf5408aa8e.png
解決方案
  • 測試是否安裝成功
# 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
>>> 

沒有報錯,說明已經可以使用Python語言來呼叫Redis資料庫

  • 建立Web程式
    以APP1為例,在容器啟動時,掛載了-v ~/Projects/Django/App1:/usr/src/app的volume,方便進入主機的volume目錄來對新建APP進行編輯。
    在容器的volume目錄/user/src/app下,開始建立APP,執行過程按照書中來即可。直到 python manage.py syncdb 會報錯, 因為已經沒有這個命令了, 需要執行的是 python manage.py createsuperuser
python manage.py createsuperuser #設定後臺管理的使用者名稱 密碼 郵箱

3.5 HAProxy容器節點的配置

原書中的

listen redis_proxy 0.0.0.0:6301

改成下面的

listen redis_proxy
    bind 0.0.0.0:6301

如果修改了配置檔案的內容,需要先結束所有HAProxy程式,並重新啟動代理。

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

啟動代理

haproxy -f haproxy.cfg 

本地測試,實現效果如下


10986759-a09aa97b4918ec09.png
測試

還可以檢視HAProxy後臺管理頁面


10986759-308cff8bf3c875e1.png
HAProxy後臺管理頁面

以上參考了下面的部落格
連結

相關文章