Docker服务快速部署


1 ) 镜像准备

  • 支持在线拉取与离线导入:
    # 在线拉取(如nginx)
    docker pull nginx:latest  
    # 离线导入 
    docker load -i nginx.tar  
    
  • 优先使用预下载镜像提升效率,支持多服务镜像(Nginx/MySQL/Redis/PostgreSQL)。

2 ) 容器运行

docker run -d --name [容器名] -p [宿主机端口]:[容器端口] --network=[网络模式] [镜像名]

参数说明:

参数 作用 常用值
-p 端口映射 80:80
--network 网络模式 host/bridge/none
-v 宿主机与容器目录映射 /data:/app/data
  • 示例(MySQL):
    docker run -d --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=your_password mysql:latest
    

Docker Compose编排与Docker对比


特性 Docker Docker Compose
管理对象 单容器 多容器统一编排
部署效率 需多次执行run命令 单命令启动全栈服务
配置文件 命令行参数 YAML声明式配置
适用场景 简单单服务部署 微服务架构复杂环境
效率优势 - 一键拉起全栈服务

常用命令:

docker-compose build    # 构建镜像  
docker-compose up -d    # 后台启动所有服务  
docker-compose stop     # 停止服务  
docker-compose start    # 启动已停止服务  
docker-compose down     # 删除所有容器及网络  

Docker Compose YAML文件编写


1 ) 编写流程:

  • 定义单服务(测试端口映射/卷挂载)→ 复制模板修改参数 → 执行docker-compose up -d拉起集群。

2 ) 完整示例:

version: '3'
services:
  web:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./conf:/etc/nginx  # 配置文件挂载
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: example 
    volumes:
      - db_data:/var/lib/mysql  # 数据持久化
volumes:
  db_data:  # 命名卷声明 

最佳实践:先定义单服务调试,再复制模板扩展多服务。

Docker网络模式


模式 作用
host 容器直接使用宿主机网络栈,无NAT隔离
container 多容器共享同一网络命名空间(IP相同,服务端口不同)
none 无网络连接,仅用于内部测试
bridge(默认) NAT网桥模式,通过iptables转发流量

Dockerfile关键指令解析


1 ) 命令执行指令:

  • RUN:构建时执行命令(如RUN apt-get update),生成新镜像层。
  • CMD:容器启动默认命令(如CMD ["nginx", "-g", "daemon off;"]),可被docker run覆盖。
  • ENTRYPOINT:容器入口命令(如ENTRYPOINT ["/entrypoint.sh"]),不可覆盖。

2 ) 文件操作指令:

指令 功能
COPY 仅复制本地文件/目录(不支持解压或网络资源)
ADD 额外支持:
- 自动解压本地压缩包
- 下载网络资源(如ADD http://example.com/data.tar.gz /tmp
# ADD示例:自动解压+网络资源获取 
ADD app.tar.gz /usr/src/app  
ADD https://example.com/data.zip /tmp 

最佳实践:优先使用COPY,仅需解压或远程资源时用ADD

Docker镜像分层机制


1 ) 分层原理:

  • 每条指令(RUN/COPY等)创建独立只读层,当前层不影响上层。
  • 分层设计提升构建效率与镜像复用性,减少冗余数据。
    2 ) 轻量化优势:
  • 仅存储差异层数据,加速镜像拉取与存储。

Kubernetes Pod核心运维


1 ) 创建流程:

调度计算
调用容器运行时
用户请求
API Server
写入ETCD
Scheduler
更新ETCD
Kubelet
创建Pod

四步机制:请求提交 → 配置存储 → 调度计算 → 节点执行

1.1. 请求提交:kubectl或API发起创建请求
1.2. 状态存储:API Server写入配置至ETCD
1.3. 调度决策:Scheduler选择最优节点(基于资源利用率)
1.4. 节点执行:目标节点kubelet创建容器

2 ) 负载均衡实现:

  • Service配置:通过selector匹配Pod标签提供统一入口

    apiVersion: v1 
    kind: Service
    metadata:
      name: web-svc
    spec:
      selector:
        app: nginx
      ports:
        - protocol: TCP 
          port: 80 
          targetPort: 8080 
    
  • 依赖组件:kube-proxy维护iptables/IPVS规则实现轮询分发。

  • 流量分发:请求均匀轮询后端Pod

3 ) 状态诊断与处理:

状态 含义 常见原因 解决方案
Pending 调度中/镜像拉取中 节点资源不足、污点未容忍 调整资源请求或添加污点容忍
Running 正常运行 - -
Failed 容器启动失败 应用错误、配置异常 检查日志:kubectl logs <pod>
Succeeded 任务型Pod执行完毕 - -
Unknown Master与Node通信中断 节点故障 检查节点网络及kubelet状态
CrashLoop 应用崩溃 容器启动失败 排查应用配置或资源限制

