目錄:
- 介紹
- 一.docker-machine
- 1.machine安裝
- 2.使用docker-machine
- 二.Docker-compose
- 1.docker-compose配置
- 2.修改haproxy組態檔
- 三.docker swarm
- 四.添加監控visualizer
- 1.創建監控:
- 2.實作業務滾動更新
- 五.docker stack部署集群
- 1.docker stack與docker-compose的區別
- 2.撰寫腳本yml檔案
- 3.執行腳本
- 4.腳本實作更新
- 六.Portainer可視化
- 部署Portainer
介紹
DOCKER技術在推出后掀起了一陣容器化技術的熱潮,容器化使得服務的部署變得極其簡易,這為微服務和分布式計算提供了很大的便利,
為了把容器化技術的優點發揮到極致,docker公司先后推出了三大技術:docker-machine,docker-compose,docker-swarm,可以說是幾乎實作了容器化技術中所有可能需要的底層技術手段,
doceker-machine是在解決docker運行環境的問題
docker-compose是在解決容器編排的問題
docker-swarm是解決多主機多個容器的部署調度的問題
一.docker-machine
Docker Machine是一個簡化安裝Docker環境的工具,主要作用是創建和管理docker主機,一般公司云服務器畢竟少,個人覺得Docker Machine在實際使用中用處不大,直接在云服務器上安裝即可,
1.machine安裝
我們需要docker-machine-Linux-x86_64-0.16.1安裝包:
鏈接: docker-machine 提取碼: 6itu
因為是二進制檔案,所以需要增加執行權限
[root@server1 ~]# mv docker-machine-Linux-x86_64-0.16.1 /usr/local/bin/docker-machine
[root@server1 ~]# chmod +x /usr/local/bin/docker-machine

在真機上,我們需要下載get-docker腳本到http發布目錄下
cd /var/www/html
wget https://get.docker.com/
mv index.html get-docker.sh


我們需要修改一下get-docker.sh檔案
yum_repo="http://172.25.0.250/docker-ce.repo"
has_rootless_extras="0"


我們需要準備一臺虛擬機server3
將server1,server3做免密i處理:
[root@server1 ~]# ssh-keygen
[root@server1 ~]# ssh-copy-id server3:
[root@server1 ~]# docker-machine create --driver generic --engine-install-url "http://172.25.0.250/get-docker.sh" --generic-ip-address=172.25.0.3 server3


這個時候我們到server3上查看存ps ax
可以看到在server3上以及開始執行動作了!
如下圖正在執行安裝docker-ce

而且此時在seerver1上我們查看所有docker-machine的操作行程
能夠看到運行在server3上!

我們可以在隱藏目錄docker下看到在server3下生成的檔案:
cd .docker/
cd machine/machines/server3
ls

接著給server2也安裝docker
先做免密,再執行腳本進行安裝!
ssh-keygen
ssh-copy-id server2
docker-machine create --driver generic --engine-install-url "http://172.25.0.250/get-docker.sh" --generic-ip-address=172.25.0.2 server2

再一次列出所有docker-machine的操作行程
server2,3都在運行了!
docker-machine ls

2.使用docker-machine
完成之后,我們可以使用docker-machine來控制server2,3
我們可以停掉,重啟,查看狀態server2
docker-machine stop server2
docker-machine restart server2
docker-machine status server2
docker-machine config server2

docker-machine env server3
顯示訪問server3所需的環境變數,最后一行就是控制server3的方式

當控制server2,3之后docker images看到的是被控制的容器的鏡像!
但是有個問題在于顯示的不明顯,不確定自己是在哪個容器里?
eval $(docker-machine env server3)
docker ps
docker images
eval $(docker-machine env server2)
docker images
env


我們來優化它!
將下面幾個組件放置這個目錄下
鏈接: .bash檔案 提取碼: gi5f
[root@server1 ~]# cd /etc/bash_completion.d
mget *.bash


修改環境變數使得,切換到其他的容器之后,可以有效果!
[root@server1 ~]# vim .bashrc
PS1='[\u@\h \W$(__docker_machine_ps1)]\$ '

退出當前shell,重新登陸即可生效

