linux8 redis集羣槽+docker

docker pull hello-world #不能推送,要把名字改一下php

錯誤1 :

私有倉庫搭建:node

剛開始 : 報錯: server gave http response to https client #只支持https的格式,不支持http的,要改一下http的 http的不支持默認支持https的python

改一下 :mysql

vim /etc/docker/daemon.json  
    2.寫入以下信息,地址改爲你本身的ip
    {"registry-mirrors": ["http://f1361db2.m.daocloud.io"],
        "insecure-registries":["192.168.16.142:5000"]
    }

正確:linux

[root@liu ~]# docker push 192.168.230.132:5000/s20-hello-world
The push refers to a repository [192.168.230.132:5000/s20-hello-world]
af0b15c8625b: Pushed
latest: digest: sha256:92c7f9c92844bbbb5d0a101b22f7c2a7949e40f8ea90c8b3bc396879d95e899a size: 524git

linux第八天筆記
學習python的第86天github

1.redis-cluster集羣

背景

1 併發問題

2 數據另太大  
新浪微博  這麼大的數據 ,去哪買內存條,
思想: 數據分片存儲在多個redis中
集羣: twitter 開源 
​       codis 豌豆莢 開發c 和 go開發 
很差的: 一臺機器,超載了

正確的是  分佈式,加機器,分攤集中式壓力,一堆機器作一件事(計算機是跟生活中的東西很是類似的),分了馬鞍,馬背上

按key分片,實例化多個馬
節點取餘分類 
虛擬槽分區(官方)

槽分類

redis-cluster集羣搭建
1.環境準備,6個redis數據庫節點web

​ 也就是準備6個配置文件,6匹馬
​ redis-7000.conf
​ redis-7001.conf
​ redis-7002.conf
​ redis-7003.conf
​ redis-7004.conf
​ redis-7005.conf
​ #每一個配置文件的內容,僅僅是端口的不一樣7000~7005
​ #內容以下面試

​ port 7000
​ daemonize yes
​ dir "/opt/redis/data/7000"
​ logfile "7000.log"
​ dbfilename "dump-7000.rdb"
​ cluster-enabled yes #開啓集羣模式
​ cluster-config-file nodes-7000.conf  #集羣內部的配置文件
​ cluster-require-full-coverage no 
​ #redis cluster須要16384個slot都正常的時候才能對外提供服務,換句話說,只要任何一個slot異常那麼整個cluster不對外提供服務。 所以生產環境通常爲noredis

2.快速生成6個節點的配置文件
mkdir -p /opt/redis/data/{7000,7001,7002,7003,7004,7005}
sed "s/7000/7001/g" redis-7000.conf > redis-7001.conf
.....

3.啓動6個redis節點(準備好了6匹馬)
redis-server redis-7000.conf
.....

4.馬兒準備好了,分配槽位,開始放入數據,查看數據流向
開啓redis-cluster的集羣功能,以及分配redis的slot槽位,基於ruby語言的腳本工具自動分配

1.下載ruby的解釋器

​ wget https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.1.tar.gz

2.解壓縮ruby的源碼包
tar -zxvf ruby-2.3.1.tar.gz
3.進入ruby的源碼包目錄,編譯三部曲
cd ruby-2.3.1
./configure --prefix=/opt/ruby231
make && make install

3.配置ruby的環境變量
vim /etc/profile
寫入PATH=""

4.讀取這個/etc/profile
source /etc/profile

5.下載ruby操做redis的模塊
wget http://rubygems.org/downloads/redis-3.3.0.gem
#安裝ruby操做redis的模塊
gem install -l redis-3.3.0.gem (ruby 解釋器 gem 相似於pip 包管理工具)

6.一鍵分配redis集羣的槽位
#查找一下這個命令的絕對路徑
find / -name redis-trib.rb
#這個數字 1 表明,每一個redis主庫,只有一個redis從庫
/opt/redis-4.0.10/src/redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 #(若是懼怕主從都掛了的話就把那個1 設置爲多個從)殺死主進程奴進程上位

