一、先搞懂三者关系
- Docker 单机:跑单个容器
- Docker Swarm:Docker 官方轻量集群,简单够用
- K8s(Kubernetes):工业级容器编排,功能最全、企业标配
二、第一阶段:Docker Swarm 集群部署
1. 架构
- 1 个 Manager 节点(管理)
- N 个 Worker 节点(干活)
- 服务自动调度、故障自愈、负载均衡、滚动更新
2. 初始化集群(Manager 节点)
bash
docker swarm init --advertise-addr 192.168.1.100
执行后会输出一行 join 命令,拿去 Worker 节点执行即可加入集群。
3. 工作节点加入
bash
docker swarm join --token xxx 192.168.1.100:2377
4. 查看节点
bash
docker node ls
5. 使用 docker-compose.yml 部署集群服务
创建 docker-compose.yml
yaml
version: '3.8'
services:
app:
image: myapp:latest
ports:
- "8080:8080"
deploy:
replicas: 3 # 3 个副本
restart_policy:
condition: on-failure
environment:
- DB_HOST=mysql
- REDIS_HOST=redis
mysql:
image: mysql:8.0
volumes:
- mysql-data:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=appdb
volumes:
mysql-data:
6. 一键部署到 Swarm 集群
bash
docker stack deploy -c docker-compose.yml myapp
7. 常用 Swarm 命令
bash
docker stack ls # 查看应用
docker service ls # 查看服务
docker service ps myapp_app # 查看副本
docker service scale myapp_app=5 # 扩缩容
docker stack rm myapp # 删除
8. Swarm 特点
- 简单、零学习成本
- 适合中小团队、中小项目
- 自带负载均衡、自愈、滚动更新
- 缺点:功能不如 K8s 强大
三、第二阶段:K8s (Kubernetes) 集群部署
1. K8s 架构
- Master:API Server / Controller / Scheduler / etcd
- Node:kubelet / kube-proxy / 容器运行时
2. 最小化集群安装(kubeadm 方式)
(所有节点执行)
bash
# 关闭交换分区
swapoff -a
# 加载内核模块
modprobe overlay
modprobe br_netfilter
# 安装 containerd
...(省略标准安装步骤)
# 安装 kubeadm、kubelet、kubectl
Master 节点初始化
bash
kubeadm init --apiserver-advertise-address=192.168.1.100 --pod-network-cidr=10.244.0.0/16
Node 加入
bash
kubeadm join 192.168.1.100:6443 --token xxx --discovery-token-ca-cert-hash sha256:xxx
安装网络插件(Calico/Flannel)
bash
kubectl apply -f https://docs.projectcalico.org/v3.25/manifests/calico.yaml
查看节点
bash
kubectl get nodes
四、K8s 部署微服务(实战)
1. 编写 Deployment(应用)
app-deploy.yaml
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: app
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:latest
env:
- name: DB_HOST
value: "mysql"
- name: REDIS_HOST
value: "redis"
ports:
- containerPort: 8080
2. 编写 Service(暴露服务)
yaml
apiVersion: v1
kind: Service
metadata:
name: app
spec:
selector:
app: myapp
ports:
- port: 80
targetPort: 8080
type: NodePort
3. 部署 MySQL(用 ConfigMap + Secret + PVC)
yaml
# Secret 存密码
apiVersion: v1
kind: Secret
metadata:
name: mysql-secret
type: Opaque
data:
password: cm9vdA== # root base64
---
# PVC 持久化
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
---
# StatefulSet 部署 MySQL
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
serviceName: mysql
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:8.0
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: password
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql
volumes:
- name: mysql-data
persistentVolumeClaim:
claimName: mysql-pvc
4. 一键部署
bash
kubectl apply -f .
5. 常用 K8s 命令
bash
kubectl get pods
kubectl get svc
kubectl get nodes
kubectl scale deploy app --replicas=5
kubectl logs -f pod名
kubectl exec -it pod名 -- bash
五、Swarm vs K8s 对比
| 特性 | Docker Swarm | K8s |
|---|---|---|
| 难度 | 极低 | 高 |
| 架构 | 简单 | 完备 |
| 自愈、扩缩容 | 有 | 强 |
| 配置管理 | 环境变量 | ConfigMap/Secret |
| 存储管理 | 简单 | PVC/PV/StorageClass |
| 网关、Ingress | 弱 | 强大 |
| 生态 | 小 | 巨大(监控、日志、中间件) |
| 企业生产 | 中小项目 | 几乎全部大厂 |
六、从单机到分布式的完整路径
- 单机 Docker:学习镜像、容器、数据卷、网络
- Docker Compose:单机编排多个服务
- Docker Swarm:轻量集群,快速落地
- Kubernetes:企业级生产集群
- K8s 生态:Prometheus + Grafana + ELK + Jenkins + GitLab
这就是云原生工程师标准成长路线。