我們可以看到如下圖,很明顯的效果,很清楚的直到當前在哪個容器中!
[root@server1 ~]# docker-machine env server3
[root@server1 ~]# eval $(docker-machine env server2)

二.Docker-compose
這個和下面要介紹的docker-swarm用處較大,compose是服務編排,即事先安排好服務的啟動,依賴,創建服務的數量等等,
主要作用在于服務的安排和部署上,dcoker-compose技術,就是通過一個.yml組態檔,將所有的容器的部署方法、檔案映射、容器連接等等一系列的配置寫在一個組態檔里,便利了復雜的多服務的部署,

因為我們需要直接使用docker-compose指令來操作,所以需要在系統的/usr/local/bin目錄下有compose的二進制檔案!
因為用戶在命令列輸入命令后,系統會在環境變數$PATH內找命令,
cd /usr/local/bin
ls
docker-compose 在這即可!

1.docker-compose配置
家目錄下創建專案目錄,撰寫主組態檔,docker-compose在up的時候會自動讀取
mkdir compose
cd compose
vim docker-compose.yml

內容如下:
version: "3.8"
services:
web1:
image: nginx
networks:
- webnet
lumes:
- ./web1:/usr/share/nginx/html #掛載資料卷為nginx默認發布檔案
web2:
image: nginx
networks:
- webnet
lumes:
- ./web2:/usr/share/nginx/html #掛載資料卷為nginx默認發布檔案
haproxy:
image: haproxy
networks:
- webnet
volumes:
- ./haproxy:/usr/local/etc/haproxy #資料卷為haproxy需要修改的主組態檔
ports:
- "80:80" #埠映射本機的80埠映射容器內的80埠
networks:
webnet: #網路連接方式為webnet
我們需要在當前路徑下有web1,web2,haproxy目錄
cd compose
mkdir web1
mkdir web2
echo web1 >web1/index.html
echo web2 > web2/index.html

2.修改haproxy組態檔
我們需要haproxy的組態檔在haproxy目錄下
cd compose
mkdir haproxy
get haproxy.cfg
vim haproxy.cfg

內容修改如下圖:


若是沒有組態檔的直接復制下面這段:
global
maxconn 65535
stats socket /var/run/haproxy.stat mode 600 level admin
log 127.0.0.1 local0
uid 200
gid 200
daemon
defaults
mode http
log global
option httplog
option dontlognull
monitor-uri /monitoruri
maxconn 8000
timeout client 30s
retries 2
option redispatch
timeout connect 5s
timeout server 5s
stats uri /admin/stats
# The public 'www' address in the DMZ
frontend public
bind *:80 name clear #監聽所有ip的80埠
#bind 192.168.1.10:443 ssl crt /etc/haproxy/haproxy.pem
#use_backend static if { hdr_beg(host) -i img }
#use_backend static if { path_beg /img /css }
default_backend dynamic
# The static backend backend for 'Host: img', /img and /css.
backend dynamic
balance roundrobin
server a web1:80 check inter 1000
server b web2:80 check inter 1000
啟動服務,-d打入后臺
docker-compose up -d

我們查看docker-compose狀態還是結束狀態
開啟它!
再次查看狀態是up!!
docker-compose ps
docker-compose start
docker-compose ps


測驗:
在網頁或者在虛擬機上都可以!
只要是先負載均衡即可!


當我們停止web1的服務后,發現負載均衡只剩web2了,但沒有報錯這說明有健康監測功能!
docker ps
docker stop compose_web1_1
docker ps


我們訪問網頁也可以看到web1掉先變紅了!
172.25.0.1/admin/stats

此時我們只需要將compose服務重啟一下,負載均衡即可恢復,很方便!
cd compose
docker-compose start
curl 172.25.0.1


我們當然在網頁也可以看到web,web2都變綠了!恢復運作了!

三.docker swarm
swarm是基于docker平臺實作的集群技術,他可以通過幾條簡單的指令快速的創建一個docker集群,接著在集群的共享網路上部署應用,最終實作分布式的服務,
相比起zookeeper等集群管理框架來說,swarm顯得十分輕量,作為一個工具,它把節點的加入、管理、發現等復雜的操作都濃縮為幾句簡單的命令,并且具有自動發現節點和調度的演算法,還支持自定制,雖然swarm技術現在還不是非常成熟,但其威力已經可見一般,

