Docker 和 Kubernetes 知识点与操作说明
1. Docker 基础
1.1 什么是 Docker
Docker 是一个开源的容器化平台,它允许开发者将应用程序及其依赖项打包到一个轻量级、可移植的容器中,然后在任何支持 Docker 的环境中运行。
1.2 Docker 的优势
- 轻量级:容器共享宿主机内核,不需要运行完整的操作系统
- 可移植性:容器可以在任何支持 Docker 的环境中运行,包括开发、测试和生产环境
- 一致性:确保应用程序在不同环境中具有相同的运行行为
- 高效利用资源:容器启动速度快,资源占用少
- 隔离性:容器之间相互隔离,避免应用程序之间的干扰
1.3 Docker 核心概念
- 镜像(Image):是一个只读的模板,包含了运行应用程序所需的所有内容,包括代码、运行时环境、库和配置
- 容器(Container):是镜像的一个运行实例,可以被创建、启动、停止和删除
- 仓库(Repository):用于存储 Docker 镜像的地方,分为公共仓库(如 Docker Hub)和私有仓库
- Dockerfile:是一个文本文件,包含了构建 Docker 镜像的指令
- Docker Compose:用于定义和运行多容器 Docker 应用程序的工具
1.4 Docker 安装
Ubuntu/Debian 安装
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt update sudo apt install -y docker-ce docker-ce-cli containerd.io
sudo docker run hello-world
|
CentOS/RHEL 安装
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io
sudo systemctl start docker sudo systemctl enable docker
sudo docker run hello-world
|
1.5 Docker 基本命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| docker version
docker info
docker search ubuntu
docker pull ubuntu:latest
docker images
docker rmi ubuntu:latest
docker run -it ubuntu:latest /bin/bash docker run -d -p 8080:80 nginx docker run --name mycontainer -v /host/path:/container/path ubuntu:latest
docker ps
docker ps -a
docker stop container_id/name
docker start container_id/name
docker restart container_id/name
docker rm container_id/name docker rm -f container_id/name
docker logs container_id/name docker logs -f container_id/name
docker exec -it container_id/name /bin/bash
docker inspect container_id/name
docker stats container_id/name
|
2. Docker 进阶
2.1 Docker 镜像构建
Dockerfile 基本结构
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| FROM ubuntu:latest
MAINTAINER Your Name <your@email.com>
RUN apt update && apt install -y nginx
ENV NGINX_VERSION=1.21.6
COPY index.html /usr/share/nginx/html/
EXPOSE 80
VOLUME ["/var/log/nginx"]
CMD ["nginx", "-g", "daemon off;"]
|
构建镜像
1 2
| docker build -t mynginx:latest . docker build -t mynginx:v1.0 -f Dockerfile.prod .
|
2.2 Docker 网络
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| docker network ls
docker network create mynetwork
docker network inspect mynetwork
docker run -d --name container1 --network mynetwork nginx docker run -d --name container2 --network mynetwork mysql
docker exec -it container1 ping container2
|
2.3 Docker 卷
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| docker volume create myvolume
docker volume ls
docker volume inspect myvolume
docker run -d -v myvolume:/app nginx
docker run -d -v /host/path:/container/path nginx
docker volume rm myvolume
|
2.4 Docker Compose
安装 Docker Compose
1 2 3 4 5 6 7 8
| sudo curl -L "https://github.com/docker/compose/releases/download/v2.14.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version
|
Docker Compose 文件示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| version: "3.8"
services: web: build: . ports: - "8080:80" volumes: - ./html:/usr/share/nginx/html depends_on: - db db: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: password MYSQL_DATABASE: mydb MYSQL_USER: user MYSQL_PASSWORD: password volumes: - mysql_data:/var/lib/mysql
volumes: mysql_data:
|
Docker Compose 命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| docker-compose up docker-compose up -d
docker-compose ps
docker-compose logs docker-compose logs -f web
docker-compose stop
docker-compose down
docker-compose up -d web
docker-compose config --services
|
3. Kubernetes 基础
3.1 什么是 Kubernetes
Kubernetes(简称 K8s)是一个开源的容器编排平台,用于自动化容器的部署、扩展和管理。它可以帮助用户管理大规模的容器化应用程序。
3.2 Kubernetes 的优势
- 自动扩缩容:根据负载自动调整容器数量
- 自愈能力:自动重启失败的容器,替换或迁移容器
- 服务发现和负载均衡:内置服务发现和负载均衡机制
- 滚动更新:支持零停机时间的应用程序更新
- 存储编排:自动挂载所选的存储系统
- 配置管理:集中管理应用程序配置
3.3 Kubernetes 核心概念
- Pod:是 Kubernetes 中最小的部署单元,可以包含一个或多个容器
- Deployment:用于管理 Pod 的声明式方法,提供副本管理、滚动更新等功能
- Service:定义了 Pod 的访问方式,提供负载均衡和服务发现
- Namespace:用于将集群划分为多个虚拟集群,实现资源隔离
- Volume:用于 Pod 中的容器共享数据,提供数据持久化
- ConfigMap:用于存储非敏感的配置信息
- Secret:用于存储敏感信息,如密码、密钥等
- Ingress:管理外部对集群中服务的访问
- StatefulSet:用于管理有状态应用程序
- DaemonSet:在集群的每个节点上运行一个 Pod
- Job/CronJob:用于管理一次性任务或定时任务
3.4 Kubernetes 安装
Minikube(本地开发环境)
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 sudo install minikube-linux-amd64 /usr/local/bin/minikube
minikube start
sudo snap install kubectl --classic sudo yum install -y kubectl
kubectl cluster-info kubectl get nodes
|
Kubeadm(生产环境)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| sudo apt install -y apt-transport-https curl sudo yum install -y yum-utils device-mapper-persistent-data lvm2
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=1 gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg exclude=kubelet kubeadm kubectl EOF
sudo apt install -y kubelet kubeadm kubectl sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
sudo systemctl enable kubelet sudo systemctl start kubelet
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
|
3.5 Kubernetes 基本命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
| kubectl cluster-info
kubectl get nodes
kubectl get namespaces
kubectl create namespace mynamespace
kubectl get pods kubectl get pods -n mynamespace kubectl get pods -o wide
kubectl run nginx --image=nginx
kubectl get deployments
kubectl create deployment nginx-deployment --image=nginx
kubectl scale deployment nginx-deployment --replicas=3
kubectl get services
kubectl expose deployment nginx-deployment --port=80 --type=NodePort
kubectl get configmaps
kubectl get secrets
kubectl get ingress
kubectl get all kubectl get all -n mynamespace
kubectl describe pod pod-name kubectl describe deployment deployment-name kubectl describe service service-name
kubectl logs pod-name kubectl logs -f pod-name
kubectl exec -it pod-name -- /bin/bash
kubectl delete pod pod-name kubectl delete deployment deployment-name kubectl delete service service-name kubectl delete namespace mynamespace
kubectl apply -f deployment.yaml
kubectl delete -f deployment.yaml
kubectl edit deployment deployment-name
|
4. Kubernetes 进阶
4.1 部署策略
滚动更新(Rolling Update)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 3 strategy: type: RollingUpdate rollingUpdate: maxSurge: 1 maxUnavailable: 0 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.19.0 ports: - containerPort: 80
|
蓝绿部署(Blue-Green)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| apiVersion: apps/v1 kind: Deployment metadata: name: nginx-blue spec: replicas: 3 selector: matchLabels: app: nginx version: blue template: metadata: labels: app: nginx version: blue spec: containers: - name: nginx image: nginx:1.19.0 ports: - containerPort: 80
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-green spec: replicas: 3 selector: matchLabels: app: nginx version: green template: metadata: labels: app: nginx version: green spec: containers: - name: nginx image: nginx:1.20.0 ports: - containerPort: 80
apiVersion: v1 kind: Service metadata: name: nginx-service spec: selector: app: nginx version: blue ports: - protocol: TCP port: 80 targetPort: 80 type: NodePort
|
4.2 服务发现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| apiVersion: v1 kind: Service metadata: name: my-service spec: selector: app: myapp ports: - protocol: TCP port: 80 targetPort: 8080
apiVersion: v1 kind: Service metadata: name: my-service spec: selector: app: myapp ports: - protocol: TCP port: 80 targetPort: 8080 nodePort: 30080 type: NodePort
apiVersion: v1 kind: Service metadata: name: my-service spec: selector: app: myapp ports: - protocol: TCP port: 80 targetPort: 8080 type: LoadBalancer
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-ingress spec: rules: - host: example.com http: paths: - path: / pathType: Prefix backend: service: name: my-service port: number: 80
|
4.3 存储
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| apiVersion: v1 kind: PersistentVolume metadata: name: my-pv spec: capacity: storage: 1Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain hostPath: path: /mnt/data
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: my-pvc namespace: mynamespace spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi
apiVersion: v1 kind: Pod metadata: name: my-pod namespace: mynamespace spec: containers: - name: my-container image: nginx volumeMounts: - name: my-volume mountPath: /data volumes: - name: my-volume persistentVolumeClaim: claimName: my-pvc
|
4.4 配置管理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
| apiVersion: v1 kind: ConfigMap metadata: name: my-config namespace: mynamespace data: config.json: | { "database": { "host": "db.example.com", "port": 3306 }, "api": { "url": "https://api.example.com" } } app.properties: | app.name=MyApp app.version=1.0.0
apiVersion: v1 kind: Secret metadata: name: my-secret namespace: mynamespace type: Opaque data: username: dXNlcm5hbWU= password: cGFzc3dvcmQ=
apiVersion: v1 kind: Pod metadata: name: my-pod namespace: mynamespace spec: containers: - name: my-container image: myapp env: - name: DB_USERNAME valueFrom: secretKeyRef: name: my-secret key: username - name: DB_PASSWORD valueFrom: secretKeyRef: name: my-secret key: password - name: APP_CONFIG valueFrom: configMapKeyRef: name: my-config key: app.properties volumeMounts: - name: config-volume mountPath: /etc/app volumes: - name: config-volume configMap: name: my-config
|
5. Docker 与 Kubernetes 结合
5.1 使用 Docker 构建镜像
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| cat > Dockerfile <<EOF FROM node:14-alpine WORKDIR /app COPY package*.json ./ RUN npm install COPY . . EXPOSE 3000 CMD ["node", "server.js"] EOF
docker build -t myapp:v1 .
docker tag myapp:v1 username/myapp:v1
docker login docker push username/myapp:v1
|
5.2 在 Kubernetes 中部署 Docker 镜像
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| apiVersion: apps/v1 kind: Deployment metadata: name: myapp-deployment spec: replicas: 3 selector: matchLabels: app: myapp template: metadata: labels: app: myapp spec: containers: - name: myapp image: username/myapp:v1 ports: - containerPort: 3000 env: - name: NODE_ENV value: "production"
--- apiVersion: v1 kind: Service metadata: name: myapp-service spec: selector: app: myapp ports: - protocol: TCP port: 80 targetPort: 3000 type: LoadBalancer
|
5.3 最佳实践
- 使用轻量级基础镜像:如 Alpine Linux
- 最小化镜像层:合并 RUN 命令,使用 .dockerignore 文件
- 使用多阶段构建:减少最终镜像大小
- 设置容器资源限制:CPU 和内存限制
- 使用健康检查:确保容器正常运行
- 使用 ConfigMap 和 Secret:管理配置和敏感信息
- 使用命名空间:实现资源隔离
- 使用标签和选择器:组织和管理资源
- 使用 Deployment:管理 Pod 生命周期
- 定期更新镜像:保持镜像安全
6. 常见问题和解决方案
6.1 Docker 常见问题
问题:权限不足
解决方案:将用户添加到 docker 组
1 2 3
| sudo usermod -aG docker $USER
su - $USER
|
问题:容器无法访问网络
解决方案:检查 Docker 网络配置
1 2 3
| docker network inspect bridge
sudo systemctl restart docker
|
问题:镜像构建失败
解决方案:检查 Dockerfile 语法和依赖
1 2 3 4
| docker build -t myapp .
docker build --no-cache -t myapp .
|
6.2 Kubernetes 常见问题
问题:Pod 处于 Pending 状态
解决方案:检查节点资源和调度约束
1 2
| kubectl describe pod pod-name kubectl get nodes -o wide
|
问题:Pod 处于 CrashLoopBackOff 状态
解决方案:检查容器日志和配置
1 2
| kubectl logs pod-name kubectl describe pod pod-name
|
问题:Service 无法访问
解决方案:检查 Service 配置和 Pod 状态
1 2
| kubectl describe service service-name kubectl get endpoints service-name
|
7. 命令速查表
Docker 命令速查表
| 功能 |
命令 |
| 查看版本 |
docker version |
| 拉取镜像 |
docker pull image-name |
| 运行容器 |
docker run -d -p 8080:80 image-name |
| 查看运行中的容器 |
docker ps |
| 查看所有容器 |
docker ps -a |
| 停止容器 |
docker stop container-id/name |
| 删除容器 |
docker rm container-id/name |
| 查看日志 |
docker logs container-id/name |
| 构建镜像 |
docker build -t image-name . |
| 查看镜像 |
docker images |
| 删除镜像 |
docker rmi image-name |
Kubernetes 命令速查表
| 功能 |
命令 |
| 查看集群信息 |
kubectl cluster-info |
| 查看节点 |
kubectl get nodes |
| 查看 Pod |
kubectl get pods |
| 查看 Deployment |
kubectl get deployments |
| 查看 Service |
kubectl get services |
| 创建 Deployment |
kubectl create deployment name --image=image-name |
| 扩展 Deployment |
kubectl scale deployment name --replicas=3 |
| 暴露 Service |
kubectl expose deployment name --port=80 --type=NodePort |
| 查看日志 |
kubectl logs pod-name |
| 进入 Pod |
kubectl exec -it pod-name -- /bin/bash |
| 应用配置 |
kubectl apply -f file.yaml |
| 删除资源 |
kubectl delete -f file.yaml |
希望这份 Docker 和 Kubernetes 知识点与操作说明对你有所帮助!如果有任何问题,请随时查阅 Docker 官方文档 和 Kubernetes 官方文档。