本地鏡像發布到阿里云
本地鏡像發布到阿里云流程
鏡像的生成方法
基于當前容器創建一個新的鏡像,新功能增強 docker commit [OPTIONS] 容器ID [REPOSITORY[:TAG]]
OPTIONS說明:
OPTIONS說明:
-a :提交的鏡像作者;
-m :提交時的說明文字;
將本地鏡像推送到阿里云
本地鏡像素材原型
阿里云開發者平臺
創建倉庫鏡像
- 選擇控制臺,進入容器鏡像服務
- 選擇個人實例
- 命名空間
- 倉庫名稱
- 進入管理界面獲得腳本
將鏡像推送到阿里云
管理界面腳本
腳本實例
docker login --username=zzyybuy registry.cn-hangzhou.aliyuncs.com
docker tag cea1bb40441c registry.cn-hangzhou.aliyuncs.com/atguiguwh/myubuntu:1.1
docker push registry.cn-hangzhou.aliyuncs.com/atguiguwh/myubuntu:1.1
根據實際情況填寫
將阿里云上的鏡像下載到本地
docker pull registry.cn-hangzhou.aliyuncs.com/atguiguwh/myubuntu:1.1
本地鏡像發布到私有庫
是什么
- 官方Docker Hub地址:https://hub.docker.com/,中國大陸訪問太慢了且準備被阿里云取代的趨勢,不太主流。
- Dockerhub、阿里云這樣的公共鏡像倉庫可能不太方便,涉及機密的公司不可能提供鏡像給公網,所以需要創建一個本地私人倉庫供給團隊使用,基于公司內部項目構建鏡像。
- Docker Registry是官方提供的工具,可以用于構建私有鏡像倉庫
將本地鏡像推送到私有庫
下載鏡像Docker Registry
docker pull registry
運行私有庫Registry,相當于本地有個私有Docker hub
docker run -d -p 5000:5000 -v /zzyyuse/myregistry/:/tmp/registry --privileged=true registry
-v會在對應目錄不存在時,自動創建
默認情況,倉庫被創建在容器的/var/lib/registry目錄下,建議自行用容器卷映射,方便于宿主機聯調
案例演示創建一個新鏡像,ubuntu安裝ifconfig命令
- 從Hub上下載ubuntu鏡像到本地并成功運行
- 原始的Ubuntu鏡像是不帶著ifconfig命令的
- 外網連通的情況下,安裝ifconfig命令并測試通過
docker容器內執行上述兩條命令:
apt-get update
apt-get install net-tools
- 安裝完成后,commit我們自己的新鏡像
公式:
docker commit -m=“提交的描述信息” -a=“作者” 容器ID 要創建的目標鏡像名:[標簽名]
命令:在容器外執行,記得
docker commit -m="ifconfig cmd add" -a="zzyy" a69d7c825c4f zzyyubuntu:1.2
5. List item
啟動我們的新鏡像并和原來的對比
a. 官網是默認下載的Ubuntu沒有ifconfig命令。
b. 我們自己commit構建的新鏡像,新增加了ifconfig功能,可以成功使用。
curl驗證私服庫上有什么鏡像
curl -XGET http://192.168.111.162:5000/v2/_catalog
可以看到,目前私服庫沒有任何鏡像上傳過。
將新鏡像zzyyubuntu:1.2修改符合私服規范的Tag
按照公式: docker tag 鏡像:Tag Host:Port/Repository:Tag
自己host主機IP地址,填寫自己的,不要粘貼錯誤。
使用命令 docker tag 將zzyyubuntu:1.2 這個鏡像修改為192.168.111.162:5000/zzyyubuntu:1.2
docker tag zzyyubuntu:1.2 192.168.111.162:5000/zzyyubuntu:1.2
修改配置文件使之支持http
別無腦照著復制,registry-mirrors 配置的是國內阿里提供的鏡像加速地址,不用加速的話訪問官網的會很慢。
2個配置中間有個逗號 ','別漏了,這個配置是json格式的。
vim命令新增如下紅色內容:vim /etc/docker/daemon.json
{"registry-mirrors": ["https://aa25jngu.mirror.aliyuncs.com"],"insecure-registries": ["192.168.111.162:5000"]
}
上述理由:docker默認不允許http方式推送鏡像,通過配置選項來取消這個限制。====> 修改完后如果不生效,建議重啟docker。
push推送到私服庫
docker push 192.168.111.162:5000/zzyyubuntu:1.2
curl驗證私服庫上有什么鏡像2
curl -XGET http://192.168.111.162:5000/v2/_catalog
pull到本地并運行
docker pull 192.168.111.162:5000/zzyyubuntu:1.2
docker run -it 鏡像ID /bin/bash
Docker容器數據卷
容器卷記得加入
–privileged=true
Docker掛載主機目錄訪問如果出現cannot open directory .: Permission denied
解決辦法:在掛載目錄后多加一個**–privileged=true**參數即可
如果是CentOS7安全模塊會比之前系統版本加強,不安全的會先禁止,所以目錄掛載的情況被默認為不安全的行為,在SELinux里面掛載目錄被禁止掉了,如果要開啟,我們一般使用–privileged=true命令,擴大容器的權限解決掛載目錄沒有權限的問題,也即使用該參數,container內的root擁有真正的root權限,否則,container內的root只是外部的一個普通用戶權限。
回顧下上一講的知識點,參數V
是什么
卷就是目錄或文件,存在于一個或多個容器中,由docker掛載到容器,但不屬于聯合文件系統,因此能夠繞過Union File System提供一些用于持續存儲或共享數據的特性:卷的設計目的就是數據的持久化,完全獨立于容器的生存周期,因此Docker不會在容器刪除時刪除其掛載的數據卷。
一句話:有點類似我們Redis里面的rdb和aof文件。
將docker容器內的數據保存進宿主機的磁盤中,運行一個帶有容器卷存儲功能的容器實例。
docker run -it --privileged=true -v /宿主機絕對路徑目錄:/容器內目錄 鏡像名
能干嘛
將運用與運行的環境打包鏡像,run后形成容器實例運行 ,但是我們對數據的要求希望是持久化的。
Docker容器產生的數據,如果不備份,那么當容器實例刪除后,容器內的數據自然也就沒有了。為了能保存數據在docker中我們使用卷。
特點:
- 數據卷可在容器之間共享或重用數據
- 卷中的更改可以直接實時生效,爽
- 數據卷中的更改不會包含在鏡像的更新中
- 數據卷的生命周期一直持續到沒有容器使用它為止
數據卷案例
宿主vs容器之間映射添加容器卷
- 直接命令添加
docker run -it --privileged=true -v /宿主機絕對路徑目錄:/容器內目錄 鏡像
名
公式:docker run -it -v /宿主機目錄:/容器內目錄 ubuntu /bin/bash
docker run -it --name myu3 --privileged=true -v /tmp/myHostData:/tmp/myDockerData ubuntu /bin/bash
2. 查看數據卷是否掛載成功
docker inspect 容器ID
- 容器和宿主機之間數據共享
a. docker修改,主機同步獲得 。
b. 主機修改,docker同步獲得。
c. docker容器stop,主機修改,docker容器重啟看數據是否同步。
讀寫規則映射添加說明
讀寫(默認)
docker run -it --privileged=true -v /宿主機絕對路徑目錄:/容器內目錄:rw 鏡像名
默認同上案例,默認就是rw
rw = read + write
只讀
容器實例內部被限制,只能讀取不能寫
/容器目錄:ro 鏡像名 就能完成功能,此時容器自己只能讀取不能寫
ro = read only
此時如果宿主機寫入內容,可以同步給容器內,容器可以讀取到。
docker run -it --privileged=true -v /宿主機絕對路徑目錄:/容器內目錄:ro 鏡像名
卷的繼承和共享
容器1完成和宿主機的映射
docker run -it --privileged=true -v /mydocker/u:/tmp --name u1 ubuntu
容器2繼承容器1的卷規則
docker run -it --privileged=true --volumes-from 父類 --name u2 ubuntu
Docker常規安裝簡介
總體步驟
- 搜索鏡像
- 拉取鏡像
- 查看鏡像
- 啟動鏡像 - 服務端口映射
- 停止容器
- 移除容器
安裝tomcat
- docker hub上面查找tomcat鏡像
docker search tomcat
- 從docker hub上拉取tomcat鏡像到本地
docker pull tomcat
- docker images查看是否有拉取到的tomcat
- 使用tomcat鏡像創建容器實例(也叫運行鏡像)
docker run -it -p 8080:8080 tomcat
-p 小寫,主機端口:docker容器端口
-P 大寫,隨機分配端口
-i 交互
-t 終端
-d 后臺
3. 訪問貓首頁
問題
解決
a. 可能沒有映射端口或者沒有關閉防火墻
b. 把webapps.dist目錄換成webapps
先成功啟動tomcat
查看webapps 文件夾查看為空
6. 免修改版說明
docker pull billygoo/tomcat8-jdk8
docker run -d -p 8080:8080 --name mytomcat8 billygoo/tomcat8-jdk8
安裝mysql
docker hub上面查找mysql鏡像
從docker hub上(阿里云加速器)拉取mysql鏡像到本地標簽為5.7
使用mysql5.7鏡像創建容器(也叫運行鏡像)
命令出處,哪里來的?
簡單版
使用mysql鏡像
docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
docker ps
docker exec -it 容器ID /bin/bash
mysql -uroot -p
建庫建表插入數據
外部Win10也來連接運行在dokcer上的mysql容器實例服務
問題
插入中文數據試試
為什么報錯?
docker上默認字符集編碼隱患,docker里面的mysql容器實例查看,內容如下:
SHOW VARIABLES LIKE ‘character%’
刪除容器后,里面的mysql數據怎么辦?
實戰版
新建mysql容器實例
docker run -d -p 3306:3306
--privileged=true
-v /zzyyuse/mysql/log:/var/log/mysql
-v /zzyyuse/mysql/data:/var/lib/mysql
-v /zzyyuse/mysql/conf:/etc/mysql/conf.d
-eMYSQL_ROOT_PASSWORD=123456
--name mysql mysql:5.7
新建my.cnf,通過容器卷同步給mysql容器實例
[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8
重新啟動mysql容器實例再重新進入并查看字符編碼
再新建庫新建表再插入中文測試
結論
之前的DB 無效,修改字符集操作+重啟mysql容器實例
之后的DB 有效,需要新建
結論:docker安裝完MySQL并run出容器后,建議請先修改完字符集編碼后再新建mysql庫-表-插數據
假如將當前容器實例刪除,再重新來一次,之前建的db01實例還有嗎?try
安裝redis
- 從docker hub上(阿里云加速器)拉取redis鏡像到本地標簽為6.0.8
- 入門命令
- 命令提醒:容器卷記得加入–privileged=true
Docker掛載主機目錄Docker訪問出現cannot open directory .: Permission denied
解決辦法:在掛載目錄后多加一個–privileged=true參數即可 - 在CentOS宿主機下新建目錄/app/redis
mkdir -p /app/redis
- 將一個redis.conf文件模板拷貝進/app/redis目錄下
將準備好的redis.conf文件放進/app/redis目錄下 - /app/redis目錄下修改redis.conf文件
默認出廠的原始redis.conf
redis.conf - 使用redis6.0.8鏡像創建容器(也叫運行鏡像)
docker run
-p 6379:6379
--name myr3
--privileged=true
-v /app/redis/redis.conf:/etc/redis/redis.conf
-v /app/redis/data:/data
-d redis:6.0.8 redis-server /etc/redis/redis.conf
- 測試redis-cli連接上來
docker exec -it 運行著Rediis服務的容器ID redis-cli
- 請證明docker啟動使用了我們自己指定的配置文件
修改前
我們用的配置文件,數據庫默認是16個
修改后
宿主機的修改會同步給docker容器里面的配置。記得重啟服務 - 測試redis-cli連接上來第2次
安裝MySQL主從復制
主從復制原理
參考
主從搭建步驟
- 新建主服務器容器實例3307
docker run -p 3307:3306 --name mysql-master \
-v /mydata/mysql-master/log:/var/log/mysql \
-v /mydata/mysql-master/data:/var/lib/mysql \
-v /mydata/mysql-master/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7
- 進入/mydata/mysql-master/conf目錄下新建my.cnf
vim my.cnf
[mysqld]
## 設置server_id,同一局域網中需要唯一
server_id=101
## 指定不需要同步的數據庫名稱
binlog-ignore-db=mysql
## 開啟二進制日志功能
log-bin=mall-mysql-bin
## 設置二進制日志使用內存大小(事務)
binlog_cache_size=1M
## 設置使用的二進制日志格式(mixed,statement,row)
binlog_format=mixed
## 二進制日志過期清理時間。默認值為0,表示不自動清理。
expire_logs_days=7
## 跳過主從復制中遇到的所有錯誤或指定類型的錯誤,避免slave端復制中斷。
## 如:1062錯誤是指一些主鍵重復,1032錯誤是因為主從數據庫數據不一致
slave_skip_errors=1062
- 修改完配置后重啟master實例
docker restart mysql-master
- 進入mysql-master容器
docker exec -it mysql-master /bin/bash
mysql -uroot -proot
- master容器實例內創建數據同步用戶
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
- 新建從服務器容器實例3308
docker run -p 3308:3306 --name mysql-slave \
-v /mydata/mysql-slave/log:/var/log/mysql \
-v /mydata/mysql-slave/data:/var/lib/mysql \
-v /mydata/mysql-slave/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7
- 進入/mydata/mysql-slave/conf目錄下新建my.cnf
vim my.cnf
[mysqld]
## 設置server_id,同一局域網中需要唯一
server_id=102
## 指定不需要同步的數據庫名稱
binlog-ignore-db=mysql
## 開啟二進制日志功能,以備Slave作為其它數據庫實例的Master時使用
log-bin=mall-mysql-slave1-bin
## 設置二進制日志使用內存大小(事務)
binlog_cache_size=1M
## 設置使用的二進制日志格式(mixed,statement,row)
binlog_format=mixed
## 二進制日志過期清理時間。默認值為0,表示不自動清理。
expire_logs_days=7
## 跳過主從復制中遇到的所有錯誤或指定類型的錯誤,避免slave端復制中斷。
## 如:1062錯誤是指一些主鍵重復,1032錯誤是因為主從數據庫數據不一致
slave_skip_errors=1062
## relay_log配置中繼日志
relay_log=mall-mysql-relay-bin
## log_slave_updates表示slave將復制事件寫進自己的二進制日志
log_slave_updates=1
## slave設置為只讀(具有super權限的用戶除外)
read_only=1
- 修改完配置后重啟slave實例
docker restart mysql-slave
- 在主數據庫中查看主從同步狀態
show master status;
- 進入mysql-slave容器
docker exec -it mysql-slave /bin/bash
mysql -uroot -proot
- 在從數據庫中配置主從復制
change master to master_host='宿主機ip', master_user='slave', master_password='123456',
master_port=3307, master_log_file='mall-mysql-bin.000001', master_log_pos=617, master_connect_retry=30;
主從復制命令參數說明
master_host:主數據庫的IP地址;
master_port:主數據庫的運行端口;
master_user:在主數據庫創建的用于同步數據的用戶賬號;
master_password:在主數據庫創建的用于同步數據的用戶密碼;
master_log_file:指定從數據庫要復制數據的日志文件,通過查看主數據的狀態,獲取File參數;
master_log_pos:指定從數據庫從哪個位置開始復制數據,通過查看主數據的狀態,獲取Position參數;
master_connect_retry:連接失敗重試的時間間隔,單位為秒。
- 在從數據庫中查看主從同步狀態
show slave status \G;
13. 在從數據庫中開啟主從同步
start slave;
14. 查看從數據庫狀態發現已經同步
15. 主從復制測試
a. 主機新建庫-使用庫-新建表-插入數據,ok
b. 從機使用庫-查看記錄,ok
安裝redis集群(大廠面試題第4季-分布式存儲案例真題)
cluster(集群)模式-docker版
哈希槽分區進行億級數據存儲
面試題
1~2億條數據需要緩存,請問如何設計這個存儲案例?
回答:單機單臺100%不可能,肯定是分布式存儲,用redis如何落地?
上述問題阿里P6~P7工程案例和場景設計類必考題目, 一般業界有3種解決方案
哈希取余分區
2億條記錄就是2億個k,v,我們單機不行必須要分布式多機,假設有3臺機器構成一個集群,用戶每次讀寫操作都是根據公式:
hash(key) % N個機器臺數,計算出哈希值,用來決定數據映射到哪一個節點上。
優點:
簡單粗暴,直接有效,只需要預估好數據規劃好節點,例如3臺、8臺、10臺,就能保證一段時間的數據支撐。使用Hash算法讓固定的一部分請求落到同一臺服務器上,這樣每臺服務器固定處理一部分請求(并維護這些請求的信息),起到負載均衡+分而治之的作用。
缺點:
原來規劃好的節點,進行擴容或者縮容就比較麻煩了額,不管擴縮,每次數據變動導致節點有變動,映射關系需要重新進行計算,在服務器個數固定不變時沒有問題,如果需要彈性擴容或故障停機的情況下,原來的取模公式就會發生變化:Hash(key)/3會變成Hash(key) /?。此時地址經過取余運算的結果將發生很大變化,根據公式獲取的服務器也會變得不可控。
某個redis機器宕機了,由于臺數數量變化,會導致hash取余全部數據重新洗牌。
一致性哈希算法分區
a. 是什么
一致性Hash算法背景
一致性哈希算法在1997年由麻省理工學院中提出的,設計目標是為了解決分布式緩存數據變動和映射問題,某個機器宕機了,分母數量改變了,自然取余數不OK了。
b. 能干嘛
提出一致性Hash解決方案。 目的是當服務器個數發生變動時, 盡量減少影響客戶端到服務器的映射關系
c. 3大步驟
ⅰ. 算法構建一致性哈希環
一致性哈希環
一致性哈希算法必然有個hash函數并按照算法產生hash值,這個算法的所有可能哈希值會構成一個全量集,這個集合可以成為一個hash空間[0,2^32-1],這個是一個線性空間,但是在算法中,我們通過適當的邏輯控制將它首尾相連(0 = 2^32),這樣讓它邏輯上形成了一個環形空間。
它也是按照使用取模的方法,前面筆記介紹的節點取模法是對節點(服務器)的數量進行取模。而一致性Hash算法是對232取模,簡單來說,一致性Hash算法將整個哈希值空間組織成一個虛擬的圓環,如假設某哈希函數H的值空間為0-232-1(即哈希值是一個32位無符號整形),整個哈希環如下圖:整個空間按順時針方向組織,圓環的正上方的點代表0,0點右側的第一個點代表1,以此類推,2、3、4、……直到232-1,也就是說0點左側的第一個點代表232-1, 0和232-1在零點中方向重合,我們把這個由232個點組成的圓環稱為Hash環。
ii 服務器IP節點映射
節點映射 將集群中各個IP節點映射到環上的某一個位置。
將各個服務器使用Hash進行一個哈希,具體可以選擇服務器的IP或主機名作為關鍵字進行哈希,這樣每臺機器就能確定其在哈希環上的位置。假如4個節點NodeA、B、C、D,經過IP地址的哈希函數計算(hash(ip)),使用IP地址哈希后在環空間的位置如下
iii key落到服務器的落鍵規則
當我們需要存儲一個kv鍵值對時,首先計算key的hash值,hash(key),將這個key使用相同的函數Hash計算出哈希值并確定此數據在環上的位置,從此位置沿環順時針“行走”,第一臺遇到的服務器就是其應該定位到的服務器,并將該鍵值對存儲在該節點上。
如我們有Object A、Object B、Object C、Object D四個數據對象,經過哈希計算后,在環空間上的位置如下:根據一致性Hash算法,數據A會被定為到Node A上,B被定為到Node B上,C被定為到Node C上,D被定為到Node D上。
d. 優點
ⅰ. 一致性哈希算法的容錯性
容錯性
假設Node C宕機,可以看到此時對象A、B、D不會受到影響,只有C對象被重定位到Node D。一般的,在一致性Hash算法中,如果一臺服務器不可用,則受影響的數據僅僅是此服務器到其環空間中前一臺服務器(即沿著逆時針方向行走遇到的第一臺服務器)之間數據,其它不會受到影響。簡單說,就是C掛了,受到影響的只是B、C之間的數據,并且這些數據會轉移到D進行存儲。
ii 一致性哈希算法的擴展性
數據量增加了,需要增加一臺節點NodeX,X的位置在A和B之間,那收到影響的也就是A到X之間的數據,重新把A到X的數據錄入到X上即可,
不會導致hash取余全部數據重新洗牌。
e. 缺點
一致性哈希算法的數據傾斜問題
Hash環的數據傾斜問題
一致性Hash算法在服務節點太少時,容易因為節點分布不均勻而造成數據傾斜(被緩存的對象大部分集中緩存在某一臺服務器上)問題,
例如系統中只有兩臺服務器:
f 小總結
為了在節點數目發生改變時盡可能少的遷移數據
將所有的存儲節點排列在收尾相接的Hash環上,每個key在計算Hash后會順時針找到臨近的存儲節點存放。
而當有節點加入或退出時僅影響該節點在Hash環上順時針相鄰的后續節點。
優點
加入和刪除節點只影響哈希環中順時針方向的相鄰的節點,對其他節點無影響。
缺點
數據的分布和節點的位置有關,因為這些節點不是均勻的分布在哈希環上的,所以數據在進行存儲時達不到均勻分布的效果。
哈希槽分區
a. 是什么
1 為什么出現
哈希槽實質就是一個數組,數組[0,2^14 -1]形成hash slot空間。
2 能干什么
解決均勻分配的問題,在數據和節點之間又加入了一層,把這層稱為哈希槽(slot),用于管理數據和節點之間的關系,現在就相當于節點上放的是槽,槽里放的是數據。
槽解決的是粒度問題,相當于把粒度變大了,這樣便于數據移動。
哈希解決的是映射問題,使用key的哈希值來計算所在的槽,便于數據分配。
3 多少個hash槽
一個集群只能有16384個槽,編號0-16383(0-2^14-1)。這些槽會分配給集群中的所有主節點,分配策略沒有要求。可以指定哪些編號的槽分配給哪個主節點。集群會記錄節點和槽的對應關系。解決了節點和槽的關系后,接下來就需要對key求哈希值,然后對16384取余,余數是幾key就落入對應的槽里。slot = CRC16(key) % 16384。以槽為單位移動數據,因為槽的數目是固定的,處理起來比較容易,這樣數據移動問題就解決了。
b. 哈希槽計算
Redis 集群中內置了 16384 個哈希槽,redis 會根據節點數量大致均等的將哈希槽映射到不同的節點。當需要在 Redis 集群中放置一個 key-value時,redis 先對 key 使用 crc16 算法算出一個結果,然后把結果對 16384 求余數,這樣每個 key 都會對應一個編號在 0-16383 之間的哈希槽,也就是映射到某個節點上。如下代碼,key之A 、B在Node2, key之C落在Node3上
開打步驟
/todo
3主3從redis集群配置
關閉防火墻+啟動docker后臺服務
systemctl start docker
新建6個docker容器redis實例
(完整命令:
docker run --name redis-node-1 --net host --privileged=true -v /data/redis/share/redis-node-1:/data redis:6.0.8 --cluster-enabled yes appendonly yes --port 6381
docker run --name redis-node-2 --net host --privileged=true -v /data/redis/share/redis-node-2:/data redis:6.0.8 --cluster-enabled yes appendonly yes --port 6382
docker run --name redis-node-3 --net host --privileged=true -v /data/redis/share/redis-node-3:/data redis:6.0.8 --cluster-enabled yes appendonly yes --port 6383
docker run --name redis-node-4 --net host --privileged=true -v /data/redis/share/redis-node-4:/data redis:6.0.8 --cluster-enabled yes appendonly yes --port 6384
docker run --name redis-node-5 --net host --privileged=true -v /data/redis/share/redis-node-5:/data redis:6.0.8 --cluster-enabled yes appendonly yes --port 6385
docker run --name redis-node-6 --net host --privileged=true -v /data/redis/share/redis-node-6:/data redis:6.0.8 --cluster-enabled yes appendonly yes --port 6386)
命令分步解釋
docker run
創建并運行docker容器實例
–name redis-node-6
容器名字
–net host
使用宿主機的IP和端口,默認
–privileged=true
獲取宿主機root用戶權限
-v /data/redis/share/redis-node-6:/data
容器卷,宿主機地址:docker內部地址
redis:6.0.8
redis鏡像和版本號
–cluster-enabled yes
開啟redis集群
–appendonly yes
開啟持久化
–port 6386
redis端口號
進入容器redis-node-1并為6臺機器構建集群關系
進入容器
docker exec -it redis-node-1 /bin/bash(進入6臺節點中的任意一臺)
構建主從關系
(redis-cli --cluster create 192.168.?.?:6381 192.168.?.?:6382 192.168.?.?:6383 192.168.?.?:6384 192.168.?.?:6385 192.168.?.?:6386 --cluster-replicas 1
備注:–cluster-replicas 1 表示為每一個master創建一個slave節點
執行效果如下:
)
一切OK的話,3主3從搞定
(
)
鏈接進入6381作為切入點,查看集群狀態
(以6381作為切入點:
redis-cli -p 6381
查看集群狀態:cluster info
查看節點狀態:cluster notes
)
鏈接進入6381作為切入點,查看節點狀態
cluster info
cluster nodes
主從容錯切換遷移案例
數據讀寫存儲
啟動6機構成的集群并通過exec進入
(
命令:redis-cli -p 6381
不加參數-c時,表示進入單機版redis,并非使用了集群
)
對6381新增兩個key
(不加參數-c時,如果新增key,該key計算的hash值可能會超過該節點的槽值,會報以下錯誤:
)
防止路由失效加參數-c并新增兩個key
(
)
查看集群信息
(
)
容錯切換遷移
(
如果主機6381宕機,則從機6384需要上位
)
主6381和從機切換,先停止主機6381
6381主機停了,對應的真實從機上位
6381作為1號主機分配的從機以實際情況為準,具體是幾號機器就是幾號
再次查看集群信息
(redis-cli --cluster check 192.168.?.?:端口號)
先還原之前的3主3從
(主機redis-node-1宕機后(docker stop redis-node-1 模擬宕機),從機redis-node-5上位成為master,然后在redis-node-5沒stop的情況下,redis-node-1重新啟動后不會恢復master身份,會成為從機slave;
如果需要像原來一樣將redis-node-1作為主機,則只需要將redis-node-5停止,給1一個上位的機會。)
先啟6381
docker start redis-node-1
再停6385
docker stop redis-node-5
再啟6385
docker start redis-node-5
主從機器分配情況以實際情況為準
查看集群狀態
redis-cli --cluster check 自己IP:6381
主從擴容案例
新建6387、6388兩個節點+新建后啟動+查看是否8節點
(docker run --name redis-node-7 --net host --privileged=true -v /data/redis/share/redis-node-7:/data redis:6.0.8 --cluster-enabled yes appendonly yes --port 6387
docker run --name redis-node-8 --net host --privileged=true -v /data/redis/share/redis-node-8:/data redis:6.0.8 --cluster-enabled yes appendonly yes --port 6388
)
進入6387容器實例內部
docker exec -it redis-node-7 /bin/bash
將新增的6387節點(空槽號)作為master節點加入原集群
(
)
檢查集群情況第1次
(
)
重新分派槽號
(
)
檢查集群情況第2次
槽號分派說明
為主節點6387分配從節點6388
檢查集群情況第3次
主從縮容案例
目的:6387和6388下線
檢查集群情況1獲得6388的節點ID
將6388刪除 從集群中將4號從節點6388刪除
將6387的槽號清空,重新分配,本例將清出來的槽號都給6381
檢查集群情況第二次
將6387刪除
檢查集群情況第三次
DockerFile解析
是什么
Dockerfile是用來構建Docker鏡像的文本文件,是由一條條構建鏡像所需的指令和參數構成的腳本。
概述
官網
構建三步驟
- 編寫Dockerfile文件
- docker build 命令構建鏡像
- docker run 鏡像 運行容器實例
DockerFile構建過程解析
Dockerfile內容基礎知識
- 每條保留字指令都必須為大寫字母且后面要跟隨至少一個參數
- 指令按照從上到下,順序執行
- #表示注釋
- 每條指令都會創建一個新的鏡像層并對鏡像進行提交
Docker執行Dockerfile的大致流程
- docker從基礎鏡像運行一個容器
- 執行一條指令并對容器作出修改
- 執行類似docker commit的操作提交一個新的鏡像層
- docker再基于剛提交的鏡像運行一個新容器
- 執行dockerfile中的下一條指令直到所有指令都執行完成
小總結
從應用軟件的角度來看,Dockerfile、Docker鏡像與Docker容器分別代表軟件的三個不同階段,
● Dockerfile是軟件的原材料
● Docker鏡像是軟件的交付品
● Docker容器則可以認為是軟件鏡像的運行態,也即依照鏡像運行的容器實例
Dockerfile面向開發,Docker鏡像成為交付標準,Docker容器則涉及部署與運維,三者缺一不可,合力充當Docker體系的基石。
- Dockerfile,需要定義一個Dockerfile,Dockerfile定義了進程需要的一切東西。Dockerfile涉及的內容包括執行代碼或者是文件、環境變量、依賴包、運行時環境、動態鏈接庫、操作系統的發行版、服務進程和內核進程(當應用進程需要和系統服務和內核進程打交道,這時需要考慮如何設計namespace的權限控制)等等;
- Docker鏡像,在用Dockerfile定義一個文件之后,docker build時會產生一個Docker鏡像,當運行 Docker鏡像時會真正開始提供服務;
- Docker容器,容器是直接提供服務的。
DockerFile常用保留字指令
參考tomcat8的dockerfile入門
FROM
基礎鏡像,當前新鏡像是基于哪個鏡像的,指定一個已經存在的鏡像作為模板,第一條必須是from
MAINTAINER
鏡像維護者的姓名和郵箱地址
RUN
容器構建時需要運行的命令
兩種格式
shell格式
RUN yum -y install vim
exec格式
RUN是在 docker build時運行
EXPOSE
當前容器對外暴露出的端口
WORKDIR
指定在創建容器后,終端默認登陸的進來工作目錄,一個落腳點
USER
指定該鏡像以什么樣的用戶去執行,如果都不指定,默認是root
ENV
用來在構建鏡像過程中設置環境變量
ENV MY_PATH /usr/mytest
這個環境變量可以在后續的任何RUN指令中使用,這就如同在命令前面指定了環境變量前綴一樣;
也可以在其它指令中直接使用這些環境變量。
比如:WORKDIR $MY_PATH
ADD
將宿主機目錄下的文件拷貝進鏡像且會自動處理URL和解壓tar壓縮包
COPY
類似ADD,拷貝文件和目錄到鏡像中。
將從構建上下文目錄中 <源路徑> 的文件/目錄復制到新的一層的鏡像內的 <目標路徑> 位置
COPY src dest
COPY [“src”, “dest”]
<src源路徑>:源文件或者源目錄
<dest目標路徑>:容器內的指定路徑,該路徑不用事先建好,路徑不存在的話,會自動創建。
VOLUME
容器數據卷,用于數據保存和持久化工作
CMD
指定容器啟動后的要干的事情
注意:
Dockerfile 中可以有多個 CMD 指令,但只有最后一個生效,CMD 會被 docker run 之后的參數替換。
參考官網Tomcat的dockerfile演示講解:
官網最后一行命令
我們演示自己的覆蓋操作
它和前面RUN命令的區別
● CMD是在docker run 時運行。
● RUN是在 docker build 時運行。
ENTRYPOINT
也是用來指定一個容器啟動時要運行的命令
類似于 CMD 指令,但是ENTRYPOINT不會被docker run后面的命令覆蓋, 而且這些命令行參數會被當作參數送給 ENTRYPOINT 指令指定的程序。
命令格式和案例說明
命令格式:
ENTRYPOINT可以和CMD一起用,一般是變參才會使用 CMD ,這里的 CMD 等于是在給 ENTRYPOINT 傳參。
當指定了ENTRYPOINT后,CMD的含義就發生了變化,不再是直接運行其命令而是將CMD的內容作為參數傳遞給ENTRYPOINT指令,他兩個組合會變成
案例如下:假設已通過 Dockerfile 構建了 nginx:test 鏡像:
優點:在執行docker run的時候可以指定 ENTRYPOINT 運行所需的參數。
注意:如果 Dockerfile 中如果存在多個 ENTRYPOINT 指令,僅最后一個生效。
總結
案例
自定義鏡像mycentosjava8
要求
Centos7鏡像具備vim+ifconfig+jdk8
JDK的下載鏡像地址
https://mirrors.yangxingzhen.com/jdk/
編寫
準備編寫Dockerfile文件
FROM centos
MAINTAINER zzyy<zzyybs@126.com>ENV MYPATH /usr/local
WORKDIR $MYPATH#安裝vim編輯器
RUN yum -y install vim
#安裝ifconfig命令查看網絡IP
RUN yum -y install net-tools
#安裝java8及lib庫
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
#ADD 是相對路徑jar,把jdk-8u171-linux-x64.tar.gz添加到容器中,安裝包必須要和Dockerfile文件在同一位置
ADD jdk-8u171-linux-x64.tar.gz /usr/local/java/
#配置java環境變量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_171
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATHEXPOSE 80CMD echo $MYPATH
CMD echo "success--------------ok"
CMD /bin/bash
大寫字母D
構建
docker build -t 新鏡像名字:TAG .
docker build -t centosjava8:1.5 .
注意,上面TAG后面有個空格,有個點
運行
docker run -it 新鏡像名字:TAG
docker run -it centosjava8:1.5 /bin/bash
再體會下UnionFS(聯合文件系統)
UnionFS(聯合文件系統):Union文件系統(UnionFS)是一種分層、輕量級并且高性能的文件系統,它支持對文件系統的修改作為一次提交來一層層的疊加,同時可以將不同目錄掛載到同一個虛擬文件系統下(unite several directories into a single virtual filesystem)。Union 文件系統是 Docker 鏡像的基礎。鏡像可以通過分層來進行繼承,基于基礎鏡像(沒有父鏡像),可以制作各種具體的應用鏡像。
特性:一次同時加載多個文件系統,但從外面看起來,只能看到一個文件系統,聯合加載會把各層文件系統疊加起來,這樣最終的文件系統會包含所有底層的文件和目錄
虛懸鏡像
是什么
倉庫名、標簽都是的鏡像,俗稱dangling image
Dockerfile寫一個
- vim Dockerfile
from ubuntu
CMD echo 'action is success'
- docker build .
查看
docker image ls -f dangling=true
命令結果
刪除
docker image prune
虛懸鏡像已經失去存在價值,可以刪除
家庭作業-自定義鏡像myubuntu
編寫
準備編寫DockerFile文件
FROM ubuntu
MAINTAINER zzyy<zzyybs@126.com>ENV MYPATH /usr/local
WORKDIR $MYPATHRUN apt-get update
RUN apt-get install net-tools
#RUN apt-get install -y iproute2
#RUN apt-get install -y inetutils-pingEXPOSE 80CMD echo $MYPATH
CMD echo "install inconfig cmd into ubuntu success--------------ok"
CMD /bin/bash
構建
docker build -t 新鏡像名字:TAG .
運行
docker run -it 新鏡像名字:TAG
總結
Docker微服務實戰
通過IDEA新建一個普通微服務模塊
建Module
docker_boot
改POM
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.6</version><relativePath/></parent><groupId>com.atguigu.docker</groupId><artifactId>docker_boot</artifactId><version>0.0.1-SNAPSHOT</version><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><junit.version>4.12</junit.version><log4j.version>1.2.17</log4j.version><lombok.version>1.16.18</lombok.version><mysql.version>5.1.47</mysql.version><druid.version>1.1.16</druid.version><mapper.version>4.1.5</mapper.version><mybatis.spring.boot.version>1.3.0</mybatis.spring.boot.version></properties><dependencies><!--SpringBoot通用依賴模塊--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!--test--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-resources-plugin</artifactId><version>3.1.0</version></plugin></plugins></build></project>
寫YML
server.port=6001
主啟動
package com.atguigu.docker;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class DockerBootApplication
{public static void main(String[] args){SpringApplication.run(DockerBootApplication.class, args);}}
業務類
package com.atguigu.docker.controller;import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;import java.util.UUID;/*** @auther zzyy* @create 2021-10-25 17:43*/
@RestController
public class OrderController
{@Value("${server.port}")private String port;@RequestMapping("/order/docker")public String helloDocker(){return "hello docker"+"\t"+port+"\t"+ UUID.randomUUID().toString();}@RequestMapping(value ="/order/index",method = RequestMethod.GET)public String index(){return "服務端口號: "+"\t"+port+"\t"+UUID.randomUUID().toString();}
}
通過dockerfile發布微服務部署到docker容器
IDEA工具里面搞定微服務jar包
docker_boot-0.0.1-SNAPSHOT.jar
編寫Dockerfile
# 基礎鏡像使用java
FROM java:8
# 作者
MAINTAINER zzyy
# VOLUME 指定臨時文件目錄為/tmp,在主機/var/lib/docker目錄下創建了一個臨時文件并鏈接到容器的/tmp
VOLUME /tmp
# 將jar包添加到容器中并更名為zzyy_docker.jar
ADD docker_boot-0.0.1-SNAPSHOT.jar zzyy_docker.jar
# 運行jar包
RUN bash -c 'touch /zzyy_docker.jar'
ENTRYPOINT ["java","-jar","/zzyy_docker.jar"]
#暴露6001端口作為微服務
EXPOSE 6001
將微服務jar包和Dockerfile文件上傳到同一個目錄下/mydocker
bash docker build -t zzyy_docker:1.6 .
構建鏡像
docker build -t zzyy_docker:1.6 .
打包成鏡像文件
運行容器
docker run -d -p 6001:6001 zzyy_docker:1.6
訪問測試
Docker網絡
是什么
docker不啟動,默認網絡情況
ens33
lo
virbr0
在CentOS7的安裝過程中如果有選擇相關虛擬化的的服務安裝系統后,啟動網卡時會發現有一個以網橋連接的私網地址的virbr0網卡(virbr0網卡:它還有一個固定的默認IP地址192.168.122.1),是做虛擬機網橋的使用的,其作用是為連接其上的虛機網卡提供 NAT訪問外網的功能。
我們之前學習Linux安裝,勾選安裝系統的時候附帶了libvirt服務才會生成的一個東西,如果不需要可以直接將libvirtd服務卸載,
yum remove libvirt-libs.x86_64
docker啟動后,網絡情況
會產生一個名為docker0的虛擬網橋
查看docker網絡模式命令,默認創建3大網絡模式。
常用基本命令
All命令
查看網絡
docker network ls
查看網絡源數據
docker network inspect XXX網絡名字
刪除網絡
docker network rm XXX網絡名字
案例
能干嘛
容器間的互聯和通信以及端口映射
容器IP變動時候可以通過服務名直接網絡通信而不受到影響
網絡模式
總體介紹
bridge模式:使用–network bridge指定,默認使用docker0
host模式:使用–network host指定
none模式:使用–network none指定
container模式:使用–network container:NAME或者容器ID指定
容器實例內默認網絡IP生產規則
先啟動兩個ubuntu容器實例
2.docker inspect 容器ID or 容器名字
3.關閉u2實例,新建u3,查看ip變化
結論
docker容器內部的ip是有可能會發生改變的
案例說明
todo
案例說明
bridge
是什么
案例
說明
代碼
docker run -d -p 8081:8080 --name tomcat81 billygoo/tomcat8-jdk8
docker run -d -p 8082:8080 --name tomcat82 billygoo/tomcat8-jdk8
兩兩匹配驗證(
)
host
是什么(
)
案例
說明
代碼
警告
docker run -d -p 8083:8080 --network host --name tomcat83 billygoo/tomcat8-jdk8(
)
正確
docker run -d --network host --name tomcat83 billygoo/tomcat8-jdk8
無之前的配對顯示了,看容器實例內部(
在宿主機上分別執行:
docker inspect tomcat81
docker inspect tomcat82
docker inspect tomcat83
進入容器tomcat83查看網絡模式
docker exec -it tomcat83 bash
然后執行:ip addr
此時會看到tomcat83內部的網絡配置與宿主機的基本一致。
)
沒有設置-p的端口映射了,如何訪問啟動的tomcat83??(
)
none
是什么
禁用網絡功能,只有lo標識(就是127.0.0.1表示本地回環)
案例
docker run -d -p 8084:8080 --network none --name tomcat84 billygoo/tomcat8-jdk8(
)
container
是什么(
)
案例
docker run -d -p 8085:8080 --name tomcat85 billygoo/tomcat8-jdk8
docker run -d -p 8086:8080 --network container:tomcat85 --name tomcat86 billygoo/tomcat8-jdk8
運行結果(
)
案例2
Alpine操作系統是一個面向安全的輕型 Linux發行版(
)
docker run -it --name alpine1 alpine /bin/sh(
)
docker run -it --network container:alpine1 --name alpine2 alpine /bin/sh(
)
運行結果,驗證共用搭橋(
)
假如此時關閉alpine1,再看看alpine2(
)
自定義網絡
過時的link(
)
是什么
案例
before
案例
docker run -d -p 8081:8080 --name tomcat81 billygoo/tomcat8-jdk8
docker run -d -p 8082:8080 --name tomcat82 billygoo/tomcat8-jdk8
上述成功啟動并用docker exec進入各自容器實例內部
問題
按照IP地址ping是OK的(
)
按照服務名ping結果???(
)
after
案例
自定義橋接網絡,自定義網絡默認使用的是橋接網絡bridge
新建自定義網絡(
)
新建容器加入上一步新建的自定義網絡
docker run -d -p 8081:8080 --network zzyy_network --name tomcat81 billygoo/tomcat8-jdk8(
)
docker run -d -p 8082:8080 --network zzyy_network --name tomcat82 billygoo/tomcat8-jdk8(
)
互相ping測試(
)
問題結論
自定義網絡本身就維護好了主機名和ip的對應關系(ip和域名都能通)
自定義網絡本身就維護好了主機名和ip的對應關系(ip和域名都能通)
自定義網絡本身就維護好了主機名和ip的對應關系(ip和域名都能通)
Docker平臺架構圖解
整體說明
從其架構和運行流程來看,Docker 是一個 C/S 模式的架構,后端是一個松耦合架構,眾多模塊各司其職。
Docker 運行的基本流程為:
1 用戶是使用 Docker Client 與 Docker Daemon 建立通信,并發送請求給后者。
2 Docker Daemon 作為 Docker 架構中的主體部分,首先提供 Docker Server 的功能使其可以接受 Docker Client 的請求。
3 Docker Engine 執行 Docker 內部的一系列工作,每一項工作都是以一個 Job 的形式的存在。
4 Job 的運行過程中,當需要容器鏡像時,則從 Docker Registry 中下載鏡像,并通過鏡像管理驅動 Graph driver將下載鏡像以Graph的形式存儲。
5 當需要為 Docker 創建網絡環境時,通過網絡管理驅動 Network driver 創建并配置 Docker 容器網絡環境。
6 當需要限制 Docker 容器運行資源或執行用戶指令等操作時,則通過 Execdriver 來完成。
7 Libcontainer是一項獨立的容器管理包,Network driver以及Exec driver都是通過Libcontainer來實現具體對容器進行的操作。
整體架構
Docker-compose容器編排
是什么
Docker-Compose是Docker官方的開源項目, 負責實現對Docker容器集群的快速編排。(
)
能干嘛(
)
去哪下
官網
https://docs.docker.com/compose/compose-file/compose-file-v3/
官網下載
https://docs.docker.com/compose/install/
安裝步驟(
)
卸載步驟(
)
Compose核心概念
一文件
docker-compose.yml
兩要素
服務(service)
一個個應用容器實例,比如訂單微服務、庫存微服務、mysql容器、nginx容器或者redis容器
工程(project)
由一組關聯的應用容器組成的一個完整業務單元,在 docker-compose.yml 文件中定義。
Compose使用的三個步驟
編寫Dockerfile定義各個微服務應用并構建出對應的鏡像文件
使用 docker-compose.yml 定義一個完整業務單元,安排好整體應用中的各個容器服務。
最后,執行docker-compose up命令 來啟動并運行整個應用程序,完成一鍵部署上線
Compose常用命令
(
)
Compose編排微服務
改造升級微服務工程docker_boot
以前的基礎版
SQL建表建庫
一鍵生成說明
改POM
寫YML
主啟動
業務類
mvn package命令將微服務形成新的jar包 并上傳到Linux服務器/mydocker目錄下
編寫Dockerfile
構建鏡像
docker build -t zzyy_docker:1.6 .
不用Compose
單獨的mysql容器實例
新建mysql容器實例(
)
進入mysql容器實例并新建庫db2021+新建表t_user(
)
單獨的redis容器實例(
)
微服務工程(
)
上面三個容器實例依次順序啟動成功(
)
swagger測試
http://localhost:你的微服務端口/swagger-ui.html#/
上面成功了,有哪些問題?
先后順序要求固定,先mysql+redis才能微服務訪問成功
多個run命令…
容器間的啟停或宕機,有可能導致IP地址對應的容器實例變化,映射出錯, 要么生產IP寫死(可以但是不推薦),要么通過服務調用(
)
使用Compose
服務編排,一套帶走,安排
編寫docker-compose.yml文件(
docker-compose.yml文件內容如下
)
第二次修改微服務工程docker_boot(
DockerFile文件如下:
構建鏡像:
)
寫YML
通過服務名訪問,IP無關
mvn package命令將微服務形成新的jar包 并上傳到Linux服務器/mydocker目錄下
編寫Dockerfile
構建鏡像
docker build -t zzyy_docker:1.6 .
執行 docker-compose up 或者 執行 docker-compose up -d(
在執行up命令前,可以先檢查下yml文件是否有語法錯誤
)
進入mysql容器實例并新建庫db2021+新建表t_user(
)
測試通過
Compose常用命令
關停(
)
Docker輕量級可視化工具Portainer
是什么
Portainer 是一款輕量級的應用,它提供了圖形化界面,用于方便地管理Docker環境,包括單機環境和集群環境。
安裝
官網
https://www.portainer.io/
https://docs.portainer.io/v/ce-2.9/start/install/server/docker/linux
步驟
- docker命令安裝
docker run -d -p 8000:8000 -p 9000:9000
--name portainer
--restart=always
-v /var/run/docker.sock:/var/run/docker.sock
-v portainer_data:/data
portainer/portainer
- 第一次登錄需創建admin,訪問地址:xxx.xxx.xxx.xxx:9000
用戶名,直接用默認admin
密碼記得8位,隨便你寫
- 設置admin用戶和密碼后首次登陸
- 選擇local選項卡后本地docker詳細信息展示
- 上一步的圖形展示,能想得起對應命令嗎?
Docker容器監控之 CAdvisor+InfluxDB+Granfana
Docker容器監控之 CAdvisor+InfluxDB+Granfana
原生命令
操作(
)
問題(
)
是什么
容器監控3劍客
一句話
CAdvisor監控收集+InfluxDB存儲數據+Granfana展示圖表
CAdvisor(
)
InfluxDB(
)
Granfana(
)
總結(
)
compose容器編排,一套帶走
新建目錄(
)
新建3件套組合的 docker-compose.yml
啟動docker-compose文件
docker-compose up
查看三個服務容器是否啟動
測試
瀏覽cAdvisor收集服務,http://ip:8080/
第一次訪問慢,請稍等
cadvisor也有基礎的圖形展現功能,這里主要用它來作數據采集
瀏覽influxdb存儲服務,http://ip:8083/
瀏覽grafana展現服務,http://ip:3000
ip+3000端口的方式訪問,默認帳戶密碼(admin/admin)
配置步驟
配置數據源
選擇influxdb數據源
配置細節
1
2
配置面板panel
1
2
3
4
5
6
到這里cAdvisor+InfluxDB+Grafana容器監控系統就部署完成了