docker swarm的優缺點

開始初始化:
[root@server1 harbor]# docker swarm init
初始化之后,會生成加一個加入集群的指令!

我們將這個指令在其他節點執行就可以加入到集群中!
在server2,3都做:


然后在server1上可以看到加入集群的節點:
docker node ls

完成之后,我們需要準備一臺虛擬機server4
將集群的leader遷移到server2上,而server1負責管理容器的倉庫!
快速拉起server4的docker容器
將server3的組態檔傳給server4上直接下載docker


將server2或者server1上的解決橋接的檔案傳給server3,4
cd /etc/sysctl.d
scp docker.conf server3:/etc/sysctl.d
scp docker.conf server4:/etc/sysctl.d

記得重啟一下,不然不生效
sysctl --system

docker info
查看,警告沒有了!

將server4的docker開啟服務,并設定開機自啟!
systemctl start docker
systemctl enable docker

將server2提升為集群的leader
docker node promote server2
docker node ls
# 可以看到server2變為了rechale
docker node demote server1

來到server2可以看到已經成為了leader,可以看到其他的集群節點!
docker node ls

將server1離開swarm集群
docker swarm leave

在server2上洗掉server1的集群節點
docker node rm server1
docker node ls

此時,我們將server4也加入集群節點中:
和剛才的leader變化了記得指定的leader為172.25.0.2!!!

在server2上查看到集群節點中server4已經加入進來了!
docker node ls

我們將server1上前面做的compose全部停掉,并將harbor倉庫打開!
打開,停止compose服務的時候,一定要在指定的目錄下,不然會出錯!
cd
cd compose
docker-compose down
cd ../harbor
docker-compose up -d


緊接著web端訪問harbor倉庫,輸入賬戶密碼登陸,和之前的使用一致!

將server2的容器倉庫指定檔案發給server3,4
cd /etc/docker
scp daemon.json server3:/etc/docker/
scp daemon.json server4:/etc/docker/

重啟docker服務
systemctl reload docker

再將證書發給server3,4
cd /etc/docker
scp -r certs.d/ server3:/etc/docker/
scp -r certs.d/ server4:/etc/docker/

將倉庫的本地決議做好:

上傳鏡像myapp到容器倉庫
server1:
docker load -i myapp.tar
docker tag ikubernetes/myapp:v1 hyl.westos.org/library/myapp:v1
docker tag ikubernetes/myapp:v2 hyl.westos.org/library/myapp:v2
docker push reg.westos.org/library/myapp:v1
docker push reg.westos.org/library/myapp:v2



在web端可以看到上傳的鏡像:

在server2 上:
創建集群服務,名為webservice 埠映射80:80 開啟三個節點 鏡像為myapp:v1
docker service create --name webservice --publish 80:80 --replicas 3 myapp:v1

在server4上可以看到鏡像已經運行起來了:
docker ps

在server2上查看集群和集群節點服務
docker service ps webservice

測驗訪問:curl 172.25.0.2/hostname.html 可以看到訪問的主機節點負載均衡
可以看到,因為剛才 開啟三個節點,所以負載均衡每三次是一個回圈!

將集群節點擴容:集群數量變為6個
docker service scale webservice=6

可以看到每個虛擬機運行兩個節點
docker service ps webservice

測驗:訪問server2,3,4哪個IP都可以看到!
六臺worker主機均負載均衡,采用演算法為默認的rr輪詢

四.添加監控visualizer
容器倉庫主機server1:
將visualizer鏡像壓入harbor倉庫
docker load -i visualizer.tar
docker tag dockersamples/visualizer:latest reg.westos.org/library/visualizer:latest
docker push reg.westos.org/library/visualizer:latest


1.創建監控:
docker service create \
--name=viz \
--publish=8080:8080/tcp \
--constraint=node.role==managere \
--mount=type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock \
visualizer

網頁訪問監控visualizer,映射埠到主機的8080
firefox:172.25.0.2:8080
集群數量變為20個
docker service scale webservice=20

這個時候看監控,可以看到數量開始增多,變為20個

