Docker Swarm 集群使用指南概述

概述

对于简单轻量级集群管理,利用 Docker Swarm 就够用了,适合中小型应用程序的容器编排。如果是比较重的中心化集群管理方案或需要更复杂的功能,可以考虑使用 Kubernetes + Helm + Consul 等更强大的容器编排工具。

Docker Swarm

  • 1. Docker Swarm
    • 描述:Docker Swarm 是 Docker 的原生集群管理工具,适用于较简单的集群管理。可以轻松部署和管理多个 Docker 容器。
    • 功能:
      • 内置负载均衡,容器监控和管理。
      • 可以通过 Docker Compose 定义服务和依赖关系,简化部署过程。
      • 监控工具(如 Portainer)可以用来展示节点信息和生命状态。
  • 2. Portainer
    • 描述:Portainer 是一个轻量级的 Docker 管理工具 (UI),提供用户友好的界面。
    • 功能:
      • 监控 Docker 容器的状态和资源使用情况。
      • 简化容器的管理和升级过程。
      • 适合小型项目或简单的环境。
      • docker service create --name portainer --publish 9000:9000 --volume /var/run/docker.sock:/var/run/docker.sock portainer/portainer-ce
  • 3. Docker Registry + CI/CD 工具
    • 描述:使用 Docker Registry 来存储镜像,并结合 CI/CD 工具(如 Jenkins、GitLab CI、GitHub Actions)来实现自动构建和推送。
    • 工作流程:
      • 在代码更改后,CI/CD 工具自动构建新的 Docker 镜像。
      • 将新镜像推送到 Docker Registry。
      • 使用 CLI 脚本或 API 调用触发 Docker Swarm 更新,执行类似 docker service update --image your-repo/your-image:latest your-service-name 的命令。
  • 4. Watchtower
    • 描述:Watchtower 是一个开源工具,可以在 Docker 中监控运行的容器并自动更新它们。
    • 功能:
      • 监视 Docker 容器中的镜像,如果检测到新版本,自动拉取并更新服务。
      • 可以和 Docker Swarm 结合使用,部署在 Swarm 集群中。
    • 使用方法:
      • 在 Swarm 中部署 Watchtower 容器:docker service create --name watchtower --mode global containrrr/watchtower --cleanup your-service-name
      • Watchtower 将定期检查镜像更新,并自动更新运行中的容器。
  • 5. GitOps 工具(如 ArgoCD 或 Flux)
    • 描述:GitOps 是一种基于 Git 的操作模式,可以用于管理 Kubernetes 和 Docker Swarm 中的应用部署。
    • 功能:
      • 通过 Git 仓库管理 Docker 镜像和服务配置。
      • 监控 Git 仓库中的更改,自动部署和更新服务。
    • 使用方法:
      1. 配置 Git 仓库,包含 Docker Compose 文件或相关配置。
      2. 部署 GitOps 工具,它将监视 Git 仓库并在检测到更改时自动更新服务。

文档

常见命令

bash 复制代码
docker swarm init  
  
# 将 `<token>` 和 `<manager-ip>` 替换为实际值。  
docker swarm join --token <token> <manager-ip>:2377  
  
docker node ls  
  
# 部署服务 checkpoint or nginx 示例  
docker service create --name my-nginx --replicas 3 -p 80:80 nginx  
docker service ls  
  
# 升级更新服务  
docker service update --image nginx:latest my-nginx  
  
# 使用 compose.yml  
docker stack deploy -c docker-compose.yml <stack_name>

推送起新服务

创建服务

使用 docker service create 时,您可以指定以下几个参数:

  • --replicas:设置要运行的副本数量。
  • --publish:暴露端口,让外部可以访问服务。
  • --limit:设置资源限制。
  • --constraint:限制服务在特定节点上运行。
创建新服务的基本示例

例如,下面的命令会在 Swarm 中创建一个名为 my-nginx 的服务,运行 3 个 Nginx 实例,并将端口 80 显示到集群外部:

bash 复制代码
docker service create --name my-nginx --replicas 3 -p 80:80 nginx
指定在哪些节点上运行服务

您还可以使用 --constraint 参数来限制服务运行在特定的节点上。限制条件的基本语法如下:

bash 复制代码
docker service create --name my-nginx --replicas 3 \
  --constraint 'node.hostname == node1' \
  nginx

在这个例子中,服务 my-nginx 只会在名为 node1 的节点上运行。

同时在多个节点上运行

如果您希望在特定的一批节点上运行服务,可以使用 --constraint 来设置多个条件。例如:

bash 复制代码
docker service create --name my-nginx --replicas 3 \
  --constraint 'node.hostname == node1' \
  --constraint 'node.hostname == node2' \
  nginx

但是,--constraint 不支持直接指定多个节点的"一批",如果需要同时在多个节点上,可以考虑使用标签(label)。

