Docker 尚硅谷教程筆記(一)

 文章開端先感謝尚硅谷無私的開源精神 

  • 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 運行的基本流程:

  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容器運行資源或者執行用戶指令等操作時,則通過Exec Driver 來完成。
  7. 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中我們使用卷。並實現雙向讀寫。

特點:

  1. 數據卷可以再容器之間共享或重用數據
  2. 卷的更改可以直接實時生效
  3. 數據卷中的更改不會包含在鏡像的更新中
  4. 數據卷的生命週期一直持續到沒有容器使用它爲止

 

  • 查看容器卷是否掛在成功 docker inspect containerId 

Mouns節點下面的 Source 和 Destination 可以確定容器卷綁定的源和目標路徑

  1. docker修改,主機同步獲得
  2. 主機修改. docker同步獲得
  3. 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

  1. 從docker hub上(阿里雲加速器)拉取redis鏡像到本地標籤爲6.0.8
  2. 入門命令
  3. 命令提醒:容器卷記得加入--privileged=true
  4. 在Centos宿主機下新建目錄/app/redis mkdir -p/app/redis
  5. 將一個redis.conf文件模板拷貝進/app/redis目錄下 cp /myredis/redis.conf /app/redis
  6. /app/redis目錄下修改redis.conf文件  默認出廠的原始 redis.conf  

    允許redis外地鏈接:註釋掉#bind 127.0.0.1


    關閉redis後臺進程: 註釋掉 #daemonize yes 或者設置 daemonize no ;該配置和docker run 中 -d 參數衝突,會導致容器一直啓動失敗

  7. 使用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 #設置指定的文件
  8. 測試redis-cli連接上來
  9. 請證明docker啓動使用了我們自己指定的配置文件 

    redis默認的數據庫爲16個,修改redis 數據庫數來驗證 select 10

  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所需的指令和參數構成的腳本。

  1. 每條保留字指令都必須大寫字母且後面要跟隨至少一個參數
  2. 每條指令按照從上到下,順序執行
  3. #表示註釋
  4. 每條指令都會創建一個新的鏡像層並對鏡像進行提交

Docker 執行DockerFile的大致流程

  1. docker從基礎鏡像運行一個容器
  2. 執行一條指令並對容器作出修改
  3. 執行類似docker commit 的操作提交一個新的鏡像層
  4. docker 再基於剛提交的鏡像運行一個新容器
  5. 執行DockerFile中的下一條指令直到所有指令都執行完成

保留字指令

  1. FROM 基礎鏡像,當前新鏡像是基於哪個鏡像的,指定一個已經存在的鏡像作爲模板,第一條是from
  2. MAINTAINER 鏡像維護者的姓名和郵箱地址
  3. RUN 容器構建時需要運行的命令,有兩種格式,shell 格式 exec 格式,RUN 是在docker build 時運行

    RUN <命令行命令> #<命令行命令>等同於,在終端操作的shell命令


    RUN ["可執行文件",“參數一”,“參數二”] 例如:["./test.php","dev","offline"] 等價於RUN ./test.php dev offline

  4. EXPOSE 當前容器對外暴露的端口
  5. WORKDIR 指定創建容器後,終端登錄容器進入的目錄,一個落腳點 
  6. USER 指定該鏡像以什麼樣的用戶去執行,如果都不指定,默認是root
  7. ENV 用來構建鏡像過程中設置環境變量 
  8. ADD 將宿主機目錄下的文件拷貝進鏡像且會自動處理URL和解壓tar壓縮包
  9. COPY 類似於ADD,拷貝文件和目錄到鏡像中。將從構建上下文目錄中<源路徑>的文件/目錄複製到新的一層的鏡像內的<目標路徑>位置 COPY src dest | COPY["src","dest"]
  10. VOLUME 容器數據卷 ,用於數據保存和持久化工作
  11. CMD 指定容器啓動後要乾的事情                                     注意:DockerFile 中可以有多個CMD指令,但只有最後一個生效。CMD會被docker run 之後的參數替換。即啓動鏡像的時候 docker run ...... 參數替換。它和前面RUN的區別:CMD 是在docker run 時運行 。RUN 是在 docker build 時運行。
  12. 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

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章