參照《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在主機(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

修改以下參數(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


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

后面發(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后臺管理頁面

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