7.開啓了集羣狀態功能後,登陸數據庫,查看數據寫入流向

​ /opt/redis-4.0.10/src/redis-trib.rb add-node --slave 127.0.0.1:7003 127.0.0.1:7000

8.防止redis-cluster主節點故障,能夠搭配 redis-cluster + redis-sentinel ,用哨兵檢測主節點狀態,當主節點宕機,自動切換從節點爲新的主庫

1.redis-sentinel配置方式以下,檢測三個主節點7000  7001  7002
port 27379
dir "/var/redis/data"
logfile "26379.log"
sentinel monitor master1 127.0.0.1 7000 2  
sentinel monitor master2 127.0.0.1 7001 2  
sentinel monitor master3 127.0.0.1 7002 2  

sentinel down-after-milliseconds master1 30000  
sentinel down-after-milliseconds master2 30000  
sentinel down-after-milliseconds master3 30000  

sentinel parallel-syncs master1 1  
sentinel parallel-syncs master2 1  
sentinel parallel-syncs master3 1  

sentinel failover-timeout master1 180000  
sentinel failover-timeout master2 180000  
sentinel failover-timeout master3 180000  

2.啓動哨兵,檢測cluster的主節點
redis-sentinel redis-26379.conf

3.殺死redis-cluster的主節點,查看從節點狀態(是否自動重啓),能夠運行多個從節點,保證數據安全
查看集羣狀態
redis-cli -p 7000 cluster info
redis-cli -p 7000 cluster nodes  #等同於查看nodes-7000.conf文件節點信息        (主僕關係
查看一組的全部的狀態)

查看主僕命令,長的碼對應三對主僕

在進入redis-cli
輸入:ping
回覆:pong --->鏈接成功(不是在外面(是ping baidu.com))

問題1:

CLUSTERDOWN Hash slot not served

未提供clusterdown哈希槽

當給redis-cli -c -p 7005 get name時,出現的錯誤,發現當redis-cli -p 7005 cluster nodes 時,只有一個 7005master的信息(0 connected),沒有別的,並且,查看別的服務器信息時,發現有一個salve fail(未鏈接)

當沒給他寫值卻讀取值是就顯示這個錯誤

​ /opt/redis-4.0.10/src/redis-trib.rb fix 127.0.0.1:7005 執行這條命令以後即可以get 數據,說明給了哈希槽了,可是仍是沒有鏈接 到大部隊

問題2 :

error

操做不知哪兒出錯了 master.fail (not connected) 把dphp.rdb 存放數據的刪除了,可是仍是不行
老師讓: 從新定義了端口,把六個端口都改了才能夠的

錯誤虛擬不分配了不鏈接

瑣碎的知識點

cat /etc/os-release #查看當前版本

docker rmi fce

Error response from daemon: conflict: unable to delete fce289e99eb9 (must be forced) - image is being used by stopped container 812abef0cef8
有依賴關係   : docker rm 812

(一層層刪除)

問題3 :
建立容器的時候報錯WARNING: IPv4 forwarding is disabled. Networking will not work.

# docker run -it -p 30001:22 --name=centos-ssh  centos /bin/bash

WARNING: IPv4 forwarding is disabled. Networking will not work.  
 
解決辦法:

# vim  /usr/lib/sysctl.d/00-system.conf
添加以下代碼:
net.ipv4.ip_forward=1
 
重啓network服務
# systemctl restart network
 查看是否開啓了
[root@liu ~]# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1

## 完成之後,刪除錯誤的容器,再次建立新容器,就再也不報錯了。
# 做者:Locutus 
來源:CSDN 
原文:https://blog.csdn.net/yjk13703623757/article/details/68939183 
版權聲明:本文爲博主原創文章,轉載請附上博文連接!
錯誤 3:

