真实的服务部署,往往为了满足三高,高可用,高性能,高效率等都会将多个服务部署在多个节点上,这样能避免多个服务对服务器资源的竞争,且一个节点挂了,不会影响到整个服务的使用;这个时候就需要Docker Swarm来管理docker 集群,集群中的各个docker服务往往都会采用overlay的网络模式。
docker swarm 架构:
1.Docker Swarm作用:类似k8作用,实际工作中更多使用k8s
集群
大型应用
高性能,高效率,高可用
无中心设计
横向,纵向伸缩
多主机网络(overlay)
服务发现
负载均衡
回滚更新
2.Swarm manager
1.切换/加入/移除/维护节点
2.最小的集群至少需要5个节点
3.Swarm work
1.运行任务的节点
2.托管容器任务
4.创建集群
初始化 :docker swarm xxx
docker swarm管理manager节点:
4.1.在某节点创建manager:
docker swarm init --advertise-addr 192.168.188.33:2377 --listen-addr 192.168.188.33:2377
这样,就将192.168.188.33:2377设置为了manager节点,其他work节点只需要加入这个manager节点就行。
接下来会返回一串命令:
To add a worker to this swarm,run the following command:
docker swarm join --token xxxxxxxxxx 192.168.188.33.2377
4.2.在另一个work1节点机器上加入manager:
docker swarm join --token xxxxxxxxxx 192.168.188.33.2377
加入成功会提示:
this node joined a swarm as a worker.
4.3.在manager节点查询有哪些worker加入了集群:
docker node ls
5.节点 *** 作:docker node xxx 在manager节点上执行
查看节点:
docker node ls
查看节点详细信息:
docker node inspect manager
提升work节点权限:
docker node promote work1
删除权限:
docker node demote work1
查看manager节点的进程信息:
docker node ps manager
6.service:
docker service xxx 启动,管理,扩容
创建服务
docker service create --name web_demo -p 8000:80 --constraint "node.role == worker" nginx
查看服务
docker service ls
扩容服务
docker service scale 服务名=个数
删除服务
docker service rm 服务名
7.stack
在集群中创建多个服务
创建
docker stack deploy --compose-file docker-compose.yml 自定义服务名
docker-compose.yml
# 第一个区域下指定docekr-compose版本,docker swarm的docekr-compose.yml文件名和docker-compose中的docker-compose.yml文件名相同
version: "3"
# 第二个区域下定义容器
services:
web:
image: nginx
ports:
- "8080:80"
# deploy 选项只能在docker swarm当中使用
deploy:
# replicated代表可以创建多个副本;global代表只能创建一个服务,不能伸缩,不能扩展,例如数据库服务,为了保持一致性,会用global的mode
mode: replicated
# 启动6个容器服务
replicas: 6
# 重启策略
restart_policy:
condition: on-failure
# 服务失败后,会在5s后尝试重启
delay: 5s
# 3次尝试后还是失败,就不重启了
max_attempts: 3
placement:
constraints:
- node.role == worker
查看stack服务:
docker stack ls
使用docker swarm 部署flask服务
1.先制作本地镜像:
dockerfile:
# flask 项目的dockerfile文件
FROM python:3-alpine
LABEL maintainer="chuntian_tester"
LABEL description="Deploy flask project"
WORKDIR /usr/src/app # 切换目录
COPY ./dev01 ./dev01 # 将宿主机上此dockerfile文件同目录下的dev01项目代码复制至容器内
COPY ./gunicorn_config.py ./configs/
WORKDIR dev01 # 切换目录,进入项目目录
RUN pip install --no-cache-dir -i https://pypi.douban.com/simple -r requirements.txt && \
pip install -i https://pypi.douban.com/simple gunicorn && \
mkdir ./logs/
VOLUME /usr/src/app/logs/ # 指定将容器内的logs目录映射出去,可以直接在宿主机上访问,volume后面跟的是容器内的目录
VOLUME /usr/src/app/dev01
EXPOSE 5000
CMD ["/usr/local/bin/gunicorn","-c","/usr/src/app/config/gunicorn_config.py","run:app"]
docker-compose.yml:
# 一个docker-compose.yml文件至少含有以下前2个区域,
# docker-compose.yml文件中的注释只能放注释行的上面,不能放注释行的右边,以下注释不规范
#
# 第一个区域下指定docekr-compose版本
version: "3"
# 第二个区域下定义容器
services:
db: # 数据库容器
# 此处会判断上面步骤有没有build,有就会去本地查找dockerfile,没有就回去dockerhub下载或使用指定的镜像
image: mysql:5.7
# command类似docker run -d xxx mysql:5.7 ls /etc/,在启动容器后会运行额外的命令
command: --default-authentication-plugin=mysql_native_password
# 指定volume,可以多个
volumes:
# 容器中的目录
- dbdata:/var/lib/mysql
# 指定重载策略,当容器挂了,自动重启.其他:no/always/on-failure/unless-stopped
restart: always
# 指定容器内部的环境变量,类似:docker run -e MYSQL_ROOT_PASSWORD=123456,这么设置后,这个环境变量就会被追加入容器内部的环境变量中
environment:
# 默认设置root用户密码为123456
MYSQL_ROOT_PASSWORD: 123456
# 默认创建一个数据库,数据库名为dev01
MYSQL_DATABASE: dev01
deploy:
# 默认创建一个数据库,数据库名为dev01
mode: global
# 重启策略
restart_policy:
condition: on-failure
# 指定放置容器的位置
placement:
# 限制条件
constraints:
- node.role == manager
# 启动app时,需要匹配项目源代码中的数据库配置文件,如果是SQLALCHEMY,配置如:
# SQLALCHEMY_DATABASE_URI= “mysql+pymysql://root:123456@db:3306/dev01” 这里可直接用“db"代替数据库容器ip
app: # 项目app容器
# 指定容器的启动依赖关系,当db容器启动成功后,再启动此app容器
depends_on:
- db
# build: . 集群中不允许使用build,因为通常manager中有dockerfile文件,worker节点中是没有dockerfile文件的,
# 所以一般都是先build好一个镜像,然后直接用image: xxx指定已存在的镜像。
# 指定你制作的项目镜像
image: app2:latest
# 指定映射的端口
ports:
- "5000:5000"
volumes:
- mycode:/usr/src/app/dev01/
- logs:/usr/src/app/logs/
restart: always
environment:
FLASK_APP: run.py
deploy:
replicas: 6
# 指定启动容器模式,只启动1个,为了保持数据一致性
mode: global
# 重启策略
restart_policy:
condition: on-failure
# # 指定放置容器的位置
# placement:
# # 限制条件
# constraints:
# - node.role == manager
# 第三个区域声明要创建的volumes
# 限制条件
volumes:
dbdata:
mycode:
logs:
2.命令部署:
docker stack deploy --compose-file docker-compose.yml flask_app
GUI管理集群中容器的工具:
portainer: https://github.com/portainer/portainer-compose
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)