Docker与K8S实战课程文档

吴书松
吴书松
发布于 2025-09-26 / 10 阅读
1
0

Docker与K8S实战课程文档

第一节课:容器与Docker基础

一、容器介绍

1.1 什么是容器

  • 轻量级、可移植的软件打包技术

  • 包含应用程序及其所有依赖项

  • 在不同环境中保持一致性

1.2 容器 vs 虚拟机

特性

容器

虚拟机

启动速度

秒级

分钟级

性能

接近原生

有损耗

硬盘占用

MB级

GB级

隔离性

进程级

系统级

二、Docker介绍

2.1 Docker架构

  • Docker客户端/服务端架构

  • 镜像(Image)、容器(Container)、仓库(Registry)

  • Docker Hub:官方镜像仓库

三、Docker安装

3.1 CentOS/RedHat安装步骤

bash

# 1. 卸载旧版本
sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

# 2. 安装依赖包
sudo yum install -y yum-utils

# 3. 设置镜像仓库
sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

# 4. 安装Docker引擎
sudo yum install docker-ce docker-ce-cli containerd.io

# 5. 启动Docker
sudo systemctl start docker
sudo systemctl enable docker

# 6. 验证安装
sudo docker version
sudo docker run hello-world

3.2 Ubuntu安装步骤

bash

# 1. 更新软件包索引
sudo apt-get update

# 2. 安装依赖包
sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

# 3. 添加Docker官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# 4. 设置稳定版仓库
echo \
  "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 5. 安装Docker引擎
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

# 6. 启动和验证
sudo systemctl start docker
sudo docker run hello-world

四、Docker基本操作

4.1 镜像操作

bash

# 搜索镜像
docker search nginx

# 拉取镜像
docker pull nginx:latest

# 查看本地镜像
docker images

# 删除镜像
docker rmi <image_id>

4.2 容器操作

bash

# 运行容器
docker run -d --name my-nginx -p 80:80 nginx

# 查看运行中的容器
docker ps

# 查看所有容器
docker ps -a

# 停止容器
docker stop my-nginx

# 启动容器
docker start my-nginx

# 进入容器
docker exec -it my-nginx bash

# 查看容器日志
docker logs my-nginx

# 删除容器
docker rm my-nginx

4.3 Dockerfile示例

dockerfile

FROM openjdk:8-jre-slim
WORKDIR /app
COPY target/myapp.jar /app/myapp.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "myapp.jar"]

五、Docker应用实战

5.1 部署MySQL

bash

# 运行MySQL容器
docker run -d \
  --name mysql-server \
  -e MYSQL_ROOT_PASSWORD=123456 \
  -e MYSQL_DATABASE=testdb \
  -p 3306:3306 \
  mysql:8.0

# 连接MySQL
docker exec -it mysql-server mysql -uroot -p123456

5.2 部署Nginx

bash

# 运行Nginx容器
docker run -d \
  --name nginx-server \
  -p 80:80 \
  -v /path/to/html:/usr/share/nginx/html \
  nginx:latest

第二节课:Kubernetes基础与集群搭建

一、容器与K8s关系

1.1 容器编排需求

  • 单机容器管理局限

  • 多容器应用部署复杂

  • 服务发现、负载均衡、扩缩容需求

1.2 Kubernetes作用

  • 自动化容器部署

  • 弹性扩缩容

  • 服务发现和负载均衡

  • 自我修复能力

二、K8s核心概念

2.1 集群架构组件

  • Master节点:控制平面

  • Node节点:工作节点

  • Pod:最小部署单元

  • Service:服务抽象层

  • Deployment:应用部署管理

2.2 核心组件详解

Master组件:

  • kube-apiserver:API入口

  • etcd:键值存储数据库

  • kube-scheduler:调度器

  • kube-controller-manager:控制器管理器

Node组件:

  • kubelet:节点代理

  • kube-proxy:网络代理

  • Container Runtime:容器运行时

三、一主三从集群搭建

3.1 环境准备(所有节点)

bash

# 1. 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld

# 2. 关闭selinux
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

# 3. 关闭swap
swapoff -a
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

# 4. 设置主机名(分别在各个节点执行)
# 主节点
hostnamectl set-hostname k8s-master
# 从节点1
hostnamectl set-hostname k8s-node1
# 从节点2
hostnamectl set-hostname k8s-node2
# 从节点3
hostnamectl set-hostname k8s-node3

# 5. 添加hosts解析
cat >> /etc/hosts << EOF
192.168.1.100 k8s-master
192.168.1.101 k8s-node1
192.168.1.102 k8s-node2
192.168.1.103 k8s-node3
EOF

# 6. 设置内核参数
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
sysctl --system

3.2 安装Docker(所有节点)

bash

# 使用之前第一节课的Docker安装步骤
# 确保所有节点Docker版本一致

3.3 安装kubeadm、kubelet、kubectl(所有节点)

bash

# 1. 添加阿里云Kubernetes源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

# 2. 安装kubelet kubeadm kubectl
yum install -y kubelet-1.23.0 kubeadm-1.23.0 kubectl-1.23.0

# 3. 设置kubelet开机启动
systemctl enable kubelet && systemctl start kubelet

3.4 Master节点初始化

bash

# 1. 初始化Master节点
kubeadm init \
  --apiserver-advertise-address=192.168.1.100 \
  --image-repository registry.aliyuncs.com/google_containers \
  --kubernetes-version v1.23.0 \
  --service-cidr=10.96.0.0/12 \
  --pod-network-cidr=10.244.0.0/16