/usr/bin/docker-current: Error response from daemon: oci runtime error: container_linux.go:235: starting container process caused "exec: "python.app.py": executable file not found in $PATH".

docker run -d -P training/webapp python.app.py

docker run -d -P training/webapp python app.py

多寫了個一個點

現象1
會變得啊
[root@liu ~]# docker port 85f
5000/tcp -> 0.0.0.0:32769
[root@liu ~]# docker stop 85f
85f
[root@liu ~]# docker start 85f
85f
[root@liu ~]# docker port 85f
5000/tcp -> 0.0.0.0:32770

執行 flask的程序 時,有文件的

root@85f2e9063034:/opt/webapp# ls
Procfile  app.py  requirements.txt  tests.py

2 docker

vmare虛擬化內存倆個g, 數值是技術手段實現的假的

docker :也是經過虛擬化搭建的假的,輕量級的虛擬化

docker 和虛擬機對比

docker對比

用途:
ali   多少萬 不少
jidong   15萬個docker業務所有實例化
由go所寫,因此併發厲害

:開源 由go寫的 ,因此 go爲何火 還有區塊鏈

python  以前16 shi openstack  如今ai tensflow

: 對linux的封裝 ,

: 簡單開發

以前部署 :

app <--->  os  <---> 物理

虛擬化 hypervisor    appliaca(centos) 

: 虛擬機是完整的操做系統 ,要分配系統資源,卡

一棟樓一戶人家  一個樓房一戶人家    膠囊房

物理機             虛擬機     容器

能用圖不寫字

容器是吧這個進程命令,文件放到一個docker鏡像中取運行至關於在python3 manage.py runserver 這個鏡像上,批了一個馬甲

docker容器

環境配置

每臺計算機的環境不一樣,如何換一臺機器能運行起來呢?

把配置完整的複製過去 到另外一個

管理 - 克隆

笑話 : 開發和測試 開發和運維(環境問題)

解決方案二 linux容器

自從用上docker容器後,能夠實現開發、測試和生產環境的統一化和標準化

iso 刻錄 ,用此安裝好,全部的是同樣的

三個生命週期

鏡像image # 至關於類,老闆的光盤

容器container

倉庫repository #存放鏡像文件的,公共的倉庫 dockerhub.com github.com

docker整個生命週期就是這三個概念

基於老闆賣的dvd光盤,安裝操做系統

基於鏡像,運行容器實例

鏡像 理解爲python的class

容器 理解爲python的類的實例化

容器也是能夠自定義更改,在生成新的 鏡像文件的

class foo():

def __init__(self):
    self.name ='他大舅。。。'

f1 = foo()

面試(太白,大金鍊子)

敲門的禮儀,技術水平,都要,合做夥伴,

技術好,人又謙虛,不太狂(也不要,相處共事由於)

阿里源 可能版本低

性格:

不走進去,出不來,出錯隨時(之前的缺點弱點),可是不要沉溺墮落。知來者只可追、

2. 1.docker的安裝方式

ce 社區版
ee 企業版

安裝方式
1.選擇官方的docker yum源,網速太慢

2.因爲網速問題,選擇阿里雲的docker軟件

yum install docker -y

3.啓動docker
systemctl start docker

4.檢查docker運行狀態,以及版本信息

docker version

5.配置docker加速器
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
這個命令是修改/etc/docker/daemon.json文件,寫入一個json數據以下
[root@s20 ~]# cat /etc/docker/daemon.json
{"registry-mirrors": ["http://f1361db2.m.daocloud.io"]}
配置好了docker加速器,下載鏡像就快不少了


6.下載centos的docker鏡像

docker pull centos #是取dockerhub 下載cnetos鏡像的

7.學習管理容器,鏡像,倉庫的增刪改查
容器
docker run 鏡像名/鏡像id #運行處容器進程實例
docker ps #查看正在運行的容器進程
docker ps -a #顯示全部運行過的容器進程(正在運行的,以及掛掉的容器進程)
docker container ls -a #同上,舊的命令

