docke筆記下篇

本地鏡像發布到阿里云

本地鏡像發布到阿里云流程

在這里插入圖片描述

鏡像的生成方法

基于當前容器創建一個新的鏡像,新功能增強 docker commit [OPTIONS] 容器ID [REPOSITORY[:TAG]]
OPTIONS說明:

OPTIONS說明:
-a :提交的鏡像作者;
-m :提交時的說明文字;
在這里插入圖片描述
在這里插入圖片描述

將本地鏡像推送到阿里云

本地鏡像素材原型
在這里插入圖片描述
阿里云開發者平臺
在這里插入圖片描述

創建倉庫鏡像

  1. 選擇控制臺,進入容器鏡像服務
    在這里插入圖片描述
  2. 選擇個人實例

在這里插入圖片描述

  1. 命名空間
    在這里插入圖片描述
    在這里插入圖片描述
  2. 倉庫名稱
    在這里插入圖片描述
    在這里插入圖片描述
    在這里插入圖片描述
  3. 進入管理界面獲得腳本
    在這里插入圖片描述

將鏡像推送到阿里云

管理界面腳本
在這里插入圖片描述
腳本實例

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命令

  1. 從Hub上下載ubuntu鏡像到本地并成功運行
  2. 原始的Ubuntu鏡像是不帶著ifconfig命令的
    在這里插入圖片描述
  3. 外網連通的情況下,安裝ifconfig命令并測試通過
    docker容器內執行上述兩條命令:
apt-get update
apt-get install net-tools

在這里插入圖片描述
在這里插入圖片描述

  1. 安裝完成后,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中我們使用卷。
特點:

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

數據卷案例

宿主vs容器之間映射添加容器卷

  1. 直接命令添加
    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

在這里插入圖片描述

  1. 容器和宿主機之間數據共享
    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常規安裝簡介

總體步驟

  1. 搜索鏡像
  2. 拉取鏡像
  3. 查看鏡像
  4. 啟動鏡像 - 服務端口映射
  5. 停止容器
  6. 移除容器

安裝tomcat

  1. docker hub上面查找tomcat鏡像
docker search tomcat

在這里插入圖片描述

  1. 從docker hub上拉取tomcat鏡像到本地
docker pull tomcat

在這里插入圖片描述在這里插入圖片描述

  1. docker images查看是否有拉取到的tomcat
    在這里插入圖片描述
  2. 使用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

  1. 從docker hub上(阿里云加速器)拉取redis鏡像到本地標簽為6.0.8
    在這里插入圖片描述
  2. 入門命令
    在這里插入圖片描述
  3. 命令提醒:容器卷記得加入–privileged=true
    Docker掛載主機目錄Docker訪問出現cannot open directory .: Permission denied
    解決辦法:在掛載目錄后多加一個–privileged=true參數即可
  4. 在CentOS宿主機下新建目錄/app/redis
mkdir -p /app/redis

在這里插入圖片描述

  1. 將一個redis.conf文件模板拷貝進/app/redis目錄下
    在這里插入圖片描述
    將準備好的redis.conf文件放進/app/redis目錄下
  2. /app/redis目錄下修改redis.conf文件
    默認出廠的原始redis.conf
    redis.conf
  3. 使用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

在這里插入圖片描述

  1. 測試redis-cli連接上來
    在這里插入圖片描述
docker exec -it 運行著Rediis服務的容器ID redis-cli
  1. 請證明docker啟動使用了我們自己指定的配置文件
    修改前
    在這里插入圖片描述
    我們用的配置文件,數據庫默認是16個
    修改后
    在這里插入圖片描述
    宿主機的修改會同步給docker容器里面的配置。記得重啟服務
  2. 測試redis-cli連接上來第2次
    在這里插入圖片描述

安裝MySQL主從復制

主從復制原理

參考

主從搭建步驟

  1. 新建主服務器容器實例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
  1. 進入/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
  1. 修改完配置后重啟master實例
docker restart mysql-master
  1. 進入mysql-master容器
docker exec -it mysql-master /bin/bash
mysql -uroot -proot
  1. master容器實例內創建數據同步用戶
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
  1. 新建從服務器容器實例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
  1. 進入/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
  1. 修改完配置后重啟slave實例
docker restart mysql-slave
  1. 在主數據庫中查看主從同步狀態
show master status;
  1. 進入mysql-slave容器
docker exec -it mysql-slave /bin/bash
mysql -uroot -proot
  1. 在從數據庫中配置主從復制
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:連接失敗重試的時間間隔,單位為秒。

  1. 在從數據庫中查看主從同步狀態
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鏡像的文本文件,是由一條條構建鏡像所需的指令和參數構成的腳本。
概述
在這里插入圖片描述
官網
構建三步驟

  1. 編寫Dockerfile文件
  2. docker build 命令構建鏡像
  3. docker run 鏡像 運行容器實例

DockerFile構建過程解析

Dockerfile內容基礎知識

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

Docker執行Dockerfile的大致流程

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

小總結