# 2. 配置kubectl
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# 3. 安装网络插件(Flannel)
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

3.5 Node节点加入集群

bash

# 在Master节点初始化完成后,会输出join命令
# 类似如下命令,在每个Node节点执行
kubeadm join 192.168.1.100:6443 --token abcdef.0123456789abcdef \
    --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

3.6 验证集群状态

bash

# 查看节点状态
kubectl get nodes

# 查看所有Pod状态
kubectl get pods --all-namespaces

# 查看集群信息
kubectl cluster-info

四、K8s基本操作

bash

# 创建Pod
kubectl run nginx --image=nginx:latest

# 查看Pod
kubectl get pods

# 创建Deployment
kubectl create deployment web --image=nginx:latest

# 扩展Deployment
kubectl scale deployment web --replicas=3

# 暴露Service
kubectl expose deployment web --port=80 --type=NodePort

# 查看Service
kubectl get services

第三节课:K8s部署SpringBoot项目

一、项目准备

1.1 SpringBoot应用Docker化

dockerfile

# Dockerfile
FROM openjdk:8-jre-slim
VOLUME /tmp
COPY target/product-service-1.0.0.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
EXPOSE 8080

1.2 构建镜像

bash

# 构建Docker镜像
docker build -t product-service:1.0.0 .

# 推送到镜像仓库(可选)
docker tag product-service:1.0.0 your-registry/product-service:1.0.0
docker push your-registry/product-service:1.0.0

二、K8s资源配置文件

2.1 Namespace配置

yaml

# namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: product-app

2.2 Deployment配置

yaml

# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: product-service
  namespace: product-app
  labels:
    app: product-service
spec:
  replicas: 3
  selector:
    matchLabels:
      app: product-service
  template:
    metadata:
      labels:
        app: product-service
    spec:
      containers:
      - name: product-service
        image: product-service:1.0.0
        ports:
        - containerPort: 8080
        env:
        - name: SPRING_PROFILES_ACTIVE
          value: "prod"
        - name: DB_HOST
          value: "mysql-service"
        - name: DB_PORT
          value: "3306"
        resources:
          requests:
            memory: "512Mi"
            cpu: "250m"
          limits:
            memory: "1024Mi"
            cpu: "500m"
        livenessProbe:
          httpGet:
            path: /actuator/health
            port: 8080
          initialDelaySeconds: 30
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /actuator/health
            port: 8080
          initialDelaySeconds: 5
          periodSeconds: 5

2.3 Service配置

yaml

# service.yaml
apiVersion: v1
kind: Service
metadata:
  name: product-service
  namespace: product-app
  labels:
    app: product-service
spec:
  selector:
    app: product-service
  ports:
  - port: 80
    targetPort: 8080
    protocol: TCP
  type: NodePort

2.4 MySQL数据库配置

yaml

# mysql-secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: mysql-secret
  namespace: product-app
type: Opaque
data:
  password: MTIzNDU2 # base64编码的密码
---
# mysql-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-config
  namespace: product-app
data:
  database: "product_db"
  username: "root"
---
# mysql-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
  namespace: product-app
spec:
  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
        - name: MYSQL_DATABASE
          valueFrom:
            configMapKeyRef:
              name: mysql-config
              key: database
        ports:
        - containerPort: 3306
        volumeMounts:
        - name: mysql-storage
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-storage
        persistentVolumeClaim:
          claimName: mysql-pvc
---
# mysql-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: mysql-service
  namespace: product-app
spec:
  selector:
    app: mysql
  ports:
  - port: 3306
    targetPort: 3306
  clusterIP: None

三、部署应用

3.1 创建Namespace

bash

kubectl apply -f namespace.yaml

3.2 部署MySQL

bash

kubectl apply -f mysql-secret.yaml
kubectl apply -f mysql-configmap.yaml
kubectl apply -f mysql-pvc.yaml  # 需要先创建PVC文件
kubectl apply -f mysql-deployment.yaml
kubectl apply -f mysql-service.yaml

3.3 部署SpringBoot应用

bash

kubectl apply -f deployment.yaml
kubectl apply -f service.yaml

四、验证部署

4.1 检查部署状态

bash

# 查看所有资源
kubectl get all -n product-app

# 查看Pod详情
kubectl describe pod product-service-xxxxx -n product-app

# 查看日志
kubectl logs -f deployment/product-service -n product-app

4.2 访问应用

bash

# 获取Service的NodePort
kubectl get svc product-service -n product-app

# 访问应用(假设NodePort为30080)
curl http://<node-ip>:30080/api/products

五、扩展功能

5.1 水平自动扩缩容(HPA)

yaml

# hpa.yaml
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: product-service-hpa
  namespace: product-app
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: product-service
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50

5.2 Ingress配置(可选)

yaml

# ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: product-ingress
  namespace: product-app
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: product.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: product-service
            port:
              number: 80

六、常用故障排查命令

bash

# 查看事件
kubectl get events -n product-app --sort-by='.lastTimestamp'

# 进入Pod调试
kubectl exec -it product-service-xxxxx -n product-app -- bash

# 查看资源使用情况
kubectl top pods -n product-app

# 查看服务端点
kubectl get endpoints -n product-app

这份课件包含了从Docker基础到Kubernetes集群搭建,再到实际应用部署的完整流程。每节课都有详细的理论讲解和实际操作步骤,适合循序渐进的学习。


评论