文章開端先感謝尚硅谷無私的開源精神
- Docker 出現的原因:
單機版本中開發、運維環境依賴版本不一致。
集羣環境中相比單機安裝工作量增多、一不小心更容易錯。
Docker 可以輕鬆實現系統平滑移植,容器虛擬技術。
開發人員可以藉助Docker 消除寫作編碼時“在我機器上可以正常工作”的問題。
鏡像即應用:運行文檔、配置環境、運行環境、運行依賴包、操作系統發行版本、內核。
Docker 打破過往的【程序即應用】的觀念,投過鏡像將作業系統核心除外,運行應用程式所需要的的系統環境,由下到上打包,達到應用程式跨平臺間的無縫接軌運作。
Docker 理念
一次鏡像、處處運行。
Docker 是什麼
基於GO語言的雲開源項目。
Docker的主要目標是"Build,Ship and Run Any App,Anywhere" , 也就是通過對應用組件的封裝、分發、部署、運行等生命週期的管理,使用戶的APP (可以是一個WEB應用或數據庫應用等等)及其運行環境能夠做到“一次鏡像,處處運行"。
將應用打包成鏡像,通過鏡像成爲運行在Docker 鏡像上的實例,而Docker在任何操作系統上都是一致的,這就是實現了跨平臺、跨服務器。只需要一次配置好環境,換到別的機器上就可以一鍵部署好,簡化了操作。
解決了運行環境和配置問題的軟件容器,方便做持續集成並有助於整體發佈的容器虛擬化技術。
Docker 並非是一個通用的容器工具,它依賴於已存在並運行的Linux內河環境
Docker 實質上是在已經運行的Linux 下製造了一個隔離的文件環境,因此它執行的效率幾乎等同於所部署的Linux主機。因此Docker 必須部署在Linux內核的系統上。如果其他系統想部署Docker就必須安裝虛擬的Linux環境。
Docker和傳統虛擬化方式的不同之處
傳統虛擬化技術是虛擬出一套硬件後,在其上運行一套完成的操作系統,在該系統上再運行所需的應用進程。
容器內的進程直接運行於宿主的內核,容器內沒有自己的內核且也沒有進行硬件虛擬。因此容器要比傳統的虛擬機更輕便。
每個容器之間相互隔離,每個容器有自己的文件系統,容器之間進程不會相互影響,能區分計算資源。
Docker 的基本組成
鏡像:Image 只讀模板,鏡像用來創建Docker 容器,一個鏡像可以創建很多容器。
容器:Container 是鏡像創建的運行實例,容器是鏡像運行時的實體,容器爲鏡像提供了一個標準的和隔離的運行環境,他可以被啓動、開始、停止、刪除。每個容器都是相互隔離的、保證安全的平臺。容器可以被看作簡易版本的Linux和運行在其中的應用程序。
倉庫:Repository集中存放鏡像文件的場所,類似於Maven 倉庫、github。
Docker 是一個Client-Server結構的系統,Docker守護進程運行在主機上,然後通過Socket連接,從客戶端訪問,守護進程從客戶端接受命令並管理運行在主機上的容器。容器:一個運行時環境,就是前面說到的集裝箱。
Docker 運行的基本流程:
- 用戶使用Docker Client 與Docker Daemon 建立通信,並通過請求給後者。
- Docker Daemon 作爲Docker 架構中主體部分,首先提供Docker Server 的功能使其可以接受 Docker Client 的請求。
- Docker Engine 執行Docker內部的一系列工作,每一項工作都是以一個Job的形式存在。
- Job 的運行過程中,當需要容器鏡像時,則從Docker Registry 中下載鏡像(本地有則用本地的),並通過鏡像管理驅動graph Driver 將下載的鏡像以Graph的形式存儲。
- 當需要爲Docker創建網絡環境時,通過網絡管理驅動Network Driver 創建並配置Docker容器網絡環境。
- 當需要限制Docker容器運行資源或者執行用戶指令等操作時,則通過Exec Driver 來完成。
- Libcontainer 是一項獨立的容器管理包,Network Driver 以及Exec Driver 都是通過Libcontainer來實現具體對容器進行的操作。
Docker 安裝
配置Docker 鏡像加速地址
Docker 幫助啓動類命令
啓動docker: systemctl start docker
停止docker: systemctl stop docker
重啓docker: systemctl restart docker
查看docker狀態: systemctl status docker
開機啓動: systemctl enable docker
查看docker概要信息: docker info
查看docker總體幫助文檔: docker --help
查看docker命令幫助文檔: docker具體命令--help
Docker 鏡像命令
docker images 列出本地主機上的鏡像 -a 列出本地所有的鏡像 -q 只顯示鏡像ID
docker search imageName 搜索鏡像 --limit num imageName 分頁查詢
docker pull imageName:TAG 拉取鏡像 不寫TAG 相當於 docker pull imageName:latest
docker system df 查看鏡像、容器、數據卷所佔用的空間 -f 強制刪除
docker rmi imageName|| imageId 根據鏡像名稱或者鏡像ID刪除
docker rmi -f 鏡像名1:TAG 鏡像名2:TAG 刪除多個鏡像
docker rmi-f $(docker images -qa) 刪除全部鏡像
docker ps -q -a | xargs docker rm 刪除全部鏡像
虛懸鏡像(dangling image):倉庫名、標籤都是none的鏡像
容器命令
- 新建+啓動容器:docker run [option] image
--name=指定新名稱
-d 後臺運行容器並返回容器ID,也即啓動守護式容器(後臺運行)
-i 以交互模式運行容器,通常與-t同事使用;interactive
-t 爲容器重新分配一個僞輸入終端,通常與-i同時使用;tty
也即啓動交互式容器(前臺有僞終端,等待交互)
-P 隨機端口映射
-p 指定端口映射 -p 8080:80 (宿主機端口:容器暴露端口)
示例:docker run -it centos /bin/bash
使用鏡像centos:latest以交互模式啓動一個容器,在容器內執行/bin/bash命令,放在鏡像名後的是命令,這裏我們希望有個交互式Shell,因此用的是/bin/bash,要退出終端,直接輸入exit。
- 列出正在運行的容器:docker ps [options]
-a 列出當前所有正在運行的容器+歷史上運行過的
-l 顯示最近創建的容器
-n 顯示最近N個創建的容器
-q 靜默模式,只顯示容器編號
- 退出容器
exit run進去容器,exit退出,容器停止
ctrl+p+q run進去容器,ctrl+p+q退出,容器不停止
- 啓動已經停止的容器 docker start containerId | imageName
- 停止已經啓動的容器 docker stop containerId | imageName
- 強制停止已經啓動的容器 docker kill containerId | imageName
- 刪除已經停止的容器 docker rm containerId | imageName
- 啓動守護式容器 後臺運行 docker run -d imageName
這樣運行會docker ps 查看不到運行的容器
docker 容器後臺運行,就必須有一個前臺進程
容器運行的命令如果不是那些一直掛起的命令(比如top tail),就是會自動退出。
這個是docker的機制問題,比如你的web容器,我們以nginx爲例,正常情況下,我們配置啓動服務只需要啓動響應的service即可。例如 service nginx start 但是,這樣做nginx爲後臺進程模式運行,就導致docker前臺沒有運行的應用,這樣的容器後臺啓動後,會立即自殺因爲他覺得沒事可做了。所以解決方案:將你要運行的程序以前臺進程的形式運行,常見的就是命令行模式,表示我還有交互操作,別中斷。
- 查看容器日誌 docker logs containerId
- 查看容器內運行的進程 docker top containerId
- 查看容器內部細節 docker inspect containerId
- 進入容器並以命令行交互
docker exec -it containerId /bin/bash
docker attach containerId
二者區別:
attach 直接進入容器啓動命令終端,不會啓動新的進程,用exec直接退出,會導致容器停止。
exec 是在容器中打開新的終端,並且可以啓動新的進程,用exit退出,不會導致容器的停止。
推薦使用exec。
- 容器內拷貝文件到主機
docker cp containerId:容器內路徑 目標主機路徑
- 導入和導出容器(容器的備份與恢復)
export 導出容器的內容流作爲一個tar歸檔文件【對應import命令】
import 從tar包中的內容牀架你一個新的文件系統再導入爲鏡像【對應exort】
docker exort containerId > 文件名.tar
cat 文件名.tar | docker import -鏡像用戶/鏡像名:鏡像版本號
Docker 鏡像
鏡像時分層的。
UnionFS 聯合文件系統:Union文件系統是一種分層、輕量級並且高性能的文件系統,它支持對文件系統的修改作爲一次提交來一層一層的疊加,同時可以將不同的目錄掛載到同一個虛擬文件系統下。Union 文件系統是Docker鏡像的基礎。鏡像可以通過分層來進行繼承,基於基礎鏡像,可以製作各種具體的鏡像。特性:以此同時加載多個文件系統,但從外面看起來,只能看到一個文件系統,聯合加載會把各層文件系統疊加起來,這樣最終的文件系統會包含所有底層的文件和目錄。
Docker 像加載原理:
docker的鏡像實際上由一層一層的文件系統組成,這種層級的文件系統UnionFS。
bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是引導加載kernel, Linux剛啓動時會加載bootfs文件系統,在Docker鏡像的最底層是引導文件系統bootfs。這一層與我們典型的Linux/Unix系統是一樣的,包含boot加載器和內核。當boot加載完成之後整個內核就都在內存中了,此時內存的使用權已由bootfs轉交給內核,此時系統也會卸載bootfs。
rootfs (root file system) ,在bootfs之上,包含的就是典型Linux系統中的/dev, /proc, /bin, letc等標準目錄和文件。rootfs就是 科不同的操作系統發行版,比如Ubuntu, Centos等等。
對於一個精簡的os, rootfs可以很小,只需要包括最基本的命令、工具和程序庫就可以了,因爲底層直接用Host的kernel, 自己只需要提供rootfs就行了。由此可見對於不同的linux發行版, bootfs基本是一致的, rootfs會有差別,因此不同的發行版可以公用bootfs。
鏡像分層最大的一個好處就是共享資源,方便複製遷移,就是爲了複用。1比如說有多個鏡像都從相同的base 像構建而來,那麼Docker Host只需在磁盤上保存一份base銳像;同時內存中也只需加載一份base鏡像,就可以爲所有容器服務了。而且鏡像的每一層都可以被共享。
重點理解:Docker鏡像層都是隻讀的,容器層是可寫的。當容器啓動時,一個新的可寫層被加載到鏡像的頂部,這一層通常被稱作容器層,容器層之下都叫做鏡像層。
Docker commit命令 生成新鏡像
docker commit 提交容器副本使之成爲一個新的鏡像
docker commit -m="提交的描述信息" -a="作者" 容器ID 要創建的目標鏡像名:【標籤名】
發佈鏡像至阿里雲鏡像庫
略略略
發佈至私有鏡像庫
Docker Registry
docker run-d -p 5000:5000 -v /zzyyuse/myregistryl:/tmp/registry --privileged=true registry
- docker 容器內執行下面的命令:
apt-get update
apt-get install net-tools
- 容器外執行產生新鏡像
docker commit -m="提交的描述信息" -a"=作者" 容器ID 要創建的目標鏡像名[標籤名]
- 驗證私服庫是否存在鏡像
CURL-XGET http:192.168.162:5000/v2/_catalog
- 將新鏡像放入私服庫
按照公式: docker tag 鏡像:Tag Host:Port/Repository:Tag
示例:Docker tag zzyyubuntu:1.2 192.168.111.162:5000/zzyyubuntu:1.2
- 修改配置文件使之支持HTTP
cat /etc/docker/daemon. json
添加:"insecure-registries": ["192.168.111.162:5000"]
重啓Docker
- 推送鏡像到私服庫
docker push 192. 168. 111. 167: 5000/zzyyubuntu: 1. 2
- 拉取私有庫的鏡像
docker pull 192. 168. 111. 167: 5000/zzyyubuntu: 1. 2
容器數據卷 -v 宿主機的路徑:容器內的路徑(方便文件備份)
避坑:Docker掛載主機目錄訪問如果出現 cannot open directory . : Permission denied
解決辦法:掛載目錄後多加一個參數 --privileged=true
原因:如果是CentOS7安全模塊會比之前系統版本加強,不安全的會先禁止,所以目錄掛載的情況被默認爲不安全的行爲,在SELinux裏面掛載目錄被禁止掉了額,如果要開啓,我們一般使用-privileged=true命令,擴大容器的權限解決掛載目錄沒有權限的問題,也即使用該參數, container內的root擁有真正的root權限,否則, container內的root只是外部的,個普通用戶權限。
容器數據卷有點類似於redis的rdb和aof文件完成容器內數據的持久化並備份到本地主機目錄。
docker run -it --privileged=true -v /宿主機絕對路徑目錄:/容器內目錄 鏡像名
卷就是目錄或文件,存在於一個或多個容器中,由docker掛載到容器,但不屬於聯合文件系統,因此能夠繞過Union File System 提供一些用於持續存儲或共享數據的特性。
卷的設計就是數據的持久化,完全獨立於容器的生存週期,因此Docker不會在容器刪除時刪除其掛載的數據卷。
Docker 容器產生的數據如果不備份,那麼當容器示例刪除後,容器內的數據自然也就沒有了,爲了保存數據在Docker中我們使用卷。並實現雙向讀寫。
特點:
- 數據卷可以再容器之間共享或重用數據
- 卷的更改可以直接實時生效
- 數據卷中的更改不會包含在鏡像的更新中
- 數據卷的生命週期一直持續到沒有容器使用它爲止
- 查看容器卷是否掛在成功 docker inspect containerId
Mouns節點下面的 Source 和 Destination 可以確定容器卷綁定的源和目標路徑
- docker修改,主機同步獲得
- 主機修改. docker同步獲得
- docker容器stop 主機修改 docker容器重啓查看數據是否同步 ?答案:是
- 讀寫規則和規則說明
容器內部只讀權限:容器實例內部被限制,只能讀取不能寫
docker run -it --privileged=true -v/宿主機絕對路徑:/容器內目錄:ro 鏡像名
- 卷的繼承和共享(繼承的是父容器的規則,而不是卷文件)
docker run -it -privileged=true --volumes-from 父類容器別名 --name u2 imageName
docker 上軟件安裝
運行容器即可,注意參數。。。
docker pull image
docker run image
示例:簡單安裝mysql 可能遇到的問題:1、插入中文、可能報錯;2、刪除容器,數據也不復存在。
查看字符集編碼 show variables like 'character%'
#提高數據安全性;解決刪除容器,數據文件也被刪除的問題---掛載數據卷 日誌、數據、配置文件
docker run -d -p 3306:3306 --privileged=true
-v /zzyyuse/mysql/log:/var/1og/mysql
-v /zzyyuse/mysql/data:/var/lib/mysql
-v /zzyyuse/mysql/conf:/etc/mysql/conf.d
-e MYSQL_ROOT_PASSWORD=123456
--name mysql mysql:5.7
#解決插入中文亂碼問題---進入宿主機配置文件目錄,創建my.cnf
[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_genera_ci
character_set_server = utf8
#重啓mysql,之後新建的DB有效,需要重新建立DB
結論:docker 安裝完成mysql 並run出容器後,建議請先修改完成字符集編碼後再新建mysql數據庫-表-插入數據
示例安裝Redis
- 從docker hub上(阿里雲加速器)拉取redis鏡像到本地標籤爲6.0.8
- 入門命令
- 命令提醒:容器卷記得加入--privileged=true
- 在Centos宿主機下新建目錄/app/redis mkdir -p/app/redis
- 將一個redis.conf文件模板拷貝進/app/redis目錄下 cp /myredis/redis.conf /app/redis
- /app/redis目錄下修改redis.conf文件 默認出廠的原始 redis.conf
允許redis外地鏈接:註釋掉#bind 127.0.0.1
關閉redis後臺進程: 註釋掉 #daemonize yes 或者設置 daemonize no ;該配置和docker run 中 -d 參數衝突,會導致容器一直啓動失敗
- 使用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啓動使用了我們自己指定的配置文件
redis默認的數據庫爲16個,修改redis 數據庫數來驗證 select 10
- 測試redis-cli連接上來第2次
Docker 高級篇
- docker 中 mysql 主從複製
1.新建主服務器容器實例3307
docker run -p 3307:3306
--name mysq-master
-v /mydata/mysql-masterlog:/varlog/mysql
-v /mydata/mysql-master/data:/varlib/mysql
-v /mydata/mysal-master/conf:/etc/mysql
-e MYSQL_ROOT_PASSWORD=root
-d mysql:5.7
2.進入/mydata/mysql-master/conf目錄下新建my.cnf
[mysqld]
##設置server-id,同一局域網中需要唯一
server_id-101
##指定不需要同步的數據庫名稱
binlog-ignore-db=mysql
#開啓二進制日誌功能
log-bin=mall-mysql-bin1
##設置二進制日誌使用內存大小(事務)
binlog_cache_size=1M
##設置使用的二進制日誌格式(mixed, statement, row)
binlog_format=mixed
##二進制日誌過期清理時間,默認值爲0:表示不自動清理。
expire_logs_days=7
##跳過主從複製中遇到的所有錯誤或指定類型的錯誤,避免slave端複製中斷。
##如: 1062錯誤是指一些主鍵重複, 1032錯誤是因爲主從數據庫數據不一致
slave_skip_errors=1062
3.修改完配置後重啓master實例
docker restart mysql-master
4.進入mysql-master容器
docker exec -it mysql-master /bin/bash
5.master容器實例內創建數據同步用戶
CREATE USER 'slave'@'%' IDENTIFIED BY '123456;
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* To 'slave'@%;
6.新建從服務器容器實例3308
docker run -p 3308:3306
--name mysq-master
-v /mydata/mysql-slave/log:/varlog/mysql
-v /mydata/mysql-slave/data:/varlib/mysql
-v /mydata/mysal-slave/conf:/etc/mysql
-e MYSQL_ROOT_PASSWORD=root
-d mysql:5.7
7.進入/mydata/mysql-slave/conf目錄下新建my.cnf
[mysqld]
##設置server-id,同一局域網中需要唯一
server_id=102
##指定不需要同步的數據庫名稱
binlog-ignore-db=mysql
#開啓二進制日誌功能,以備salve作爲其他數據庫實例的master時使用
log-bin=mall-mysql-slave-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
8.修改完配置後重啓slave實例
docker restart mysql-slave /bin/bash
9.在主數據庫中查看主從同步狀態
show master status
10.進入mysal-slave容器
docker exec -it mysql-slave
11.在從數據庫中配置主從複製
change master to master-host='宿主機ip', master_user='slave', master-password='123456', master_port=3307, master_log_file='mall-mysal-bin.000001', master_log_pos=617,master_connect_retry=30;
master-host:主數據庫的IP地址;
master_port:主數據庫的運行端口;
masteruser:在主數據庫創建的用於同步數據的用戶賬號;
master_password:在主數據庫創建的用於同步數據的用戶密碼;
master_log_file:指定從數據庫要複製數據的日誌文件 通過查看主數據的狀態,獲取File參數;
master_log_pos:指定從數據庫從哪個位置開始複製數據,通過查看主數據的狀態,獲取Position參數;
master_connect retry:連接失敗重試的時間問隔,單位爲秒。
12.在從數據庫中查看主從同步狀態
show slave status \G
主要看
Slave IO Running: No
Slave SOL Running: No
13.在從數據庫中開啓主從同步
start slave
14.查看從數據庫狀態發現已經同步
show slave status \G
Slave IO Running: YES
Slave SOL Running: YES
15.主從複製測試
主數據庫創建數據庫-數據表-插入數據
從數據庫查看數據
Redis大廠面試
- Hash 取餘進行分區
2億條記錄就是2億個k,v,我們單機不行必須要分佈式多機。假設有N臺機器構成一個集羣,用戶每次讀寫操作都是根據公式hash(key) %N器E數,計算出哈希值,用來決定數據映射到哪一個節點上。
優點:簡單粗暴,直接有效, 只需要預估好數據規劃好節點,例如3臺、8臺、10臺,就能保證一段時間的數據支撐。使用Hash算法讓固定的一部分請求落到同一臺服務器上,這樣每臺服務器固定處理一部分請求(並維護這些請求的信息) ,起到負載均衡+分而治之的作用。
缺點:原來規劃好的節點,進行擴容或者縮容就比較麻煩了額,不管擴縮,每次數據變動導致節點有變動,映射關係需要重新進行計算,在服務器個數固定不變時沒有問題,如果需要彈性擴容或故障停機的情況下,原來的取模公式就會發生變化: Hash(key)/3會變成Hash(key)/7,此時地址經過取餘運算的結果將發生很大變化,根據公式獲取的服務器也會變得不可控。某個redis機器宕機了,由於臺數數量變化,會導致hash取餘全部數據重新洗牌 。
- 一致性Hash算法
一致性Hash算法背景:一致性哈希算法在1997年由麻省理工學院中提出的,設計目標是爲了解決分佈式緩存數據變動和映射問題,某個機器宕機了,分母數量改變了,自然取餘數不OK了。
算法構建一致性Hash環
服務器IP節點映射
key落到服務器的落鍵規則
優點:
缺點:
小結:
- 哈希槽分區
Hash 槽的計算
Docker 上Redis 3主3從案例
docker run
-d
--name redis-node-6 容器名字
--net host 使用宿主機的ip和端口,默認
--privileged=true 獲取宿主機root用戶權限
-v /data/redis/share/redis-node-1:/data redis:6.0.8 容器卷,宿主機地址:docker內部地址
--cluster-enabled yes 開啓redis集羣
--appendonly yes #開啓持久化
--port 6381 #redis 端口號
修改 --name redis-node-1 至 redis-node-6
--port 6381 至 6386
執行6次 創建並啓動 6個redis容器
進入隨意一個redis容器執行命令
redis-cli--cluster create 192.168.111.147:6381 192.168.111.147:6382 192.168.111.147:6383 192.168.111.147:6384 192.168.111.147:6385 192.168.111.147:6386 --cluster-replicas 1
--cluster-replicas 1 #表示master創建一個slave節點 主動分配 1對1 誰掛載誰的後面自己決定
以上代碼執行成功之後見下圖結果
- 進入一個redis容器查看集羣狀態 redis-cli -p 6381
cluster info
cluster nodes
集羣建立之後不能使用單機版命令進入集羣,這樣會發生存取錯誤、輸出路由跳轉異常信息、這是因爲集羣種存在槽位的問題。爲了防止路由失效需要添加-c參數進入集羣環境。
redis-cli -p 6381 -c
redis-cli --cluster check ip:host
- 主從容錯切換遷移
redis主機停掉,從機主動上位變爲主機。
主機停掉之後、從機主動上位變爲主機,原主機啓動之後、會變爲新的從機。
- 主從擴容
需求:3主3從變爲4主4從
1.新建6387,6388兩個節點+新建後啓動+查看是否8節點
2.進入6387容器實例內部 docker exec-it redis-node-7/bin/bash
3.將新增的6387節點(空槽號)作爲master節點加入原集羣
redis-cli --cluster add-node ip:6387 ip:6381
#6387就是將要作爲master新增節點6381就是原來集羣節點裏面的領路人,相當於6387拜拜6381的碼頭從而找到組織加入集羣
4.檢查集羣情況第1次
redis-cli --cluster check ip:6381
此時可以看出沒有槽位
5.重新分派槽號
redis-cli --cluster reshard ip:6381
6.檢查集羣情況第2次
redis-cli --cluster reshard ip:6381
每個原來的主機把槽位分別分給新的主機
slots: [0-1364] [5461-6826] [ 10923-12287] (4096 slots) master
7.爲主節點6387分配從節點6388
redis-cli --cluster add-node 192.168.111.167:6388 192.168.111.167:6387 --cluster-slave --cluster-master-id e4781f644d4a4e4d4b4d107157b9ba8144631451-----這個是6387的編號,按照自己實際情況
8.檢查集羣情況第3次
- 主從縮容
需求:4主4從變爲3主3從,先刪從節點
1.目的: 6387和6388下線
2.檢查集羣情況 獲得6388的節點ID
redis-cli --cluster check ip:host
3.將6388刪除從集羣中將4號從節點6388刪除
redis-cli --cluster del-node ip:從機端口 從機ID
4.將6387的槽號清空,重新分配,本例將清出來的槽號都給6381
redis-cli --cluster reshard ip:6381
5.檢查集羣情況第二次
redis-cli --cluster check ip:host
6.將6387刪除
redis-cli --cluster del-node ip:端口 刪除容器id
7.檢查集羣情況第三次中
redic-cli -- cluster check ip:host
Docker File
DockerFile 是構建Docker鏡像的文本文件,是由一條條構建頸線IG所需的指令和參數構成的腳本。
- 每條保留字指令都必須大寫字母且後面要跟隨至少一個參數
- 每條指令按照從上到下,順序執行
- #表示註釋
- 每條指令都會創建一個新的鏡像層並對鏡像進行提交
Docker 執行DockerFile的大致流程
- docker從基礎鏡像運行一個容器
- 執行一條指令並對容器作出修改
- 執行類似docker commit 的操作提交一個新的鏡像層
- docker 再基於剛提交的鏡像運行一個新容器
- 執行DockerFile中的下一條指令直到所有指令都執行完成
保留字指令
- FROM 基礎鏡像,當前新鏡像是基於哪個鏡像的,指定一個已經存在的鏡像作爲模板,第一條是from
- MAINTAINER 鏡像維護者的姓名和郵箱地址
- RUN 容器構建時需要運行的命令,有兩種格式,shell 格式 exec 格式,RUN 是在docker build 時運行
RUN <命令行命令> #<命令行命令>等同於,在終端操作的shell命令
RUN ["可執行文件",“參數一”,“參數二”] 例如:["./test.php","dev","offline"] 等價於RUN ./test.php dev offline
- EXPOSE 當前容器對外暴露的端口
- WORKDIR 指定創建容器後,終端登錄容器進入的目錄,一個落腳點
- USER 指定該鏡像以什麼樣的用戶去執行,如果都不指定,默認是root
- ENV 用來構建鏡像過程中設置環境變量
- ADD 將宿主機目錄下的文件拷貝進鏡像且會自動處理URL和解壓tar壓縮包
- COPY 類似於ADD,拷貝文件和目錄到鏡像中。將從構建上下文目錄中<源路徑>的文件/目錄複製到新的一層的鏡像內的<目標路徑>位置 COPY src dest | COPY["src","dest"]
- VOLUME 容器數據卷 ,用於數據保存和持久化工作
- CMD 指定容器啓動後要乾的事情 注意:DockerFile 中可以有多個CMD指令,但只有最後一個生效。CMD會被docker run 之後的參數替換。即啓動鏡像的時候 docker run ...... 參數替換。它和前面RUN的區別:CMD 是在docker run 時運行 。RUN 是在 docker build 時運行。
- ENTRYPOINT 也是用來指定一個容器啓動時要運行的命令,類似於CMD指令,但是 ENTRYPOINT 不會被docker run 後面的指令覆蓋,而且這些命令行參數會被當做參數送給ENTRYPOINT 指令指定的程序
- 構建DockerFile
docker build -t 新鏡像名字:TAG .
- 虛懸鏡像
刪除:docker image prune
- docker運行微服務
編寫Dockerfile
構建鏡像
docker build -t imageName:imageTag
運行鏡像
docker run -d -p 宿主機host:容器host imageId