從應用軟件的角度來看,Dockerfile、Docker鏡像與Docker容器分別代表軟件的三個不同階段,
● Dockerfile是軟件的原材料
● Docker鏡像是軟件的交付品
● Docker容器則可以認為是軟件鏡像的運行態,也即依照鏡像運行的容器實例
Dockerfile面向開發,Docker鏡像成為交付標準,Docker容器則涉及部署與運維,三者缺一不可,合力充當Docker體系的基石。
在這里插入圖片描述

  1. Dockerfile,需要定義一個Dockerfile,Dockerfile定義了進程需要的一切東西。Dockerfile涉及的內容包括執行代碼或者是文件、環境變量、依賴包、運行時環境、動態鏈接庫、操作系統的發行版、服務進程和內核進程(當應用進程需要和系統服務和內核進程打交道,這時需要考慮如何設計namespace的權限控制)等等;
  2. Docker鏡像,在用Dockerfile定義一個文件之后,docker build時會產生一個Docker鏡像,當運行 Docker鏡像時會真正開始提供服務;
  3. 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寫一個

  1. vim Dockerfile
from ubuntu
CMD echo 'action is success'
  1. 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

步驟

  1. 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 
  1. 第一次登錄需創建admin,訪問地址:xxx.xxx.xxx.xxx:9000

用戶名,直接用默認admin
密碼記得8位,隨便你寫
在這里插入圖片描述

  1. 設置admin用戶和密碼后首次登陸
    在這里插入圖片描述
  2. 選擇local選項卡后本地docker詳細信息展示
    在這里插入圖片描述
  3. 上一步的圖形展示,能想得起對應命令嗎?
    在這里插入圖片描述

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容器監控系統就部署完成了

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/96517.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/96517.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/96517.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《大數據之路1》筆記2:數據模型

一 數據建模綜述 1.1 為什么要數據建模背景&#xff1a; 隨著DT時代的來臨&#xff0c;數據爆發式增長&#xff0c;如何對數據有序&#xff0c;有結構地分類組織額存儲是關鍵定義&#xff1a; 數據模型時數據組織和存儲的方法&#xff0c;強調從業務、數據存取、使用角度 合理存…

“量子能量泵”:一種基于并聯電池與電容陣的動態直接升壓架構

“量子能量泵”&#xff1a;一種基于并聯電池與電容陣的動態直接升壓架構摘要&#xff1a;本文揭示了一種革命性的高效電源解決方案&#xff0c;旨在徹底解決低電壓、大功率應用中的升壓效率瓶頸與電池一致性難題。該方案摒棄傳統磁性升壓拓撲&#xff0c;創新性地采用并聯電池…

DeepSeek實戰--自定義工具

1. 背景 當前已經有很多AI基礎平臺&#xff08;比如&#xff1a;扣子、Dify&#xff09;&#xff0c;用戶可以快速搭建Agent&#xff0c;那怎樣將已有的接口能力給大模型調用呢 &#xff1f; 今天我們來探索一個&#xff0c;非常高效、快捷的方案&#xff1a;將http接口做成Dif…

“移動零”思路與題解

給定一個數組 nums&#xff0c;編寫一個函數將所有 0 移動到數組的末尾&#xff0c;同時保持非零元素的相對順序。請注意 &#xff0c;必須在不復制數組的情況下原地對數組進行操作。思路講解&#xff1a;舉例如下&#xff1a;實現代碼是&#xff1a;class Solution { public:v…

關于行內元素,行內塊元素和塊級元素

1、什么是行內元素&#xff0c;什么是行內塊元素&#xff0c;什么是塊級元素行內元素的特點&#xff1a;不獨占一行&#xff0c;相鄰元素會在同一行顯示&#xff0c;直到一行排不下才換行。寬度和高度由內容本身決定&#xff0c;無法通過width&#xff0c;height手動設置&#…

?絡請求Axios的概念和作用

Axios 是一個基于 ??Promise?? 的輕量級、高性能 ??HTTP 客戶端庫??&#xff0c;主要用于在瀏覽器和 Node.js 環境中發起 HTTP 請求&#xff08;如 GET、POST、PUT、DELETE 等&#xff09;。它通過簡潔的 API 和強大的功能&#xff0c;簡化了前端與后端之間的數據交互過…

在AgentScope中實現結構化輸出

在AgentScope中實現結構化輸出 概述 在AgentScope框架中&#xff0c;結構化輸出功能允許開發者定義明確的輸出模式&#xff0c;確保AI模型的響應符合預期的格式和約束。本教程將介紹如何使用AgentScope的structured_model參數來實現結構化輸出。 結構化輸出的優勢 數據一致性&a…

Linux 磁盤I/O高占用進程排查指南:從定位到分析的完整流程

在Linux服務器運維工作中&#xff0c;磁盤I/O瓶頸是導致系統性能下降的常見原因之一。當服務器出現響應緩慢、應用卡頓等問題時&#xff0c;及時定位并解決高I/O占用進程就顯得尤為重要。本文將從核心思路出發&#xff0c;通過“確認問題-定位磁盤-鎖定進程-深入分析”四個步驟…