2.實作業務滾動更新
將myapp:v1 更新為myapp:v2
[root@server2 ~]# docker service update --image myapp:v2 --update-parallelism 2 --update-delay 5s webservice

我們可以看到監控顯示:已經開始從v1>>v2
自己做實驗可以觀察一下動態變化的程序!

接著我們刪掉剛才創建的容器和監控!
docker service rm webservice
docker service rm viz

查看監控已經清零

五.docker stack部署集群
基于 Docker Swarm 之上來完成應用的部署,面向大規模場景下的多服務部署和管理,
1.docker stack與docker-compose的區別
Docker stack不支持“build”指令,它是需要鏡像是預先已經構建好的, 所以docker-compose更適合于開發場景;
Docker Compose是一個Python專案,使用Docker API規范來操作容器,
Docker Stack功能包含在Docker引擎中,是swarm mode的一部分,
Docker stack不支持基于第2版寫的docker-compose.yml ,也就是version版本至少為3,然而Docker Compose對版本為2和3的 檔案仍然可以處理;
docker stack把docker compose的所有作業都做完了,因此docker stack將占主導地位,
manager主機server2操作:
2.撰寫腳本yml檔案
vim docker-compose.yml
version: "3.8"
services:
web:
image: myapp:v1
ports:
- "80:80" #埠映射,主機80映射容器80
networks:
- webnet #網路介面為webnet
deploy:
replicas: 6 #拉起容器的數量
update_config:
parallelism: 2 # 每次更新的數量
delay: 5s #更新時間間隔
restart_policy:
condition: on-failure
visualizer:
image: visualizer:latest
ports:
- "8080:8080" #監控埠為主機映射8080到容器的8080
stop_grace_period: 1m30s
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
placement:
constraints:
- "node.role==manager"
networks:
webnet:


3.執行腳本
docker stack deploy -c docker-compose.yml mycluster

查看stack行程:六個節點已經成功拉起!
docker stack ps mycluster


當改變腳本中節點數量
60個!重新執行腳本
可以看到監控直接拉起了60個行程!
replicas: 60
docker stack deploy -c docker-compose.yml mycluster



4.腳本實作更新
當我們再次修改腳本將鏡像改為v2時候,就會實作滾動更新

執行腳本
docker stack deploy -c docker-compose.yml mycluster

查看監控,發現開始逐漸變化為v2

swarm集群在創建成功時會自動添加虛擬網卡
docker network ls

六.Portainer可視化
在前面的操作中,我們采用命令列的方式建立了swarm集群,但是這樣的命令列并不是每一個運維或開發人員都熟記的,而且操作起來會比較麻煩,所以需要添加為swarm集群管理添加圖形化管理界面,
鏈接: portainer 目錄 提取碼: zzct
部署Portainer
在server1上加載鏡像并上傳到倉庫!
docker load -i portainer-agent.tar
docker load -i portainer.tar

在web端harbor倉庫創建新的專案
一定要選 公開!

docker tag portainer/portainer:latest reg.westos.org/portainer/portainer:latest
docker tag portainer/agent:latest reg.westos.org/portainer/agent:latest
docker push reg.westos.org/portainer/portainer:latest
docker push reg.westos.org/portainer/agent:latest


可以看到上傳成功!

在server2上執行腳本
docker stack deploy -c portainer-agent-stack.yml portainer
docker service ls


網頁訪問圖形管理界面,映射埠為9000
172.25.0.2:9000

設定兩次密碼,需要比較復雜的密碼不然會報錯!

進來后,可以看到我們創建的容器

在這圖形化界面可以直接修改集群數量變為6個,然后點對勾

然后展開看到只剩6個其他的都掛了

接著我們把自己的倉庫名添加進去


然后添加service,選擇剛才創建的倉庫名

記得輸入埠映射

點擊創建!

然后可以看見鏡像創建成功,但是狀態是pending,等待一會就會變為running

因為剛才設定埠映射為8000
所以訪問8000埠:
172.25.0.2:8000

實驗完畢!
關閉并離開集群:
manager主機server2:
docker swarm leave --force
worker主機:
docker swarm leave
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/290383.html
標籤:其他
