下載工具類
阿新 • • 發佈:2020-11-24
編寫dockerFile
注:docker埠集合
2377/tcp 客戶端和swarm的通訊
7946/tcp 和 7946/tcp 用於控制面 gossip 的分發
4789/dup 用於VXLAN的覆蓋網路
1、dockerfile 中各個命令含義:
2、cmd和entrypoint的區別。
#cmd 指的是docker run my-dockerfile-centos 後 執行的命令。 CMD ["ls","-a"] #entrypoint指的是 可以在docker run -it -d 之後 追加 命令。 如 entrypoint ["ls","-a"] 然後 可以docker run my-dockerfile-centos (-l) 追加一個 -L命令
3、編寫dockerfile
##使用官方命名,不用-f 指定。FROM centos MAINTAINET zhangpeng<[email protected]> COPY readme.txt /usr/local/readme.txt ADD openjdk-13_linux-x64_bin.tar.gz /usr/local/ ADD apache-tomcat-9.0.26.tar.gz /usr/local/ RUN yum -y install vim ENV MYPATH /usr/local WORKDIR $MYPATH ENV JAVA_HOME /usr/local/jdk-13 ENV CALSSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.26 ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.26 ENV PATH $PATH:$JAVA_HOME/bin:/$CATALINA_HOME/lib:$CATALINA_HOME/bin EXPOSE 8080 CMD /usr/local/apache-tomcat-9.0.26/bin/startup.sh && tail -10f /usr/local/apache-tomcat-9.0.26/bin/logs/catalina.out
4、構建映象。
docker build -t mytomcat . ##(.)點很重要
5、multistage builds 多階段構建 (build stage) 重點:copy --from
##多階段構建 (build stage) :從多個from中,提取之前階段構建的映象中與生產環境相關的應用程式碼。而不會複製生產環境不需要的構件。 ##在RUN 後使用&& 或者(\) ,在一行中新增多行命令。 ##示例: FROM golang:1.9-alpine as builder RUN apk --no-cache add git WORKDIR /go/src/github.com/go/helloworld/ RUN go get -d -v github.com/go-sql-driver/mysql COPY app.go . RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app . FROM alpine:latest as prod RUN apk --no-cache add ca-certificates WORKDIR /root/ COPY --from=0 /go/src/github.com/go/helloworld/app . CMD ["./app"]
docker compose
1、安裝docker-compose
sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
2、docker-compose.yml 檔案結構示例
version: "3"
services:
redis:
image: redis:alpine
ports:
- "6379"
networks:
- frontend
deploy:
replicas: 2
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
db:
image: postgres:9.4
volumes:
- db-data:/var/lib/postgresql/data
networks:
- backend
deploy:
placement:
constraints: [node.role == manager]
vote:
image: dockersamples/examplevotingapp_vote:before
ports:
- 5000:80
networks:
- frontend
depends_on:
- redis
deploy:
replicas: 2
update_config:
parallelism: 2
restart_policy:
condition: on-failure
mode: replicated
replicas: 1
labels: [APP=VOTING]
restart_policy:
condition: on-failure
delay: 10s
max_attempts: 3
window: 120s
placement:
constraints: [node.role == manager]
networks:
frontend:
backend:
volumes:
db-data:
docker Swarm
1、什麼是docker swarm ?
Swarm deamon只是一個排程器(Scheduler)加路由器(router),Swarm自己不執行容器,它只是接受Docker客戶端發來的請求,排程適合的節點來執行容器,這就意味著,即使Swarm由於某些原因掛掉了,叢集中的節點也會照常執行,放Swarm重新恢復執行之後,他會收集重建叢集資訊。
參考資料:
Docker三劍客之Docker Swarm - 一本正經的搞事情 - 部落格園
2、docker swarm 和 docker compose 的區別?
Docker Compose 是一個在單個伺服器或主機上建立多個容器的工具,而 Docker Swarm 則可以在多個伺服器或主機上建立容器叢集服務,對於微服務的部署,顯然 Docker Swarm 會更加適合。
3、Swarm 的排程策略
Swarm在排程(scheduler)節點(leader節點)執行容器的時候,會根據指定的策略來計算最適合執行容器的節點,目前支援的策略有:spread, binpack, random.
1)Random
顧名思義,就是隨機選擇一個Node來執行容器,一般用作除錯用,spread和binpack策略會根據各個節點的可用的CPU, RAM以及正在運
行的容器的數量來計算應該執行容器的節點。
2)Spread
在同等條件下,Spread策略會選擇執行容器最少的那臺節點來執行新的容器,binpack策略會選擇執行容器最集中的那臺機器來執行新的節點。
使用Spread策略會使得容器會均衡的分佈在叢集中的各個節點上執行,一旦一個節點掛掉了只會損失少部分的容器。
3)Binpack
Binpack策略最大化的避免容器碎片化,就是說binpack策略儘可能的把還未使用的節點留給需要更大空間的容器執行,儘可能的把容器執行在
一個節點上面。
4、準備工作
hostnamectl set-hostname manager248
hostnamectl set-hostname node249
hostnamectl set-hostname node250
192.168.31.248 manager248
192.168.31.249 node249
192.168.31.250 node250
ssh-keygen
ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected](相互複製)
ssh 192.168.33.248 測試
#建docker swarm manager
[root@localhost home]# docker swarm init --advertise-addr 192.168.33.248
Swarm initialized: current node (rfyxshs40vwx2ib40026canik) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-00xqc29xa0ls2w8zdbqdc1xmgkmg8p0zivpogdg04pevf74b7f-ckjdjlgrgh119ajosj22uif29 \
192.168.33.248:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
#看 以worker身份加入節點需要的token:
[root@localhost home]# docker swarm join-token worker
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-00xqc29xa0ls2w8zdbqdc1xmgkmg8p0zivpogdg04pevf74b7f-ckjdjlgrgh119ajosj22uif29 \
192.168.33.248:2377
#啟warm內建 安全機制:
[root@localhost home]# docker swarm update --autolock=true
Swarm updated.
To unlock a swarm manager after it restarts, run the `docker swarm unlock`
command and provide the following key:
SWMKEY-1-Ze0fX9rLVpIB6UwUtzPeMMALZzhDkNr4cd9GVO9C9/A##(這個密碼需要保護好)
Please remember to store this key in a password manager, since without it you
will not be able to restart the manager.
#這樣就需要在重啟的管理節點 使用命令 docker warm unlock 並輸入密碼才能重新加入叢集。
#更改節點的availablity狀態
swarm叢集中node的availability狀態可以為 active或者drain,其中:
active狀態下,node可以接受來自manager節點的任務分派;
drain狀態下,node節點會結束task,且不再接受來自manager節點的任務分派(也就是下線節點)
[root@manager43 ~]# docker node update --availability drain node139
OPTIONS='--selinux-enabled --log-driver=journald --registry mirror=https://oct7t4zn.mirror.aliyuncs.com'
https://oct7t4zn.mirror.aliyuncs.com
echo "DOCKER_OPTS=\"$DOCKER_OPTS --registry-mirror=https://oct7t4zn.mirror.aliyuncs.com\"" >> /etc/default/docker service docker restart
docker
5、swarm的service 建立,檢視,縮容、刪除
docker service create --name nginx_test --network nginx_net -p 80:80 --replicas 5 nginx:latest
#建立一個NGINX 服務,--replicas 5表示建立五個副本
#####################################################==記錄一個報錯:==##########################################################
錯誤1
image xx could not be accessed on a registry to record
its digest. Each node will access xx independently,
possibly leading to different nodes running different
versions of the image.
問題原因::在docker swarm的manager和worker節點上都存在相同的image,導致在manager節點建立叢集容器時報錯。需要刪除掉worker節點上相同的image。
docker service Ps nginx_test
docker service inspect nginx_test #加--pretty 可以少看一些內容
#docker service 服務檢視
#docker service 建立時 ,有兩種模式:副本模式和全域性模式,副本模式儘可能均勻分佈,全域性模式每個節點僅執行一個副本。
#docker service create 時加 --mode global來切換成全域性模式
docker service scale nginx_test=10 擴容到十個
docker service scale nginx_test=3 縮小到三個
#docker 的縮容
docker service rm nginx_test
#docker 服務的刪除
6、docker swarm service的滾動升級
scope(範圍)
#預設的情況下 swarm中的所有節點開放埠,即使節點上沒有任何服務的副本,稱為入站模式(ingress mode)
#另外一種叫主機模式(host only) ,即只在執行有容器副本的節點開放埠,主機模式需要在create時另外宣告:
docker service create --name nginx_test --network nginx_net --publish published=80,target=80,mode=host --replicas 8 nginx:latest