解決React中通過外部引入的css/scss/less文件更改antDesign中Modal組件內部的樣式不生效問題

不生效原因Ant Design 的 Modal 默認通過 ReactDOM.createPortal 掛在 <body> 下&#xff0c;與你的組件樹平級&#xff0c;所以寫在 .module.css / scoped less 里的選擇器根本匹配不到它&#xff0c;就算寫全局樣式&#xff0c;也可能因為權重不足或異步掛載時機而“看…

day41 51單片機最小系統、GPIO控制、時序邏輯器件(74HC138/595)與LED點陣驅動原理

day41 51單片機最小系統、GPIO控制、時序邏輯器件&#xff08;74HC138/595&#xff09;與LED點陣驅動原理一、嵌入式系統基礎概念 1.1 嵌入式系統定義先設計硬件&#xff0c;基于硬件設計軟件實現一個具體的功能 —— 專用的計算機系統硬件/軟件可剪裁&#xff1a;根據功能需求…

html列表總結補充

1.有序列表的type屬性不同的type值表示不同的排序標號1 表示列表項目用數字標號&#xff08;1,2,3...&#xff09; 1 a 表示列表項目用小寫字母標號&#xff08;a,b,c...&#xff09; 2 A 表示列表項目用大寫字母標號&#xff08;A,B,C...&#xff09; 3 i 表示列表項目用小寫羅…

smartctl Current_Pending_Sector 硬盤待處理扇區

smartctl -a /dev/sdae當前值: 312 個待處理扇區 嚴重警告信號&#xff0c;硬盤發現了 312 個可疑扇區&#xff0c;正在等待重新分配 197 Current_Pending_Sector 0x0022 100 100 000 Old_age Always - 312讀取錯誤頻發 錯誤計數: 38 次 ATA 錯誤 …

MATLAB1-基本操作和矩陣輸入-臺大郭彥甫

目錄 基礎的指令 format 矩陣和向量 找出某行某列的矩陣元素 快速打出多個矩陣或者向量 矩陣連接 矩陣計算 一些特殊矩陣fuction 矩陣相關函數 基礎的指令 clc 清空命令行窗口 clear all 清空工作區的全部變量 who 將工作區的全部變量顯示出來 whos 工作區的變量信息詳…

【CSS 3D 交互】實現精美翻牌效果:從原理到實戰

效果圖 前言 在現代網頁設計中&#xff0c;交互效果是提升用戶體驗的重要手段。3D 翻牌效果作為一種常見的交互模式&#xff0c;廣泛應用于卡片展示、問答切換、產品詳情等場景。本文將詳細介紹如何使用 CSS 3D 技術實現一個精美的翻牌效果&#xff0c;并深入解析其實現原理。…

Python核心技術開發指南(062)——靜態方法

版權聲明 本文原創作者:谷哥的小弟 作者博客地址:http://blog.csdn.net/lfdfhl 靜態方法的定義 靜態方法是類中定義的一種特殊方法,它不需要依賴類實例或類本身即可調用,也不隱含傳遞self(實例引用)或cls(類引用)參數。在Python中,通過@staticmethod裝飾器來定義靜態…

炒股進階理論知識

學完前面的《從零開始學炒股》這樣的入門課程后&#xff0c;你已經有了一個基本的框架&#xff0c;接下來需要做的是深化、拓展和建立自己的交易系統。以下是為你量身定制的后續學習路徑和理論知識建議&#xff0c;分為幾個核心模塊&#xff1a;模塊一&#xff1a;技術分析的深…

華為OD機試真題-跳馬-OD統一考試(C卷)

題目描述: 馬是象棋(包括中國象棋和國際象棋)中的棋子,走法是每步直一格再斜一格,即先橫著或直著走一格,然后再斜著走一個對角線,可進可退,可越過河界,俗稱“馬走‘日’字。 給頂m行n列的棋盤(網格圖),棋盤上只有有棋子象棋中的棋子“馬”,并且每個棋子有等級之分,…

PyTorch 模型保存與加載 (速查版)

文章目錄1. 推理用: 保存 & 加載權重 (最常見)2. 繼續訓練用: 保存 & 加載完整狀態3. 微調用: 部分加載 (分類頭不同等情況)1. 推理用: 保存 & 加載權重 (最常見) import torch import torch.nn as nnmodel nn.Linear(10, 2)# 保存權重 torch.save(model.state_d…

oneshape acad數據集 sam-dataset

Full Text Search - Hugging Face sketchai (Sketch AI)

0913刷題日記

今日計劃10道1/10兩眼一睜就是刷209. 長度最小的子數組target 396893380 超時頭疼看下題解我的問題在于&#xff0c;中間有一個又寫了一個遍歷&#xff0c;思路和滑動窗口差不多&#xff0c;但是那個遍歷就把時間倍數了。頭疼還能做題&#xff0c;你很棒了,身體健康最重要。沒…