容器管理的重要點!!!

容器管理的重要點!!!

容器管理的重要點!!!

容器管理的重要點!!!

docker容器中必須有進程在後臺運行,不然容器掛掉!!!
docker鏡像每次運行 都會生成新的容器id記錄
docker run hello-world 運行三次,出現三次容器新的記錄
docker run hello-world
docker run hello-world

運行一個交互式的ubuntu容器實例

docker run -it ubuntu /bin/bash #參數解釋 -i 交互式的命令操做 -t 開啓一個終端界面 /bin/bash 指定linux的解釋器 (這頁面)

docker運行變化unbtun頁面

交互式的運行一個centos容器

docker run -it centos /bin/bash

docker rm 容器id #刪除容器id記錄,只能刪除掛掉的容器

docker rm docker ps -aq #批量刪除掛掉的容器記錄

在容器的後臺運行一個進程,運行出活着的容器

docker run -d centos /bin/sh -c "while true;do echo '佳增你真棒'; sleep 1;done"
-d 就是daemonize 後臺運行的意思
centos 指定哪一個鏡像
/bin/sh 指定linux的解釋器
-c 指定一段shell代碼
"while true;do echo '佳增你真棒'; sleep 1;done" 每秒打印一個

進入容器空間內

docker exec -it 運行着的容器id /bin/bash

查看容器日誌

docker logs 容器id
docker logs -f 容器id #檢測容器內的日誌

dockerfile 的學習

docker ps 查看容器id

2.2 自定義docker鏡像

shell默認的解釋器
/bin/bash
/bin/sh

1.獲取一個centos基礎鏡像,運行處容器後
docker run -it centos /bin/bash

2.進入容器空間內,默認沒有python3 和其餘軟件
進入以後,安裝一個vim
yum install vim -y

3.自定義軟件後,退出容器,提交這個容器,成爲一個新的鏡像 exit退出容器
docker

4.此時這個鏡像文件,能夠發送給其餘同事了
docker commit 容器id 新的鏡像的名字
docker commit 5c2 s20/centos-vim

5.查看提交的鏡像文件
docker images

6.導出這個鏡像文件,指定導出的文件名和後綴
docker save 鏡像名/id > /opt/s20-centos-vim.tar.gz

7.在本地測試導入這個鏡像
能夠測試在本地,先刪除本來的鏡像
導入命令
docker load < /opt/s20-centos-vim.tar.gz

8.給導入的鏡像,修改tag別名
docker tag 舊的鏡像名 以dockerhub倉庫id開頭的/新的鏡像名
docker tag 621 liuyang/s20-centos-vim

9.執行這個docker鏡像,運行處容器後,查看是否攜帶了vim
關鍵字 關鍵字 參數 鏡像名 你要執行的命令
docker run -it liuyang/s20-centos-vim /bin/bash

鏡像

docker search centos #去docker hub 搜索有關centos的鏡像文件

docker pull centos #下載docker鏡像 centos
docker pull hello-world #獲取一個hello-world鏡像
docker images #查看本地有哪些docker鏡像
docker image ls #命令同上

docker rmi 鏡像id或者鏡像名 #刪除本地docker鏡像
docker rmi -f 鏡像id #強制刪除鏡像文件
docker pull ubuntu #獲取一個ubuntu鏡像

倉庫

2.3 運行一個web容器的操做

1.獲取一個python的flask的鏡像
#docker run的特色是,若是鏡像不存在,會自動的先去docker pull
docker run -d -P training/webapp python app.py
-d 後臺運行
-P 端口映射,隨機映射
training/webapp 鏡像名
python app.py 你要執行的命令

​ (沒有自動會去pull)

docker容器的端口映射

docker port 容器id

docker _ flask映射

容器的啓停管理

