搭建我的第一個Docker應用棧
參照《Docker容器與容器雲》第2.3節來搭建我的第一個Docker應用棧。
1.獲取應用棧各節點所需映象
sudo docker pull ubuntu
sudo docker pull django
sudo docker pull haproxy
sudo docker pull redis
2.應用棧容器節點啟動
注意:在啟動每個新的容器時都分配一個終端執行,這樣才方便後續操作
# 啟動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.應用棧容器節點的配置
3.1 redis master 主資料庫容器節點配置
容器本身是輕量化的,缺乏文字編輯工具,容器資料掛載在主機上,在主機上建立和編輯相關檔案可以省去在容器中安裝各類編輯工具的麻煩
- 檢視容器所掛載volume的情況
按照書中命令報錯,使用下面的命令可以成功
docker inspect --format "{{.Mounts}}" [CONTAINER ID]
可以看到,該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
修改以下引數:
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
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
後面發現是因為docker資料包和網路卡預設的資料包大小不一致導致的,一個是1450,一個是1500
解決辦法:將docker的資料包大小改為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
>>>
沒有報錯,說明已經可以使用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
本地測試,實現效果如下
還可以檢視HAProxy後臺管理頁面
以上參考了下面的部落格
連結
相關文章
- 我的第一個Android應用程式Android
- 我的第一個Flutter 應用Demo AireportFlutterAI
- 棧的應用
- Docker MineCraft 我的世界搭建教程DockerRaft
- 年輕人的第一個 Docker 應用,大大提高生產力!Docker
- 「偽全棧」Vue2.5+Node.js搭建一個多頁面商城應用全棧VueNode.js
- 從0到1使用Kubernetes系列(四):搭建第一個應用程式
- 第一個 Angular 應用程式Angular
- 碼棧搭建自動化應用(視覺化模式)視覺化模式
- 棧的原理與應用
- 棧的實際應用
- 八個Docker的真實應用場景Docker
- 用 docker-compose 搭建一個 rabbitmq 叢集DockerMQ
- 第一章 第一個簡單的iOS應用iOS
- [part 3] 第一個 Django 應用Django
- kubernetes部署第一個應用案例
- 開發第一個Flink應用
- 如何Docker化任意一個應用Docker
- 利用ELK搭建Docker容器化應用日誌中心Docker應用日誌
- 棧的應用和實現
- [譯] 用 Flutter 開發你的第一個應用程式Flutter
- 1. 構建您的第一個應用
- 基於 Docker for MAC 的 Kubernetes 本地環境搭建與應用部署DockerMac
- StudyFlutter——我的第一個APPFlutterAPP
- 我的第一個網站網站
- 2、Node.js 第一個應用Node.js
- [part 1] 第一個 Django 應用程式Django
- DOCKER應用Docker
- 棧的應用---字尾表示式
- 表示式計算(棧的應用)
- Docker常用的應用部署Docker
- 我的第一個 scrapy 爬蟲爬蟲
- 我的第一個Laravel專案Laravel
- 我的第一個React Native AppReact NativeAPP
- 七天用 Go 寫個 docker(第一天)GoDocker
- 用 docker 快速搭建 kafka(qbit)DockerKafka
- Git 學習以及建立第一個應用Git
- Netty 框架學習 —— 第一個 Netty 應用Netty框架