标签:结构 均衡 his sudo service restart ingress linu out
? 2377/tcp 客户端和swarm的通信
? 7946/tcp 和 7946/tcp 用于控制面 gossip 的分发
? 4789/dup 用于VXLAN的覆盖网络
#cmd 指的是docker run my-dockerfile-centos 后 运行的命令。
CMD ["ls","-a"]
#entrypoint指的是 可以在docker run -it -d 之后 追加 命令。
如 entrypoint ["ls","-a"]
然后 可以docker run my-dockerfile-centos (-l) 追加一个 -L命令
##使用官方命名,不用-f 指定。FROM centos
MAINTAINET zhangpeng<1320206695@qq.com>
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
docker build -t mytomcat . ##(.)点很重要
##多阶段构建 (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"]
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
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:
Swarm deamon只是一个调度器(Scheduler)加路由器(router),Swarm自己不运行容器,它只是接受Docker客户端发来的请求,调度适合的节点来运行容器,这就意味着,即使Swarm由于某些原因挂掉了,集群中的节点也会照常运行,放Swarm重新恢复运行之后,他会收集重建集群信息。
参考资料:
Docker三剑客之Docker Swarm - 一本正经的搞事情 - 博客园
Docker Compose 是一个在单个服务器或主机上创建多个容器的工具,而 Docker Swarm 则可以在多个服务器或主机上创建容器集群服务,对于微服务的部署,显然 Docker Swarm 会更加适合。
Swarm在调度(scheduler)节点(leader节点)运行容器的时候,会根据指定的策略来计算最适合运行容器的节点,目前支持的策略有:spread, binpack, random.
1)Random
顾名思义,就是随机选择一个Node来运行容器,一般用作调试用,spread和binpack策略会根据各个节点的可用的CPU, RAM以及正在运
行的容器的数量来计算应该运行容器的节点。
2)Spread
在同等条件下,Spread策略会选择运行容器最少的那台节点来运行新的容器,binpack策略会选择运行容器最集中的那台机器来运行新的节点。
使用Spread策略会使得容器会均衡的分布在集群中的各个节点上运行,一旦一个节点挂掉了只会损失少部分的容器。
3)Binpack
Binpack策略最大化的避免容器碎片化,就是说binpack策略尽可能的把还未使用的节点留给需要更大空间的容器运行,尽可能的把容器运行在
一个节点上面。
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 root@192.168.33.250(相互复制)
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
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 服务的删除
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
标签:结构 均衡 his sudo service restart ingress linu out
原文地址:https://www.cnblogs.com/zhjk/p/14034449.html