第一节课:容器与Docker基础
一、容器介绍
1.1 什么是容器
轻量级、可移植的软件打包技术
包含应用程序及其所有依赖项
在不同环境中保持一致性
1.2 容器 vs 虚拟机
二、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-world3.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-nginx4.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 -p1234565.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 --system3.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 kubelet3.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.yml3.5 Node节点加入集群
bash
# 在Master节点初始化完成后,会输出join命令
# 类似如下命令,在每个Node节点执行
kubeadm join 192.168.1.100:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3.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 80801.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-app2.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: 52.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: NodePort2.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.yaml3.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.yaml3.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-app4.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: 505.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集群搭建,再到实际应用部署的完整流程。每节课都有详细的理论讲解和实际操作步骤,适合循序渐进的学习。