Docker Swarm ---- docker 服务集群

Docker Swarm ---- docker 服务集群,第1张

真实的服务部署,往往为了满足三高,高可用,高性能,高效率等都会将多个服务部署在多个节点上,这样能避免多个服务对服务器资源的竞争,且一个节点挂了,不会影响到整个服务的使用;这个时候就需要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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/926560.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-16
下一篇 2022-05-16

发表评论

登录后才能评论

评论列表(0条)

保存