90DaysOfDevOps容器化实战:Docker和Kubernetes的完整部署指南 🚀
欢迎来到90DaysOfDevOps容器化实战指南!本教程将带你深入了解如何在DevOps环境中使用Docker和Kubernetes进行完整的容器化部署。无论你是刚接触容器技术的新手,还是希望提升DevOps技能的开发者,这份指南都将为你提供实用的知识和最佳实践。
为什么选择容器化技术? 📦
在当今的软件开发环境中,容器化技术已经成为DevOps实践的核心组成部分。Docker和Kubernetes的结合为开发团队提供了:
- 环境一致性:确保开发、测试和生产环境的一致性
- 快速部署:实现秒级的应用启动和停止
- 资源优化:最大化硬件资源利用率
- 弹性伸缩:根据负载自动扩展应用实例
Docker基础入门 🐳
Docker安装与配置
首先,我们需要在系统中安装Docker:
# 更新系统包管理器
sudo apt-get update
# 安装必要的依赖包
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
# 添加Docker官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# 添加Docker仓库
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
# 安装Docker CE
sudo apt-get update
sudo apt-get install docker-ce
创建你的第一个Docker镜像
让我们从一个简单的Node.js应用开始创建Docker镜像:
# 使用官方Node.js运行时作为基础镜像
FROM node:14-alpine
# 设置工作目录
WORKDIR /app
# 复制package.json和package-lock.json
COPY package*.json ./
# 安装应用依赖
RUN npm install
# 复制应用源代码
COPY . .
# 暴露应用端口
EXPOSE 3000
# 定义启动命令
CMD ["npm", "start"]
构建和运行Docker镜像:
# 构建镜像
docker build -t my-node-app .
# 运行容器
docker run -p 3000:3000 my-node-app
Docker构建过程
Kubernetes集群部署 ⚡
理解Kubernetes架构
Kubernetes是一个开源的容器编排平台,它由以下几个核心组件组成:
- Master节点:负责集群管理和调度
- Worker节点:运行应用容器的工作节点
- Pod:Kubernetes的最小部署单元
- Service:提供稳定的网络端点
- Deployment:管理Pod的副本和更新策略
使用Minikube搭建本地集群
对于本地开发和测试,Minikube是一个理想的选择:
# 安装Minikube
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
# 启动Minikube集群
minikube start --driver=docker
# 验证集群状态
kubectl cluster-info
部署应用到Kubernetes
创建一个简单的Deployment配置文件:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app-deployment
labels:
app: my-app
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app
image: my-node-app:latest
ports:
- containerPort: 3000
---
apiVersion: v1
kind: Service
metadata:
name: my-app-service
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 3000
type: LoadBalancer
应用配置到集群:
# 部署应用
kubectl apply -f deployment.yaml
# 查看部署状态
kubectl get deployments
kubectl get pods
kubectl get services
Kubernetes部署状态
持续集成与持续部署 (CI/CD) 🔄
配置GitHub Actions流水线
在项目中创建.github/workflows/ci-cd.yaml文件:
name: CI/CD Pipeline
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build-and-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Node.js
uses: actions/setup-node@v3
with:
node-version: '14'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Run tests
run: npm test
build-and-push:
needs: build-and-test
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main'
steps:
- uses: actions/checkout@v3
- name: Build Docker image
run: docker build -t my-registry/my-app:${{ github.sha }} .
- name: Push to registry
run: |
echo "${{ secrets.REGISTRY_PASSWORD }}" | docker login -u "${{ secrets.REGISTRY_USERNAME }}" --password-stdin
docker push my-registry/my-app:${{ github.sha }}
deploy:
needs: build-and-push
runs-on: ubuntu-latest
steps:
- name: Deploy to Kubernetes
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.K8S_HOST }}
username: ${{ secrets.K8S_USER }}
key: ${{ secrets.K8S_SSH_KEY }}
script: |
kubectl set image deployment/my-app-deployment my-app=my-registry/my-app:${{ github.sha }}
kubectl rollout status deployment/my-app-deployment
监控与日志管理 📊
配置Prometheus和Grafana
监控是DevOps实践中的重要环节:
# prometheus-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: prometheus-config
data:
prometheus.yml: |
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'kubernetes-pods'
kubernetes_sd_configs:
- role: pod
relabel_configs:
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
action: keep
regex: true
设置日志聚合
使用EFK栈(Elasticsearch, Fluentd, Kibana)进行日志管理:
# 安装Elasticsearch
kubectl apply -f https://download.elastic.co/downloads/eck/2.6.1/crds.yaml
kubectl apply -f https://download.elastic.co/downloads/eck/2.6.1/operator.yaml
# 安装Fluentd
kubectl apply -f https://raw.githubusercontent.com/fluent/fluentd-kubernetes-daemonset/master/fluentd-daemonset-elasticsearch.yaml
# 安装Kibana
kubectl apply -f https://raw.githubusercontent.com/elastic/cloud-on-k8s/2.6/config/samples/kibana.yaml
监控仪表盘
安全最佳实践 🔒
容器安全扫描
在CI/CD流水线中加入安全扫描:
- name: Security scan
run: |
docker scan my-app:${{ github.sha }} --file Dockerfile
trivy image my-app:${{ github.sha }}
网络策略配置
限制Pod之间的网络通信:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
总结与下一步 🎯
通过本指南,你已经学会了:
- Docker基础:镜像构建、容器运行和管理
- Kubernetes部署:集群搭建、应用部署和服务暴露
- CI/CD流水线:自动化构建、测试和部署
- 监控与日志:集群监控和日志管理
- 安全实践:容器扫描和网络策略
进阶学习路径
想要深入学习90DaysOfDevOps的更多内容?建议继续探索:
- 服务网格:学习Istio或Linkerd的服务网格技术
- GitOps实践:使用ArgoCD或Flux实现GitOps工作流
- 多集群管理:掌握多Kubernetes集群的管理策略
- 云原生存储:深入了解Persistent Volumes和StatefulSets
记住,容器化和Kubernetes的学习是一个持续的过程。保持实践和探索,你将很快成为容器化部署的专家! 💪
成功部署
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



