云原生技術(shù)架構(gòu)分析+實(shí)戰(zhàn)
1 云平臺推薦與基礎(chǔ)操作
①云平臺推薦
- 國內(nèi):阿里云(ECS)、華為云、騰訊云、青云、百度云等
- 國外:亞馬遜AWS、微軟Azure等
②公有云、私有云區(qū)別
- 公有云:第三方云服務(wù)廠商提供和運(yùn)營,使用成本更低,無需維護(hù),無限制的縮放性,高可靠性(N個(gè)9,全年故障時(shí)間)
- 私有云:自己搭建平臺(服務(wù)器,機(jī)房等);控制力更強(qiáng),數(shù)據(jù)保密性更高
③基礎(chǔ)概念
- 云服務(wù)器作為應(yīng)用的最終載體
- VPC為所有云服務(wù)器提供網(wǎng)絡(luò)隔離(類比局域網(wǎng))
- 所有云服務(wù)器都是綁定某個(gè)私有網(wǎng)絡(luò)
- 安全組控制每個(gè)服務(wù)器的防火墻規(guī)則
- 公網(wǎng)IP使用云服務(wù)器上的資源可被大眾訪問
- 可以通過端口轉(zhuǎn)發(fā)的方式訪問到具體服務(wù)
④實(shí)戰(zhàn)
- 自己做實(shí)驗(yàn)的話,如果是不用下載太多軟件盡量選擇
按量付費(fèi)
- 對于多個(gè)服務(wù)器,可以使用VPC,讓多個(gè)云服務(wù)器之間通過私有ip訪問,避免帶寬浪費(fèi)和網(wǎng)速的限制
2 Docker基礎(chǔ)
2.1 Docker概念
docker解決的問題:
①統(tǒng)一標(biāo)準(zhǔn)
- 應(yīng)用構(gòu)建
- 不論是什么語言編寫的,不論是什么版本,都打包為了一個(gè)鏡像;類似于windows上的exe文件,不管什么語言,雙擊就能運(yùn)行
- 應(yīng)用分享
- 所有軟件的鏡像都放到了一個(gè)指定的地方 :docker hub,類似于手機(jī)上的應(yīng)用市場
- 應(yīng)用運(yùn)行
- 所有鏡像都能直接通過docker run命令一鍵運(yùn)行,類似于windows上的exe文件
②資源隔離
- cpu、內(nèi)存資源隔離與限制
- 訪問設(shè)備隔離與限制
- 網(wǎng)絡(luò)設(shè)備隔離與限制
- 用戶、用戶組隔離與限制
…
比如,黑客攻擊了某個(gè)容器,拿到了容器的root權(quán)限,但是因?yàn)槲覀內(nèi)萜骱退拗鳈C(jī)是隔離的,因此黑客無法影響其他容器或者攻擊我們宿主機(jī)
③docker架構(gòu)及基礎(chǔ)名詞概念
- Docker_Host:安裝Docker的主機(jī)
- Docker Daemon:運(yùn)行在Docker主機(jī)上的Docker后臺進(jìn)程
- Client:操作Docker主機(jī)的客戶端(命令行、UI等)
- Registry:鏡像倉庫(如:Docker hub)
- Images:鏡像,帶環(huán)境打包好的程序,可以直接啟動(dòng)運(yùn)行
- Containers:容器,由鏡像啟動(dòng)起來正在運(yùn)行中的程序
交互邏輯:
安裝好Docker,去鏡像倉庫(類似于軟件市場)尋找鏡像,下載并運(yùn)行,查看容器狀態(tài)日志等排錯(cuò)
2.2 Docker安裝(centos為例)
官方參考文檔:https://docs.docker.com/engine/install/centos/
docker安裝方式:
- 包管理器
- 腳本安裝(二進(jìn)制安裝),生產(chǎn)環(huán)境上不推薦使用,會遇到安全和升級等問題
- 安裝bundle
此處采用包管理器安裝方式
1. 移除以前docker相關(guān)包
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
//或者直接運(yùn)行
//sudo yum remove docker *
2. 配置yum源
sudo yum install -y yum-utils
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3. 安裝docker
sudo yum install -y docker-ce docker-ce-cli containerd.io
#以下是在安裝k8s的時(shí)候使用
yum install -y docker-ce-20.10.7 docker-ce-cli-20.10.7 containerd.io-1.4.6
4. 配置docker開機(jī)自啟
配置docker開機(jī)自啟,同時(shí)現(xiàn)在啟動(dòng)
systemctl enable docker --now
5. 配置加速(云服務(wù)器)
在自己購買云服務(wù)器的廠商上,找到自己服務(wù)器對應(yīng)的鏡像加速
- 這里額外添加了docker的生產(chǎn)環(huán)境核心配置cgroup
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://82m9ar63.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
例如:
以阿里云為例,進(jìn)入阿里云官網(wǎng):https://www.aliyun.com/
- 注冊登錄好自己的賬號
- 搜索容器鏡像服務(wù)(需要購買,不過個(gè)人可以試用)
- 然后點(diǎn)擊容器鏡像服務(wù)下的鏡像工具,找到鏡像加速器,根據(jù)自己對應(yīng)的操作系統(tǒng),找到下方對應(yīng)的操作文檔按要求操作即可
2.3 Docker命令實(shí)戰(zhàn)
①獲取鏡像
一般我們獲取鏡像都是從dockerhub倉庫上找。
地址:https://hub.docker.com/
- 如果公司有私服或者自己搭建了docker倉庫的話,使用自己的也可以
docker pull nginx #下載最新版
鏡像名:版本名(標(biāo)簽)
docker pull nginx:1.20.1
docker pull redis #下載最新
docker pull redis:6.2.4
## 下載來的鏡像都在本地
docker images #查看所有鏡像
redis = redis:latest
docker rmi 鏡像名:版本號/鏡像id
案例具體操作:
拉取一個(gè)V1.20.1版本的nginx
# 1. 拉取鏡像
docker pull nginx:1.20.1
# 2. 查看本地鏡像
docker images
②啟動(dòng)容器
案例:啟動(dòng)nginx容器,并映射到88端口,測試訪問
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
【docker run 設(shè)置項(xiàng) 鏡像名 】 鏡像啟動(dòng)運(yùn)行的命令(鏡像里面默認(rèn)有的,一般不會寫)
# -d:后臺運(yùn)行
# --restart=always: 開機(jī)自啟
docker run --name=mynginx -d --restart=always -p 88:80 nginx
# 查看正在運(yùn)行的容器
docker ps
# 查看所有
docker ps -a
# 刪除停止的容器
docker rm 容器id/名字
docker rm -f mynginx #強(qiáng)制刪除正在運(yùn)行中的
#停止容器
docker stop 容器id/名字
#再次啟動(dòng)
docker start 容器id/名字
#應(yīng)用開機(jī)自啟
docker update 容器id/名字 --restart=always
案例具體操作:
# -d 后臺啟動(dòng)
# --restart=always 開機(jī)自啟
# -p 88:80 將宿主機(jī)的88端口映射到nginx容器的80端口
# --name=mynginx 指定啟動(dòng)之后的容器名為mynginx
# nginx:1.20.1 啟動(dòng)版本號為1.20.1的nginx
docker run -d --restart=always -p 88:80 --name=mynginx nginx:1.20.1
停止容器
# 停止容器[只要能唯一標(biāo)識即可,可以不用輸入全部id]
docker stop bcb
③修改容器內(nèi)容
案例:修改nginx默認(rèn)的index.html頁面
1. 進(jìn)入容器內(nèi)部修改
# 進(jìn)入容器內(nèi)部修改[有些可能不是bash是sh,需靈活變化]
# -it 表示進(jìn)入交互頁面
#nginx容器可以當(dāng)做一個(gè)小型的linux,然后里面運(yùn)行了nginx
docker exec -it 容器id /bin/bash
案例:修改nginx的默認(rèn)首頁
- docker ps,查看正在運(yùn)行的nginx鏡像,獲取容器id
- docker exec -it bcb /bin/bash,進(jìn)入nginx交互頁面
- 進(jìn)入nginx的首頁
cd /usr/share/nginx/html
修改首頁內(nèi)容:echo "this is ziyi's pages, elcomclear > index.html
![]()
- 查看結(jié)果:你的ip+映射端口(宿主機(jī)的)
![]()
- exit退出容器交互頁面
2. 掛載數(shù)據(jù)到外部修改
docker run --name=mynginx \
-d --restart=always \
-p 88:80 -v /data/html:/usr/share/nginx/html:ro \
nginx
# 修改頁面只需要去 主機(jī)的 /data/html
# -v 掛載
/*
/data/html:/usr/share/nginx/html:ro
將容器中的/usr/share/nginx/html掛載到宿主機(jī)的/data/html目錄,ro表示read only只讀
nginx代表nginx:latest鏡像名
*/
指定nginx版本:
docker run -d -p 88:80 -v /data/html:/usr/share/nginx/html --restart=always --name=mynginx nginx:1.20.1
④提交改變【數(shù)據(jù)遷移】
我們修改了容器中的內(nèi)容之后,想要打包交給其他電腦去運(yùn)行,此時(shí)就需要將我們修改好之后的鏡像進(jìn)行提交
- 提交修改
# docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
# -a "ziyi" 指明是誰修改的
# -m "首頁變化" 指明做了什么
# 341d81f7504f guignginx:v1.0 指明哪個(gè)容器的修改了以及新容器的版本號
docker commit -a "ziyi" -m "首頁變化" 341d81f7504f guignginx:v1.0
2. 壓縮鏡像并傳輸
# 將鏡像保存成壓縮包
docker save -o abc.tar nginx:v1.0
# 可以通過scp命令遠(yuǎn)程傳輸?shù)街付ǚ?wù)器的指定文件夾下
# 別的機(jī)器加載這個(gè)鏡像
docker load -i abc.tar
# 離線安裝
⑤推送到遠(yuǎn)程倉庫
一般我們可以將鏡像推送到docker hub,或者自己搭建平臺
- docker hub地址:https://hub.docker.com/
- 首先,注冊登錄自己的docker hub,然后創(chuàng)建一個(gè)自己的倉庫
- 打包鏡像并推送到docker hub
# 登錄docker hub,輸入命令然后輸入自己用戶名與密碼
docker login
# 打包本地鏡像
# 把舊鏡像的名字,改成倉庫要求的新版名字
docker tag nginx:v1.0 ziyigun/nginx:v1.0
效果:
使用命令:
# 把舊鏡像的名字,改成倉庫要求的新版名字
docker tag guignginx:v1.0 leifengyang/guignginx:v1.0
# 登錄到docker hub
docker login
docker logout(推送完成鏡像后退出)
# 推送
docker push leifengyang/guignginx:v1.0
# 別的機(jī)器下載
docker pull leifengyang/guignginx:v1.0
⑥其他命令(docker cp)
docker logs 容器名/id 排錯(cuò)
docker exec -it 容器id /bin/bash
# docker 經(jīng)常修改nginx配置文件
docker run -d -p 80:80 \
-v /data/html:/usr/share/nginx/html:ro \
-v /data/conf/nginx.conf:/etc/nginx/nginx.conf \
--name mynginx-02 \
nginx
#把容器指定位置的東西復(fù)制出來
docker cp 5eff66eec7e1:/etc/nginx/nginx.conf /data/conf/nginx.conf
#把外面的內(nèi)容復(fù)制到容器里面
docker cp /data/conf/nginx.conf 5eff66eec7e1:/etc/nginx/nginx.conf
測試docker cp,復(fù)制命令:
2.4 進(jìn)階實(shí)戰(zhàn)【部署自己的鏡像】
2.4.1 部署鏡像
例如:我們編寫一個(gè)簡單的統(tǒng)計(jì)訪問量的java應(yīng)用
通過Spring官網(wǎng)構(gòu)建SpringBoot:https://start.spring.io/
- 編寫代碼
- 將應(yīng)用打包成鏡像
編寫Dockerfile將自己的應(yīng)用打包成鏡像
# 基礎(chǔ)環(huán)境,運(yùn)行java需要jdk
FROM openjdk:8-jdk-slim
# 作者名
LABEL maintainer=ziyi
#將target目錄下maven打包好的jar包復(fù)制為app.jar
COPY target/*.jar /app.jar
# 運(yùn)行jar包的腳本命令
ENTRYPOINT ["java","-jar","/app.jar"]
以前(以java為例):
● SpringBoot打包成可執(zhí)行jar
● 把jar包上傳給服務(wù)
● 服務(wù)器運(yùn)行java -jar
現(xiàn)在:
●所有機(jī)器都安裝Docker,任何應(yīng)用都是鏡像,所有機(jī)器都可以運(yùn)行
- 運(yùn)行鏡像
# -t 是指標(biāo)簽名稱
docker build -t java-demo:v1.0 .
2.4.2 拓展【上傳到dockerhub】
每個(gè)應(yīng)用每次打包,都需要本地編譯、再上傳服務(wù)器、再進(jìn)行docker構(gòu)建,如果有1000個(gè)應(yīng)用要打包鏡像怎么辦?有沒有更好的方式?
- 上傳到dockerhub或其他鏡像倉庫
- 本地打上標(biāo)簽
docker run -d -p 8080:8080 --name myjava-app java-demo:v1.0
- 上傳鏡像到dockerhub
# 登錄docker hub
docker login
#給舊鏡像起名
docker tag java-demo:v1.0 leifengyang/java-demo:v1.0
# 推送到docker hub
docker push leifengyang/java-demo:v1.0
# 別的機(jī)器
docker pull leifengyang/java-demo:v1.0
# 別的機(jī)器運(yùn)行
docker run -d -p 8080:8080 --name myjava-app java-demo:v1.0
其他:部署中間件
文章來源:http://www.zghlxwxcb.cn/news/detail-441208.html
部署一個(gè)Redis+應(yīng)用,嘗試應(yīng)用操作Redis產(chǎn)生數(shù)據(jù)文章來源地址http://www.zghlxwxcb.cn/news/detail-441208.html
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
#redis使用自定義配置文件啟動(dòng)
docker run -v /data/redis/redis.conf:/etc/redis/redis.conf \
-v /data/redis/data:/data \
-d --name myredis \
-p 6379:6379 \
redis:latest redis-server /etc/redis/redis.conf
到了這里,關(guān)于云原生技術(shù)架構(gòu)分析+實(shí)戰(zhàn)【docker篇】的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!