Docker Swarm 集群使用指南概述

发布于:2025-04-20 ⋅ 阅读:(19) ⋅ 点赞:(0)

概述

对于简单轻量级集群管理,利用 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 仓库并在检测到更改时自动更新服务。

文档

  • https://docs.docker.com/engine/swarm/
  • https://docs.portainer.io/

在这里插入图片描述

常见命令

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 显示到集群外部:

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

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

docker service create --name my-nginx --replicas 3 \
  --constraint 'node.hostname == node1' \
  nginx

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

同时在多个节点上运行

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

docker service create --name my-nginx --replicas 3 \
  --constraint 'node.hostname == node1' \
  --constraint 'node.hostname == node2' \
  nginx

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

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

    docker node update --label-add mylabel=true node1
    docker node update --label-add mylabel=true node2
    
  2. 使用标签创建服务
    接着,您可以使用该标签限制服务只在带有该标签的节点上运行:

    docker service create --name my-nginx --replicas 3 \
      --constraint 'node.labels.mylabel == true' \
      nginx
    

Kubernetes

1. 必需的工具

a. kubectl

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

  • 安装
    # 对于 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,例如:

    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:

    kubectl apply -f nginx-deployment.yaml
    
b. 服务(Service)

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

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

    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:

    kubectl apply -f nginx-service.yaml
    
c. 更新 Deployment

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

  • 更新镜像

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

    kubectl apply -f nginx-deployment.yaml
    
d. 查看状态
  • 查看所有 Pods、Deployment、services 和其状态
    kubectl get pods
    kubectl get deployments
    kubectl get services
    
e. 删除资源

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

  • 删除 Deployment or Service
    kubectl delete deployment my-nginx
    kubectl delete service my-nginx-service
    

3. 其他工具和功能

a. Helm

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

  • 安装 Helm
    curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash
    
b. 监控和日志

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

  • 查看 Pod 日志
    kubectl logs <pod-name>
    

网站公告

今日签到

点亮在社区的每一天
去签到