4 ) 批量操作:

# 删除所有Failed状态Pod
kubectl get pods --field-selector=status.phase=Failed -o name | xargs kubectl delete 

Kubernetes集群运维实践


1 ) 节点扩容(Token过期处理):

# Master节点操作 
kubeadm token create --print-join-command  # 生成新Token
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex  # 获取CA哈希

# Node节点执行 
kubeadm join <Master_IP>:6443 --token <TOKEN> --discovery-token-ca-cert-hash sha256:<HASH>

2 ) 常见问题解决:

  • 初始化失败:清理残留文件后重试。
    kubeadm reset 
    rm -rf /etc/kubernetes/
    
  • 节点不可见:检查kubelet服务状态(二进制部署需手动安装)。
  • kubectl get cs显示Unhealthy:修改kubelet配置:
    # /var/lib/kubelet/config.yaml
    healthzBindAddress: 0.0.0.0:10248  # 确保端口监听正确
    

3 ) 资源操作命令:

命令 特性
kubectl create 仅首次创建(不支持更新)
kubectl apply 支持创建及增量更新(推荐)

4 ) 批量操作技巧

删除所有Failed状态Pod
kubectl get pods --field-selector=status.phase=Failed -o name | xargs kubectl delete 

Pod资源共享与隔离


1 ) 共享存储:

apiVersion: v1
kind: Pod 
metadata:
  name: shared-storage 
spec:
  volumes:
    - name: log-volume
      emptyDir: {}  # 临时目录随Pod生命周期存在 
  containers:
    - name: app
      image: nginx
      volumeMounts:
        - name: log-volume
          mountPath: /var/log/app 
    - name: log-collector 
      image: fluentd 
      volumeMounts:
        - name: log-volume 
          mountPath: /data/logs
  • 应用场景:日志收集(应用容器写入,Sidecar容器读取)。

2 ) 隔离机制:

  • Linux命名空间(Network/PID/UTS/IPC/Mount)实现网络/进程隔离。
  • cgroups控制CPU/内存/磁盘资源限制。

典型运维问题解决方案


1 ) 节点选择器:

类型 特点
nodeSelector 硬性标签匹配(如disk=ssd),无标签则无法调度
nodeAffinity 支持软/硬策略:
- 硬策略(requiredDuringScheduling):必须满足
- 软策略(preferredDuringScheduling):尽量满足
nodeName(少用) 绕过调度器直指定节点

节点选择器

spec: 
  nodeSelector: 
    disktype: ssd  # 硬性匹配标签 

节点亲和性

策略类型 特性
requiredDuringSchedulingIgnoredDuringExecution 必须满足条件(硬策略)
preferredDuringSchedulingIgnoredDuringExecution 尽量满足(软策略)

配置示例:

affinity: 
  nodeAffinity: 
    requiredDuringSchedulingIgnoredDuringExecution: 
      nodeSelectorTerms: 
      - matchExpressions: 
        - key: topology.kubernetes.io/zone 
          operator: In 
          values: 
          - zone1 

2 ) Pod长期Pending

  • 资源不足:
    resources:
      requests:
        memory: "512Mi"
        cpu: "250m"
      limits:
        memory: "1Gi"
        cpu: "500m"
    
  • 污点未容忍:添加tolerations配置
    tolerations:
    - key: "disk-pressure"
      operator: "Exists"
      effect: "NoSchedule"
    

3 ) kubectl get cs显示Unhealthy

  • 修改配置:
    # /var/lib/kubelet/config.yaml 
    healthzBindAddress: 0.0.0.0:10248  # 修正监听端口 
    
  • 重启服务:systemctl restart kubelet

4 ) 初始化失败处理

kubeadm reset 
rm -rf /etc/kubernetes/  # 清理残留配置 

5 ) 节点不可见排查

  • 原因:节点未部署kubelet(常见于二进制部署)
  • 解决:安装并注册kubelet服务至集群

关键总结:

  1. 镜像分层:镜像分层机制是Docker高效构建的核心,Dockerfile每条指令生成独立层(当前层不影响上层)
  2. 服务发现:Service通过Label匹配实现Pod负载均衡
  3. 故障排查黄金命令:describe + logs + events组合定位问题根源
  4. 污点容忍:通过tolerations解决Pod调度限制问题
  5. 节点亲和性策略优先使用nodeAffinity软硬结合
  6. 诊断命令:
    • kubectl describe pod <pod> 查看事件详情
    • kubectl logs <pod> -c <container> 检查容器
    • kubectl get events --sort-by=.metadata.creationTimestamp:按时间排序事件
Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