使用标签约束
  1. 为节点打标签:首先,您可以为希望运行服务的节点打标签:

    bash 复制代码
    docker node update --label-add mylabel=true node1
    docker node update --label-add mylabel=true node2
  2. 使用标签创建服务

    接着,您可以使用该标签限制服务只在带有该标签的节点上运行:

    bash 复制代码
    docker service create --name my-nginx --replicas 3 \
      --constraint 'node.labels.mylabel == true' \
      nginx

Kubernetes

1. 必需的工具

a. kubectl

这是 Kubernetes 的命令行工具,用于与 Kubernetes API 进行交互。您需要确保在本地或管理节点上安装了 kubectl

  • 安装

    bash 复制代码
    # 对于 macOS
    brew install kubectl
    
    # 对于 Linux
    curl -LO "https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl"
    chmod +x ./kubectl
    sudo mv ./kubectl /usr/local/bin/kubectl
b. Kubernetes 集群

确保您有一个运行中的 Kubernetes 集群。您可以使用 Minikube、kubeadm、GKE、EKS 等工具来创建和管理 Kubernetes 集群。

2. 主要命令和资源对象

a. 部署(Deployment)

Kubernetes 中的 Deployment 是用于管理无状态应用程序的主要资源对象。您可以使用它来定义要运行的应用程序的所需状态,并 Kubernetes 将确保集群达到该状态。

  • 创建一个 Deployment

    创建一个 YAML 文件(如 nginx-deployment.yaml)来定义 Deployment,例如:

    yaml 复制代码
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-nginx
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: my-nginx
      template:
        metadata:
          labels:
            app: my-nginx
        spec:
          containers:
          - name: nginx
            image: nginx:latest
            ports:
            - containerPort: 80
  • 使用 kubectl 命令创建 Deployment:

    bash 复制代码
    kubectl apply -f nginx-deployment.yaml
b. 服务(Service)

创建一个 Service,以便外部能够访问您的 Deployment 中的 Pods。

  • 创建一个 Service

    创建一个 YAML 文件(如 nginx-service.yaml)来定义 Service,例如:

    yaml 复制代码
    apiVersion: v1
    kind: Service
    metadata:
      name: my-nginx-service
    spec:
      selector:
        app: my-nginx
      ports:
        - protocol: TCP
          port: 80
          targetPort: 80
      type: LoadBalancer  # 或 ClusterIP / NodePort
  • 使用 kubectl 命令创建 Service:

    bash 复制代码
    kubectl apply -f nginx-service.yaml
c. 更新 Deployment

如果您想要更新应用程序的镜像或其他配置,您可以使用 kubectl set image 或直接更新 Deployment YAML 文件。

  • 更新镜像

    bash 复制代码
    kubectl set image deployment/my-nginx nginx=nginx:latest
  • 或者更新 YAML 文件并重新应用

    bash 复制代码
    kubectl apply -f nginx-deployment.yaml
d. 查看状态
  • 查看所有 Pods、Deployment、services 和其状态

    bash 复制代码
    kubectl get pods
    kubectl get deployments
    kubectl get services
e. 删除资源

如果您需要删除部署或服务,可以使用以下命令:

  • 删除 Deployment or Service

    bash 复制代码
    kubectl delete deployment my-nginx
    kubectl delete service my-nginx-service

3. 其他工具和功能

a. Helm

Helm 是 Kubernetes 的包管理工具,可以简化应用程序的部署和管理。您可以使用 Helm Charts 来定义和部署复杂的应用程序。

  • 安装 Helm

    bash 复制代码
    curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash
b. 监控和日志

使用 Prometheus 和 Grafana 监控集群的性能,使用 Kubernetes 内置的 kubectl logs 命令查看 Pods 的日志。

  • 查看 Pod 日志

    bash 复制代码
    kubectl logs <pod-name>
相关推荐
羚羊角uou35 分钟前
【Linux】编辑器vim和编译器gcc/g++
linux·运维·编辑器
努力一点94842 分钟前
ubuntu22.04系统入门 linux入门 简单命令基础复习 实现以及实践
linux·运维·服务器·ubuntu·gpu算力
白鹭1 小时前
自动化备份全网服务器数据平台
运维·服务器·自动化
卓豪终端管理1 小时前
电脑远程关机的重要性
运维·网络·devops
draymond71071 小时前
Dockerfile详解
运维·docker·容器
帅帅梓1 小时前
Linux性能检测与调优
linux·运维·php
鱼儿不吐泡2 小时前
阿里云服务器通过 docker CE 安装 Redis+Mysql+Nginx
运维·自动化运维
在云端易逍遥2 小时前
nextjs项目部署阿里云实践
docker·next.js
小猪咪piggy3 小时前
【JavaEE】(7) 网络原理 TCP/IP 协议
运维·服务器·网络
Asuicao3 小时前
ansible巡检脚本
linux·运维·ansible