docker start 容器id
docker stop 容器id

2.4 dockerfile的學習

這個文件就是定製docker鏡像的一個腳本而已,學習裏面的功能性的參數

獲取docker鏡像的方式

1.去docker倉庫獲取的方式,一個是公網倉庫,一個是私有倉庫
docker pull

2.獲取別人發來的鏡像,也就是自定義的鏡像

3.經過dockerfile構建docker鏡像

2.41 Dockerfile 參數

指定以哪一個系統爲基礎

FROM scratch #製做base image 基礎鏡像,儘可能使用官方的image做爲base image
FROM centos #使用base image
FROM ubuntu:14.04 #帶有tag的base image

定義dockerfile一些參數信息的指令

LABEL version=「1.0」 #容器元信息,幫助信息,Metadata,相似於代碼註釋
LABEL maintainer=「yc_uuu@163.com"

對於複雜的RUN命令,避免無用的分層,多條命令用反斜線換行,合成一條命令!

萬能指令RUN

RUN yum update && yum install -y vim Python-dev #反斜線換行
RUN /bin/bash -c "source $HOME/.bashrc;echo $HOME」

WORKDIR /root #至關於linux的cd命令,改變目錄,儘可能使用絕對路徑!!!不要用RUN cd
WORKDIR /test #若是沒有就自動建立
WORKDIR demo #再進入demo文件夾
RUN pwd #打印結果應該是/test/demo

ADD添加的意思

ADD and COPY

語法

ADD 本地的資料 容器內的存放路徑

ADD除了有添加的做用,還有解壓縮的做用

ADD hello.txt / #把本地文件添加到鏡像中,吧本地的hello可執行文件拷貝到鏡像的/目錄
ADD test.tar.gz / #添加到根目錄並解壓,自動的解壓test.tar.gz 解壓爲test

​ # 再寫RUN tar -zvcf ... 會報錯(不知道 )

WORKDIR /root
ADD hello test/ #進入/root/ 添加hello可執行命令到test目錄下,也就是/root/test/hello 一個絕對路徑
COPY hello test/ #等同於上述ADD效果

copy就是把本地的文件,拷貝到容器空間內,沒有解壓做用

ADD與COPY

  • 優先使用COPY命令
-ADD除了COPY功能還有解壓功能

添加遠程文件/目錄使用curl或wget

ENV #環境變量,儘量使用ENV增長可維護性

ENV MYSQL_VERSION 5.8 #設置一個mysql常量

RUN yum install -y mysql-server=「${MYSQL_VERSION}」
RUN yum install -y mysql-server=「${MYSQL_VERSION}」
RUN yum install -y mysql-server=「${MYSQL_VERSION}」
RUN yum install -y mysql-server=「${MYSQL_VERSION}」
RUN yum install -y mysql-server=「${MYSQL_VERSION}」

2.5 經過dockerfile定製一個python flask web程序,運行處容器

配置方法:

1.準備一個flask代碼文件
touch s20flask.py
vim s20flask.py

coding:utf8

from flask import Flask
app=Flask(name)
@app.route('/')
def hello():
return "20期學的都很棒,很厲害"
if name=="main":
app.run(host='0.0.0.0',port=8080)

2.準備Dockerfile,寫入以下內容
FROM centos
COPY CentOS-Base.repo /etc/yum.repos.d/
COPY epel.repo /etc/yum.repos.d/
RUN yum clean all
RUN yum install python-setuptools -y
RUN easy_install -i https://pypi.tuna.tsinghua.edu.cn/simple flask
COPY s20flask.py /opt/
WORKDIR /opt
EXPOSE 8080 #暴露容器內的8080端口
CMD ["python","s20flask.py"] #讓容器執行以下命令

copy 把本地的文件copy到容器空間內

拷貝一份文件到本文件夾
[root@liu s20docker]# cp /etc/yum.repos.d/CentOS-Base.repo .
[root@liu s20docker]# cp /etc/yum.repos.d/epel.repo .

