欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

容器编排-集群部署Docker Swarm

程序员文章站 2024-03-01 14:42:58
...

Docker Swarm

  • docker compose用来管理项目和服务,但是不能实现集群,docker的集群部署可以通过docker swarm实现
  • swarm是docker内置的服务,所以不需要再次下载
  • swarm分为工作节点和管理节点,都可以部署集群,但管理节点只能有一个leader

创建简单的swarm集群环境

  1. 启动三台服务器(虚拟机),例如ip如下
    192.168.154.121
    192.168.154.122
    192.168.154.123
    
  2. 案例演示将192.168.154.121机器设置为管理节点,只在管理节点上执行以下指令
    docker swarm init --advertise-addr 192.168.154.121
    
  3. 执行后会生成一下一个指令,随机生成的,将这个指令copy到另外两台机器
    # 随机生成的
    docker swarm join --token SWMTKN-1-65r8j68xwf5u1301nun5iowjzmqf6g1t24shsomo4tfqevemym-apgt591r9zuoogkxijxfzotf8 192.168.154.121:2377
    
    # 在工作节点执行成功后会有以下提示
    This node joined a swarm as a worker.
    
  4. 在管理节点上查看集群
    docker node ls
    
    # 执行结果示例
    48lip1pz3jfrznnuerwxixbdn     chongba-docker      Ready               Active                                  19.03.13
    m0085v45735bx6k7qc3eiisj8 *   chongba-docker      Ready               Active              Leader              19.03.13
    roujeh9roofnheu9cg3ew6188     chongba-docker      Ready               Active                                  19.03.13
    
    
  5. 设置主机名部分
    1.# 根据规划设置主机名,每台机器上执行
    hostnamectl set-hostname <hostname>
    
    2.# 在master添加hosts,每台机器上执行
    cat >> /etc/hosts << EOF
    192.168.200.150 node1
    192.168.200.151 node2
    192.168.200.152 node3
    EOF
    
    3.# 将桥接的IPv4流量传递到iptables的链,在每台机器上执行
    cat > /etc/sysctl.d/k8s.conf << EOF
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    EOF
    
    sysctl --system  # 使其生效
    
    4.# 时间同步,并验证
    yum install ntpdate -y
    ntpdate time.windows.com
    date
    
  6. 再次查看服务列表会发现节点名称已经更改,这个时候已经部署了一个最小的swarm集群,包含一个管理节点和两个工作节点
    docker node ls
    
    m0085v45735bx6k7qc3eiisj8 *   note1               Ready               Active              Leader              19.03.13
    roujeh9roofnheu9cg3ew6188     note2               Ready               Active                                  19.03.13
    48lip1pz3jfrznnuerwxixbdn     note3               Ready               Active                                  19.03.13
    
    

使用swarm部署单个服务

  • 以nginx服务为例
  1. 创建服务
    docker service create --replicas 3 -p 80:80 --name nginx nginx
    
    # --replicas 3:代表这个服务要创建3个副本,也就是启动3个容器来运行nginx
    
  2. 查看服务状态
    docker service ls
    
    # 结果示例
    ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
    okosowyzk3xt        nginx               replicated          2/2                 nginx:latest        *:80->80/tcp
    
  3. 查看服务运行节点
    docker service ps nginx
    
    # 结果示例
    ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE           ERROR               PORTS
    pxjrh45eu29q        nginx.1             nginx:latest        note1               Running             Running 8 minutes ago                       
    wmrg4o02ds08        nginx.2             nginx:latest        note2               Running             Running 7 minutes ago                       
    sgat4y6ag1oc        nginx.3             nginx:latest        note3               Running             Running 7 seconds ago  
    
  4. 其他指令
    # 扩容
    docker service scale nginx=5
    
    # 减少容器运行数量
    docker service scale nginx=2
    
    # 终止某个服务
    docker service rm nginx
    

使用swarm部署多个服务

  • 部署计划
    web:就是之前在docker-compose案例中的Java项目,依赖于redis进行计数。部署3个
    redis:redis数据库,记录某个IP的访问次数,部署1个,在管理节点。
    nginx:nginx服务,对3个web服务反向代理,部署1个,在管理节点
    
  1. 将之前docker-demo文件夹的三个文件分表copy到三台机器上的同一目录下/opt/docker-compose下
  2. 分别在三台机器上,构建镜像
    docker build -t web:latest .
    
  3. 在管理节点的/opt/docker-compose/swarm目录下创建一个nginx.conf文件,并配置
    worker_processes  1;
    events {
        worker_connections 1024;
    }  
    http {
        default_type  text/html; # 默认响应类型是html
    	
    	server {
    		listen 80;
    		location /hello {
                # 代理/hello路径,会代理到web服务的9090端口
    			proxy_pass http://web:9090;
    		}
    		location / {
    			root	/usr/share/nginx/html;
    		}
    	}
    }
    
  4. 在管理节点的swarm目录下再创建一个docker-compose.yml文件,工作节点不需更改
    version: '3'
    services:
      web:
        image: "web:latest"
        networks:
          - overlay
        deploy:
          mode: replicated
          replicas: 3
      redis:
        image: "redis:latest"
        networks:
          - overlay
        deploy:
          placement:
            constraints: [node.role == manager]
      nginx:
        image: "nginx:latest"
        networks:
          - overlay
        ports:
          - "80:80"
        volumes:
          - $PWD/nginx.conf:/etc/nginx/nginx.conf
        deploy:
          placement:
            constraints: [node.role == manager]
    networks:
      overlay:
      
      
    # 解读
    service:服务,包括3个
    web:java项目
    image:指定web服务的镜像,就是刚刚自己打包的web:latest
    networks: 网络配置,这里是用了默认的overlay格式,是swarm模式的固定格式
    deploy:swarm下的部署配置
    mode:replicated代表在多个节点上做备份
    replicas: 3 ,备份数量为3,即web服务会部署到swarm集群的随机3个节点
    redis:redis数据库
    image: “redis:latest”,指定用到的镜像是redis最新镜像
    deploy:swarm下的部署配置
    placement: 指定部署位置
    constraints: [node.role == manager] 部署到manager节点
    nginx:nginx服务
    image: “nginx:latest”,指定镜像名称
    networks: 指定网络,这里是用了默认的overlay格式,是swarm模式的固定格式
    ports: 对外暴露的端口为80
    volumes: 数据卷,指定当前目录下的nginx.conf文件挂载到容器中
    deploy: 部署,指定部署位置到manager节点
    
  5. 在管理节点执行以下指令运行
    docker stack deploy -c docker-compose.yml counter
    
    # 解读
    docker stack:就是通过docker-compose部署的命令
    -c docker-compose.yml:指定docker-compose文件位置
    counter:给部署的集群起个名字
    
  6. 其他指令
    # 查看集群信息
    docker stack ls
    
    # 查看集群部署的容器情况
    docker stack ps [集群名]
    
    # 查看指定服务的日志
    docker service logs -f counter_web
    
  7. 页面访问测试:http://192.168.200.150/hello,通过查看日志检查负载均衡情况
相关标签: 自记自用