Docker 1.12 Swarm叢集實戰(第五章)
補充一些遺漏的問題.
本章主要內容:
- 使用
constraints
指定service
約束. service
掛載使用本地volume.- ELK日誌平臺使用GELF日誌驅動收集日誌.
1. 指定service約束
在前幾章中, 我們建立的 registry
服務,是由swarm自動排程定義執行在某個節點上的. 這樣的話我們如果我們重啟 service
以後, registry
服務可能會被啟動再隨機的節點.
造成我們上傳的映象都不見了. 如何解決這個問題呢?
在建立service的時候可以使用 --constraints
引數,後面跟表示式,限制service容器在每個節點的排程情況.比如你想指定service執行在某個節點上等.
例如指定service執行在node01上:
docker service create --name registry --publish 5000:5000 \
--constraint 'node.hostname==node01' registry
除了 hostname
也可以使用其他節點屬性來建立約束表示式寫法參見下表:
節點屬性 | 匹配 | 示例 |
---|---|---|
node.id | 節點 ID | node.id == 2ivku8v2gvtg4 |
node.hostname | 節點 hostname | node.hostname != node02 |
node.role | 節點 role: manager | node.role == manager |
node.labels | 使用者自定義 node labels | node.labels.security == high |
engine.labels | Docker Engine labels | engine.labels.operatingsystem == ubuntu 14.04 |
使用者自定義labels可以使用 docker node update
命令新增, 例如:
# docker node update --label-add security=high node01
檢視自定義labels
# docker node inspect node01
[
{
"ID": "0nhjsflo3tbd0b7hv2cyrjpin",
...
"Spec": {
"Labels": {
"security": "high"
},
"Role": "manager",
"Availability": "active"
},
"Description": {
"Hostname": "node01",
"Platform": {
"Architecture": "x86_64",
"OS": "linux"
},
...
}
]
對於已有service, 可以通過 docker service update
,新增 constraint
配置,
例如:
docker service update registry \
--constraint-add 'node.labels.security==high'
2. volume 建立管理
有了service約束, 我們可以保證我們的 registry
服務, 一直在node01節點上了. 不過還有一個問題, 就是如果我們刪除了 registry
服務.
那我們上傳的容器映象也就被刪除了.
如何保證即使 registry
服務被刪除, 映象可以保留呢?
這裡我們可以使用 docker volume
指定掛載一個數據卷用來儲存映象, 即使 registry
服務被刪除了.
我們重新啟動一個服務, 掛載這個資料卷. 我們上傳的映象還可以儲存的.
在 swarm
叢集中我們可以建立本地卷或者全域性捲來掛載到容器, 用來儲存資料.
-
全域性卷可以被掛載在
swarm
叢集的任意節點, 所以不管你的服務容器啟動在哪個節點, 都可以訪問到資料. 不過docker目前還沒有預設的全域性卷驅動支援, 你可以安裝一些外掛驅動來實現全域性卷例如Flocker, Portworx等. -
本地卷, 就只存在與某個節點本地的一個掛載卷.
Storage is Hard
這裡我們還是使用簡單的本地卷吧, ^_^
.
為我們剛剛新建的 registry
服務, 掛載一個本地卷,可以使用如下命令:
docker service update registry \
--mount-add type=volume,source=registry-vol,target=/var/lib/registry
source=registry-vol
中 registry-vol
為卷名字,
執行上述命令以後,docker會自動為我們建立一個 registry-vol
本地卷.
可以使用 docker volume ls
命令檢視:
# docker volume ls
DRIVER VOLUME NAME
local registry-vol
# docker volume inspect registry-vol
[
{
"Name": "registry-vol",
"Driver": "local",
"Mountpoint": "/var/lib/docker/volumes/registry-vol/_data",
"Labels": null,
"Scope": "local"
}
]
上面命令, 可以看到本機卷掛載到節點的目錄.
這樣即使我們現在刪除 registry
服務. 也可以只用如下命令重新建立一個 registry
服務,
掛載 registry-vol
來找回我們的映象.
docker service create --name registry --publish 5000:5000 \
--mount source=registry-vol,type=volume,target=/var/lib/registry \
-e SEARCH_BACKEND=sqlalchemy \
--constraint 'node.hostname==node01' registry
測試
使用docker-compose 編譯上傳我們的docker幣映象
[[email protected] ~]# git clone https://github.com/jpetazzo/orchestration-workshop.git
[[email protected] ~]# orchestration-workshop/dockercoins
[[email protected] dockercoins]# cat docker-compose.yml-images
version: "2"
services:
rng:
build: rng
image: ${REGISTRY_SLASH}rng${COLON_TAG}
ports:
- "8001:80"
hasher:
build: hasher
image: ${REGISTRY_SLASH}hasher${COLON_TAG}
ports:
- "8002:80"
webui:
build: webui
image: ${REGISTRY_SLASH}webui${COLON_TAG}
ports:
- "8000:80"
volumes:
- "./webui/files/:/files/"
redis:
image: redis
worker:
build: worker
image: ${REGISTRY_SLASH}worker${COLON_TAG}
上傳我們的應用映象到 registry
export REGISTRY_SLASH=localhost:5000/
export COLON_TAG=:v0.01
docker-compose -f docker-compose.yml-images build
docker-compose -f docker-compose.yml-images push
測試 registry
內容
[root@node01 dockercoins]# curl localhost:5000/v2/_catalog
{"repositories":["hasher","rng","webui","worker"]}
刪除 registry
服務
[[email protected] dockercoins]# docker service ls
ID NAME REPLICAS IMAGE COMMAND
5qvu78ths5wb registry 1/1 registry
[root@node01 dockercoins]# docker service rm registry
registry
服務刪除以後我們可以看到本地卷還在.
[[email protected] dockercoins]# docker volume ls
DRIVER VOLUME NAME
local registry-vol
重建 registry
服務, 掛載 registry-vol
卷.
[[email protected] dockercoins]# docker service create --name registry --publish 5000:5000 --mount source=registry-vol,type=volume,target=/var/lib/registry -e SEARCH_BACKEND=sqlalchemy --constraint 'node.hostname==node01' registry
[[email protected] dockercoins]# curl localhost:5000/v2/_catalog
{"repositories":["hasher","rng","webui","worker"]}
3. ELK日誌平臺使用GELF驅動收集日誌
上一章我們介紹了ELK日誌平臺, 用於管理收集swarm叢集的應用日誌. 當時我們使用的logspout容器, 自動將我們swarm節點上所有容器日誌傳送的日誌平臺.
可是如果我們關心特定容器的日誌, 並不想收集其他容器的日誌怎麼辦呢?
我們可以時候建立service的時候使用 --log-driver
引數, 使用GELF驅動將日誌傳送到ELK平臺.
建立ELK平臺
上一章已經有詳細說明了, 下面這裡簡單過一下, 湊字數.哈哈…
建立Logging網路
docker network create --driver overlay logging
建立Elasticsearch服務
docker service create --network logging --name elasticsearch \
--mount source=elasticsearch-vol,type=volume,target=/usr/share/elasticsearch \
--constraint 'node.hostname==node02' \
elasticsearch
建立Kibana服務
docker service create --network logging --name kibana --publish 5601:5601 \
-e LOGSPOUT=ignore -e ELASTICSEARCH_URL=http://elasticsearch:9200 kibana
建立Logstash服務
我們重新build一個logstash映象, 使用 ~/orchestration-workshop/elk/logstash.conf
這個配置檔案.
[[email protected] ~]cd ~/orchestration-workshop/elk/
[[email protected] elk]# cat Dockerfile
FROM logstash
COPY logstash.conf /etc/logstash/
CMD ["-f", "/etc/logstash/logstash.conf"]
[[email protected] elk]# docker build -t localhost:5000/logstash .
[[email protected] elk]# docker push localhost:5000/logstash
啟動logstash
docker service create --network logging --name logstash -p 12201:12201/udp \
localhost:5000/logstash
傳送容器日誌到logstash
我們已經有了ELK平臺, 下面我們啟動 docker幣
應用, 傳送容器日誌到logstash.
很簡單, 只要在建立 service
的時候新增 --log-driver
和 --log-opt
兩個引數就行了.
#建立應用網路
docker network create --driver overlay dockercoins
#啟動我們的docker幣 webui應用
DOCKER_REGISTRY=localhost:5000
TAG=v0.01
docker service create --network dockercoins --name webui \
--log-driver gelf --log-opt gelf-address=udp://127.0.0.1:12201 \
-p 8000:80 $DOCKER_REGISTRY/webui:$TAG
使用下面這段指令碼啟動hasher rng worker 應用:
DOCKER_REGISTRY=localhost:5000
TAG=v0.01
for SERVICE in hasher rng worker; do
docker service create --network dockercoins --name $SERVICE \
--log-driver gelf --log-opt gelf-address=udp://127.0.0.1:12201 \
$DOCKER_REGISTRY/$SERVICE:$TAG
done
啟動redis資料庫:
docker service create --network dockercoins \
--limit-memory 100M --name redis \
--mount source=redis-vol,type=volume,target=/data \
--constraint 'node.hostname==node03' \
redis
為了方便觀看日誌, 我們sacle up下應用, 多啟動一些容器:
docker service scale worker=10 rng=10
##4. visualier
visualizer是一個小程式,用於視覺化 swarm
叢集容器分佈情況.
在 swarm
的manager節點上執行, HOST
引數指定節點IP地址.
docker run --name visualizer -d \
-p 8089:8089 \
-e HOST=192.168.33.101 \
-e PORT=8089 \
-v /var/run/docker.sock:/var/run/docker.sock \
manomarks/visualizer
最後
挖坑, 有了日誌收集平臺, 我們還需要效能監控平臺, 所以下一章介紹下如何使用cadvisor, influxdb, grafana搭建簡單的swarm效能監控平臺.
influxdb
docker service create --network logging \
-p 8083:8083 -p 8086:8086 \
--mount source=influxdb-vol,type=volume,target=/var/lib/influxdb \
--name=influxdb --constraint 'node.hostname==node03' \
influxdb:alpine
docker service create --network logging --name cadvisor --mode global \
--mount source=/var/run/,type=bind,target=/var/run,readonly=false \
--mount source=/,type=bind,target=/rootfs,readonly=true \
--mount source=/sys,type=bind,target=/sys,readonly=true \
--mount source=/var/lib/docker/,type=bind,target=/var/lib/docker,readonly=true \
google/cadvisor:latest -storage_driver=influxdb -storage_driver_host=influxdb:8086 \
-storage_driver_db=cadvisor
docker service create --network logging -p 3000:3000 -e INFLUXDB_HOST=influxdb -e INFLUXDB_PORT=8086 -e INFLUXDB_NAME=grafana -e INFLUXDB_USER=root -e INFLUXDB_PASS=root -e "GF_SECURITY_ADMIN_PASSWORD=admin" --constraint 'node.hostname==node05' --name grafana grafana/grafana
相關推薦
Docker 1.12 Swarm叢集實戰(第五章)
補充一些遺漏的問題. 本章主要內容: 使用 constraints 指定 service 約束.service 掛載使用本地volume.ELK日誌平臺使用GELF日誌驅動收集日誌. 1. 指定service約束 在前幾章中, 我們建立的 registry 服務,是由
Docker 1.12 Swarm Mode叢集實戰(第二章)
第二章 建立Swarm叢集 繼續上一章 Docker 1.12 Swarm Mode叢集實戰(第一章) 的內容, 為了產生更多的docker幣,我們需要搭建一個swarm叢集來scale out我們的docker幣應用,解決單節點的效能瓶頸。 2.1 Swarm Mo
Gradle 1.12使用者指南翻譯——第五十二章. Maven 外掛
本文由CSDN部落格貌似掉線翻譯,其他章節的翻譯請參見:http://blog.csdn.net/column/details/gradle-translation.html翻譯專案請關注Github上的地址:https://github.com/msdx/gradledoc
機器學習實戰第五章Logistic回歸
表示 article err () tail mat cycle col transpose def gradAscent(dataMatIn, classLabels): dataMatrix = mat(dataMatIn) #co
Introduction to 3D Game Programming with DirectX 12 學習筆記之 --- 第五章:渲染流水線
學習目標 瞭解幾個用以表達真實場景的標誌和2D影象的深度空間; 學習在Direct3D中如何表示3D物體; 學習如何模擬虛擬攝像機; 理解渲染流水線:如何用幾何描述的3D場景渲染出2D影象; 1 3D幻覺 如何在2D平面(顯示器)上產生
docker 1.12 版本 docker swarm 叢集
docker 1.12 版本 的新特性 (1)docker swarm:叢集管理,子命令有init, join, leave, update (2)docker service:服務建立,子命令有create, inspect, update, remove, tasks (3)docker no
docker version 1.12+ swarm 集群
docker swarm初次接觸docker 是在2016年初,當時是在一家初創公司Docker從v1.12.0後開始集成swarm mode(swarmkit),關於swarm的所有操作可以直接使用docker swarm 命令來完成。Docker Swarm是docker原生的用於管理docker集群
《機器學習實戰》第五章:Logistic迴歸(1)基本概念和簡單例項
最近感覺時間越來越寶貴,越來越不夠用。不過還是抽空看了點書,然後整理到部落格來。 加快點節奏,廢話少說。 Keep calm & carry on. ----------------------------------------------------------
搭建Docker Swarm叢集實戰(一)(服務發現使用consul)
注意: docker在版本1.12之後,已經將swarm的部分整合在docker裡面了,所以也就不需要依賴第三方的東西了。 所以如果不是為了有趣瞭解一下的話,請直接轉到本系列的第三篇開始=》搭建Docker Swarm叢集實戰(三)(swarm
Gradle 1.12使用者指南翻譯——第四十五章. 應用程式外掛
本文由CSDN部落格貌似掉線翻譯,其他章節的翻譯請參見:http://blog.csdn.net/column/details/gradle-translation.html翻譯專案請關注Github上的地址:https://github.com/msdx/gradledoc
搭建Docker Swarm叢集實戰(三)(swarm mode)
前言 docker在1.12版本之後,把swarm的功能內建到docker engine本身,因此之前使用consul等第三方服務發現和鍵值服務的方法就可以作古了。 這篇就是用docker自帶的swarm mode來進行swarm的叢集搭建。 這篇實操的主
《Java並發編程實戰》第五章 同步容器類 讀書筆記
blank sortedset 方法 width lists 讀書 run 生產者消費者模式 ear 一、同步容器類 1. 同步容器類的問題 線程容器類都是線程安全的。可是當在其上進行符合操作則須要而外加鎖保護其安全性。 常見符合操作包括: . 叠代 . 跳轉(
第五章:面向對象1
沒有 值傳遞 默認 封裝性 軟件開發 大型項目 語句 開發思想 實現 面向對象和面向過程的區別 兩者都是軟件開發思想,先有面向過程,後有面向對象。在大型項目中,針對面向過程的不足推出了面向對象開發思想。區別1. 編程思路不同: 面向過程以實現功能的函數開發為主,而面向對象要
提供跟老男孩學Linux運維Shell編程實戰的第四、第五章源代碼
linux shell 第四章是講Shell變量知識進階與實踐;第五章是講變量的數值計算實踐;附件中包括源碼,請下載。該兩章在學習時要註意相關事項:1.註意標點符號的使用:例如,單引號,反引號,雙引號等;2.註意該要留空格的留空格;3.註意特殊變量的作用;4.內置變量的使用;5.算術運算任的使用。本文
Linux實戰第五篇:RHEL7.3下Nginx虛擬主機配置實戰(基於別名)
虛擬主機 nginx個人筆記分享(在線閱讀):http://note.youdao.com/noteshare?id=05daf711c28922e50792c4b09cf63c58PDF版本下載http://down.51cto.com/data/2323313本文出自 “人才雞雞” 博客,請務必保留此出處
spring實戰第四版第五章pom.xml
第四版 context -c sco cas val mysql packaging core <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/X
第五章 XSSworm剖析 5.1 web2.0應用安全
客戶端 request 結果 不但 暴露 疑問 t對象 網站 開發者 1、改變世界的web2.0 理解起來其實很簡單。web1.0,註重信息從大網站流向個人; web2.0,註重信息從個人流向個人 2、web2.0的安全性 帶來的威脅: ①web1.0只是鼓勵用戶取閱讀
第五章作業1
text uil school log .com back erl jackson ges <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>
2017.12.8 軟件工程-----第五章 總體設計(復習)
中一 計劃 整體 推薦 滿足 集中 用戶 重要 文檔 軟件工程-----第五章 總體設計(復習) (1)概要 經過需求分析階段的工作,系統必須“做什麽”已經很清楚了,現在是決定“怎樣做”的時候了。總體設計的基本目的是系統應該如何實現。他最重要的一項工作是設計軟件結構。因此,
2017-2018-1 20179215 《從問題到程序》第五章
efi mrr 堅持 stdlib.h clu 無符號 全局 文字信息 選擇 《從問題到程序》第五章讀書筆記 ?這章主要從五個方面介紹,分別為數值類型、函數和標準庫函數、函數定義和程序的函數分解、c程序的結構與變量及預處理。主要是對函數整體的理解以及常用的規範進行說明。