有的 公司有python3 有的可能python2

3.準備好齊全的文件,開始構建docker鏡像
[root@s20 s20docker]# ls
CentOS-Base.repo Dockerfile epel.repo s20flask.py

4.構建docker鏡像的命令,這個命令得在Dockerfile的目錄下執行
docker build .

5.構建鏡像完成以後,查看鏡像文件
docker images
docker tag 6f0 s20-flask-docker

6.運行這個鏡像,
docker run -d -p 7777:8080 6f0

沒有easy_install

[root@liu s20docker]# docker run -it centos
[root@668cbafcdde2 /]# easy_install
bash: easy_install: command not found

配置python的包管理,安裝flask
easy_install -i https://pypi.tuna.tsinghua.edu.cn/simple flask

2.6 docker倉庫的學習(共有倉庫(不安全))

1.docker提供了一個相似於github的倉庫dockerhub,
網址https://hub.docker.com/須要註冊使用
2.註冊docker id後,在linux中登陸dockerhub
docker login #輸入你的帳號密碼 就能夠成功登陸

注意要保證image的tag是帳戶名,若是鏡像名字不對,須要改一下tag
docker tag 你的dockerhub帳號名/你的docker鏡像名 本地的鏡像id或名

語法是: docker tag 倉庫名 yuchao163/倉庫名

3.推送docker image到dockerhub
docker push yuchao163/centps-cmd-exec:latest
4.在dockerhub中檢查鏡像
https://hub.docker.com/
5.刪除本地鏡像,測試下載pull 鏡像文件
docker pull yuchao163/centos-entrypoint-exec

定製docker鏡像的一個腳本而已

好比說:docker 一個centos 沒有python 自定義就能夠寫進去了

2.7 docker的私有倉庫搭建

配置方式
1.下載一個registry 私有倉庫鏡像

docker run -d -p 5000:5000 -v /opt/data/registry:/var/lib/registry registry

這個 \ 是換行符的意思 
-v 是數據文件夾掛載  ,宿主機的數據文件夾:容器內的文件夾
5000 訪問什麼都沒有,可是沒有拒絕   # 不支持http方式的傳送

2.能夠查看私有倉庫的api數據地址,以下
http://192.168.230.132:5000/v2/_catalog(個人ip)

3.可是此時的私有倉庫還無法使用,它不支持http方式的推送,修改默認的配置文件便可(好像是這個錯誤:ERRO[0000] error getting events from daemon: net/http: request canceled )
1.編輯docker的配置文件
vim /etc/docker/daemon.json
2.寫入以下信息,地址改爲你本身的ip
{"registry-mirrors": ["http://f1361db2.m.daocloud.io"],
"insecure-registries":["192.168.16.142:5000"]
}
3.修改docker的配置文件
vim /lib/systemd/system/docker.service
第二步:添加以下配置,在[Service]的代碼區域塊中,添加以下參數
[Service]
EnvironmentFile=-/etc/docker/daemon.json

4.從新加載這個文件
systemctl daemon-reload 

5.重啓整個docker服務
systemctl restart docker

6.從新啓動一個私有倉庫
docker run --privileged=true -d -p 5000:5000 -v /opt/data/registry:/var/lib/registry registry

參數解釋:
    --privileged=true  docker容器的安全機制:設置特權級運行的容器

7.推送本地的鏡像,到私有倉庫中去
    docker push 192.168.230.132:5000/s20-hello-world


8.其餘同事就能夠經過這個私有倉庫的鏡像地址,獲取拉

docker pull 192.168.230.132:5000/s20-hello-world



4.還得修改本地鏡像的名字,以倉庫地址爲開頭

docker tag 你要修改的鏡像 修改以後的鏡像名

docker tag fce 192.168.230.132:5000/s20-hello-world

相關文章
相關標籤/搜索