主题
Linux 容器技术 - Docker、Kubernetes 与容器生态系统详解
1. 容器技术基础
1.1 容器技术概念与原理
容器技术是一种轻量级的虚拟化解决方案,它允许在隔离的环境中运行应用程序,同时共享宿主机的操作系统内核。与传统虚拟机相比,容器具有启动速度快、资源占用少、部署灵活等优势。
容器技术的核心原理包括:
- 命名空间(Namespaces):提供进程隔离,使容器内的进程看不到宿主机上的其他进程
- 控制组(Control Groups - cgroups):限制和隔离容器对CPU、内存、磁盘I/O等资源的使用
- 联合文件系统(Union File Systems):允许容器镜像采用分层结构存储,实现高效的镜像共享和复用
- 容器运行时:负责容器的创建、启动、停止等生命周期管理
1.2 容器与虚拟机比较
| 特性 | 容器 | 虚拟机 |
|---|---|---|
| 启动时间 | 秒级 | 分钟级 |
| 资源占用 | 低(共享内核) | 高(完整操作系统) |
| 隔离性 | 进程级别 | 硬件级别 |
| 镜像大小 | 通常几MB到几百MB | 通常几GB |
| 性能 | 接近原生 | 有虚拟化开销 |
| 部署密度 | 高(单机可部署数百个) | 低(单机通常几十个) |
| 管理复杂性 | 低 | 高 |
1.3 容器技术的优势与应用场景
优势:
- 快速部署:容器可以在几秒钟内启动,大大加速了应用部署和扩展
- 环境一致性:容器打包了应用及其依赖,可以在开发、测试和生产环境中保持一致
- 资源高效:相比虚拟机,容器占用更少的CPU、内存和存储资源
- 微服务架构支持:容器是微服务架构的理想运行环境,可以独立部署和扩展各个服务
- CI/CD集成:容器可以与持续集成/持续部署流程无缝集成,实现自动化部署
应用场景:
- 微服务架构:将大型应用拆分为多个独立的微服务,每个服务运行在自己的容器中
- DevOps实践:实现开发、测试和生产环境的一致性,简化部署流程
- 多租户环境:在共享基础设施上安全地隔离不同用户的应用
- 高弹性应用:快速启动和扩展应用实例,应对流量波动
- 混合云和多云环境:容器的一致性特性使其可以在不同的云平台和环境中无缝迁移
2. Docker容器基础
2.1 Docker安装与配置
在Ubuntu/Debian系统上安装Docker:
bash
# 更新apt包索引
sudo apt-get update
# 安装必要的依赖包
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent 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"
# 再次更新apt包索引
sudo apt-get update
# 安装最新版Docker Engine和容器运行时
sudo apt-get install docker-ce docker-ce-cli containerd.io
# 验证Docker是否成功安装
sudo docker run hello-world在CentOS/RHEL系统上安装Docker:
bash
# 安装必要的依赖包
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# 设置Docker仓库
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 安装Docker Engine和容器运行时
sudo yum install docker-ce docker-ce-cli containerd.io
# 启动Docker服务
sudo systemctl start docker
# 设置Docker开机自启
sudo systemctl enable docker
# 验证Docker是否成功安装
sudo docker run hello-world在macOS上安装Docker Desktop:
- 访问 Docker官方网站 下载Docker Desktop for Mac
- 打开下载的.dmg文件并将Docker图标拖到Applications文件夹
- 从Applications文件夹启动Docker Desktop
在Windows上安装Docker Desktop:
- 访问 Docker官方网站 下载Docker Desktop for Windows
- 运行安装程序并按照向导完成安装
- 安装完成后,启动Docker Desktop
2.2 Docker核心概念
Docker有几个核心概念,理解这些概念对于使用Docker至关重要:
镜像(Image): Docker镜像是一个只读模板,包含了运行应用所需的所有文件、依赖和配置。镜像采用分层结构存储,可以通过Dockerfile构建。
容器(Container): 容器是镜像的运行实例,可以被创建、启动、停止、删除和暂停。每个容器都是相互隔离的,拥有自己的文件系统、网络和进程空间。
仓库(Repository): Docker仓库是存储和分发Docker镜像的地方,类似于代码仓库。Docker Hub是官方的公共仓库,用户也可以创建私有仓库。
Dockerfile: Dockerfile是一个包含构建Docker镜像指令的文本文件,通过docker build命令可以从Dockerfile构建镜像。
Docker Compose: Docker Compose是一个工具,用于定义和运行多容器Docker应用。通过docker-compose.yml文件,可以配置应用的服务、网络和卷等。
2.3 Docker常用命令
镜像管理命令:
bash
# 拉取镜像
docker pull ubuntu:20.04
# 列出本地镜像
docker images
# 构建镜像
docker build -t myapp:latest .
# 标记镜像
docker tag myapp:latest username/myapp:latest
# 推送镜像到仓库
docker push username/myapp:latest
# 删除镜像
docker rmi myapp:latest
# 导出镜像为tar文件
docker save -o myapp.tar myapp:latest
# 从tar文件导入镜像
docker load -i myapp.tar容器管理命令:
bash
# 运行容器
docker run -d --name mycontainer -p 80:80 nginx
# 列出运行中的容器
docker ps
# 列出所有容器(包括已停止的)
docker ps -a
# 启动容器
docker start mycontainer
# 停止容器
docker stop mycontainer
# 重启容器
docker restart mycontainer
# 查看容器日志
docker logs mycontainer
# 进入容器内部
docker exec -it mycontainer bash
# 复制文件到容器
docker cp file.txt mycontainer:/path/to/destination
# 从容器复制文件
docker cp mycontainer:/path/to/file.txt .
# 删除容器
docker rm mycontainer
# 删除所有已停止的容器
docker container prune网络管理命令:
bash
# 列出网络
docker network ls
# 创建网络
docker network create mynetwork
# 连接容器到网络
docker network connect mynetwork mycontainer
# 断开容器与网络的连接
docker network disconnect mynetwork mycontainer
# 删除网络
docker network rm mynetwork数据卷管理命令:
bash
# 创建数据卷
docker volume create myvolume
# 列出数据卷
docker volume ls
# 查看数据卷详情
docker volume inspect myvolume
# 删除数据卷
docker volume rm myvolume
# 删除未使用的数据卷
docker volume prune2.4 Docker镜像构建
Docker镜像可以通过Dockerfile构建,以下是一个基本的Dockerfile示例:
dockerfile
# 指定基础镜像
FROM node:14-alpine
# 设置工作目录
WORKDIR /app
# 复制package.json和package-lock.json文件
COPY package*.json ./
# 安装依赖
RUN npm install
# 复制应用代码
COPY . .
# 暴露应用端口
EXPOSE 3000
# 设置环境变量
ENV NODE_ENV=production
# 定义启动命令
CMD ["node", "server.js"]构建镜像:
bash
docker build -t mynodeapp:latest .常用的Dockerfile指令:
FROM:指定基础镜像WORKDIR:设置工作目录COPY:复制文件到镜像ADD:复制文件到镜像(支持URL和自动解压)RUN:在镜像构建过程中执行命令EXPOSE:声明容器监听的端口ENV:设置环境变量ARG:定义构建参数VOLUME:创建挂载点CMD:指定容器启动命令(可以被docker run命令覆盖)ENTRYPOINT:指定容器入口点(通常不被覆盖)LABEL:添加元数据标签USER:设置运行容器的用户HEALTHCHECK:定义健康检查命令
3. Docker网络与存储
3.1 Docker网络模式
Docker提供了多种网络模式,适应不同的应用场景:
bridge模式(默认): 默认的网络模式,为容器创建独立的网络命名空间,容器通过虚拟网桥与宿主机通信。
bash
# 运行容器使用bridge网络
docker run --network bridge nginxhost模式: 容器共享宿主机的网络命名空间,没有网络隔离,性能最好但隔离性最差。
bash
# 运行容器使用host网络
docker run --network host nginxnone模式: 容器有自己的网络命名空间,但没有配置网络接口,完全隔离。
bash
# 运行容器使用none网络
docker run --network none nginxcontainer模式: 共享另一个容器的网络命名空间,两个容器可以通过localhost通信。
bash
# 先运行一个容器
container_id=$(docker run -d nginx)
# 运行第二个容器,共享第一个容器的网络
docker run --network container:$container_id busybox ping localhost自定义网络: 用户可以创建自定义网络,支持多种驱动类型,提供更好的隔离和DNS解析。
bash
# 创建自定义bridge网络
docker network create mynetwork
# 运行容器使用自定义网络
docker run --network mynetwork nginx3.2 Docker存储卷
Docker提供了多种数据持久化方案,其中存储卷是最常用的方式:
数据卷(Volumes): 由Docker管理的存储卷,存储在宿主机的特定目录中,最适合持久化数据。
bash
# 创建数据卷
docker volume create myvolume
# 挂载数据卷到容器
docker run -d -v myvolume:/data nginx绑定挂载(Bind mounts): 将宿主机的任意目录或文件挂载到容器中,灵活性高但依赖于宿主机的文件系统结构。
bash
# 挂载宿主机目录到容器
docker run -d -v /host/path:/container/path nginxtmpfs挂载(tmpfs mounts): 数据存储在宿主机的内存中,容器停止后数据丢失,适合临时数据。
bash
# 使用tmpfs挂载
docker run -d --tmpfs /data nginx3.3 Docker Compose网络配置
Docker Compose简化了多容器应用的网络配置:
yaml
version: '3'
services:
web:
image: nginx
ports:
- "80:80"
networks:
- frontend
- backend
db:
image: postgres
environment:
- POSTGRES_PASSWORD=password
volumes:
- db_data:/var/lib/postgresql/data
networks:
- backend
networks:
frontend:
backend:
volumes:
db_data:启动应用:
bash
docker-compose up -d在默认情况下,Docker Compose会为应用创建一个自定义网络,同一网络中的服务可以通过服务名相互访问。
4. Docker容器编排
4.1 Docker Swarm基础
Docker Swarm是Docker原生的容器编排工具,可以将多个Docker主机组成一个集群,实现容器的编排和管理:
初始化Swarm集群:
bash
# 在管理节点上初始化Swarm
docker swarm init --advertise-addr <MANAGER-IP>加入工作节点:
bash
# 在工作节点上运行(命令从管理节点获取)
docker swarm join --token <TOKEN> <MANAGER-IP>:2377查看节点:
bash
# 在管理节点上查看所有节点
docker node ls部署服务:
bash
# 创建服务并设置副本数为3
docker service create --name web --replicas 3 -p 80:80 nginx
# 查看服务状态
docker service ls
docker service ps web
# 扩展服务
docker service scale web=5
# 更新服务
docker service update --image nginx:latest web
# 删除服务
docker service rm web4.2 Docker Stack部署
Docker Stack允许通过Compose文件部署多服务应用到Swarm集群:
docker-compose.yml文件:
yaml
version: '3'
services:
web:
image: nginx:latest
deploy:
replicas: 3
restart_policy:
condition: on-failure
ports:
- "80:80"
networks:
- webnet
visualizer:
image: dockersamples/visualizer:stable
ports:
- "8080:8080"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
placement:
constraints: [node.role == manager]
networks:
- webnet
networks:
webnet:部署Stack:
bash
# 部署Stack
docker stack deploy -c docker-compose.yml myapp
# 查看Stack中的服务
docker stack services myapp
# 查看Stack中运行的任务
docker stack ps myapp
# 删除Stack
docker stack rm myapp4.3 Kubernetes基础
Kubernetes(简称K8s)是一个开源的容器编排平台,可以自动化容器的部署、扩展和管理。虽然比Docker Swarm复杂,但功能更强大,生态系统更丰富。
Kubernetes核心概念:
- Pod:Kubernetes的基本部署单元,可以包含一个或多个容器
- Service:定义了访问一组Pod的方式,提供负载均衡
- Deployment:管理无状态应用的部署,可以自动扩展和更新Pod
- StatefulSet:管理有状态应用的部署
- DaemonSet:确保每个节点上运行一个Pod副本
- ConfigMap:存储非敏感配置数据
- Secret:存储敏感数据
- Volume:提供数据持久化
- Namespace:将集群资源划分为多个虚拟集群
Minikube安装(本地开发):
bash
# 安装Minikube(单节点Kubernetes集群,用于开发测试)
# 参考官方文档:https://minikube.sigs.k8s.io/docs/start/
# 启动Minikube集群
minikube start
# 检查集群状态
minikube statuskubectl基础命令:
bash
# 查看集群信息
kubectl cluster-info
# 查看节点
kubectl get nodes
# 部署应用
kubectl apply -f deployment.yaml
# 查看部署
kubectl get deployments
# 查看Pod
kubectl get pods
# 查看服务
kubectl get services
# 查看日志
kubectl logs <pod-name>
# 进入Pod
kubectl exec -it <pod-name> -- bash5. Kubernetes入门与进阶
5.1 Kubernetes核心组件
Kubernetes集群由控制平面和工作节点组成:
控制平面组件:
- kube-apiserver:API服务器,集群的前端接口
- etcd:分布式键值存储,保存集群状态
- kube-scheduler:调度器,负责将Pod调度到合适的节点
- kube-controller-manager:控制器管理器,包含多种控制器
- 节点控制器:负责监控节点状态
- 副本控制器:负责维护Pod的副本数量
- 端点控制器:维护Service和Pod的映射关系
- 服务账号控制器:管理服务账号和令牌
工作节点组件:
- kubelet:在每个节点上运行,管理Pod和容器
- kube-proxy:网络代理,维护网络规则
- 容器运行时:负责容器的运行,如Docker、containerd等
5.2 Kubernetes资源配置
Kubernetes使用YAML或JSON格式的配置文件定义资源:
Deployment示例:
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
resources:
limits:
cpu: "1"
memory: "1Gi"
requests:
cpu: "500m"
memory: "512Mi"Service示例:
yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- port: 80
targetPort: 80
type: LoadBalancerConfigMap示例:
yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
config.json: |
{
"api_url": "https://api.example.com",
"debug": "false",
"timeout": "30s"
}
loglevel: "info"Secret示例:
yaml
apiVersion: v1
kind: Secret
metadata:
name: app-secret
type: Opaque
data:
username: dXNlcm5hbWU=
password: cGFzc3dvcmQ=5.3 Kubernetes网络模型
Kubernetes网络模型要求:
- 每个Pod都有一个唯一的IP地址
- Pod可以通过IP地址相互通信,无需NAT
- 节点上的代理可以与所有Pod通信
Kubernetes支持多种网络插件,包括:
- Calico:基于BGP的网络方案,提供高性能网络和网络策略
- Flannel:简单易用的网络方案,适合初学者
- Cilium:基于eBPF的高性能网络方案,支持高级网络策略
- Weave Net:自配置的网络方案,适合多集群环境
使用网络插件:
bash
# 例如,使用kubectl安装Calico
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml5.4 Kubernetes存储管理
Kubernetes提供了多种存储选项:
Volume类型:
- emptyDir:临时卷,Pod删除时数据丢失
- hostPath:使用节点上的文件或目录
- PersistentVolumeClaim:持久化存储声明,引用PersistentVolume
- ConfigMap/Secret:配置和密钥卷
- 云存储卷:如AWS EBS、GCE PD、Azure Disk等
PersistentVolume和PersistentVolumeClaim示例:
PV定义:
yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: my-pv
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
hostPath:
path: "/mnt/data"PVC定义:
yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi在Pod中使用PVC:
yaml
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: app
image: nginx
volumeMounts:
- mountPath: "/data"
name: my-storage
volumes:
- name: my-storage
persistentVolumeClaim:
claimName: my-pvc5.5 Kubernetes高级功能
网络策略:
yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: nginx-policy
spec:
podSelector:
matchLabels:
app: nginx
policyTypes:
- Ingress
- Egress
ingress:
- from:
- podSelector:
matchLabels:
app: frontend
ports:
- protocol: TCP
port: 80
egress:
- to:
- podSelector:
matchLabels:
app: database
ports:
- protocol: TCP
port: 5432自动扩缩容:
yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: nginx-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx-deployment
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70滚动更新:
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
# ...其余配置6. 容器安全
6.1 容器安全基础
容器安全是容器化应用中的重要考虑因素,涉及多个层面:
镜像安全:
- 使用官方或可信来源的基础镜像
- 定期更新镜像以修复安全漏洞
- 扫描镜像中的安全漏洞
- 最小化镜像大小,减少攻击面
容器运行时安全:
- 以非root用户运行容器
- 限制容器的系统调用
- 使用只读文件系统
- 限制容器的资源使用
网络安全:
- 使用网络策略限制容器间通信
- 加密容器间的通信
- 避免使用host网络模式
- 使用TLS加密外部流量
编排平台安全:
- 限制API服务器访问
- 使用RBAC(基于角色的访问控制)
- 定期审计集群配置
- 保护敏感数据(如Secret)
6.2 镜像安全扫描
使用工具扫描Docker镜像中的安全漏洞:
使用Trivy扫描镜像:
bash
# 安装Trivy
sudo apt-get install wget apt-transport-https gnupg lsb-release
wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | sudo apt-key add -
echo deb https://aquasecurity.github.io/trivy-repo/deb $(lsb_release -sc) main | sudo tee -a /etc/apt/sources.list.d/trivy.list
sudo apt-get update
sudo apt-get install trivy
# 扫描镜像
trivy image nginx:latest
# 生成HTML报告
trivy image --format html --output report.html nginx:latest使用Clair扫描镜像:
bash
# 使用Docker Compose启动Clair
wget https://raw.githubusercontent.com/quay/clair/master/docker-compose.yaml
docker-compose up -d
# 使用clairctl客户端扫描镜像
clairctl report nginx:latest6.3 容器安全最佳实践
安全的Dockerfile编写:
dockerfile
# 使用特定版本标签而非latest
FROM node:14.17.3-alpine
# 创建非root用户
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
# 设置工作目录
WORKDIR /app
# 复制必要文件并安装依赖
COPY package*.json ./
RUN npm ci --only=production
# 复制应用代码
COPY --chown=appuser:appgroup . .
# 以非root用户运行
USER appuser
# 限制容器能力
CAP_DROP: ["ALL"]
# 设置只读文件系统
VOLUME ["/app/data"]
# 暴露应用端口
EXPOSE 3000
# 设置启动命令
CMD ["node", "server.js"]安全的容器运行:
bash
# 以非特权模式运行
docker run --user 1000:1000 nginx
# 限制容器能力
docker run --cap-drop ALL --cap-add NET_BIND_SERVICE nginx
# 使用只读文件系统
docker run --read-only -v /tmp nginx
# 限制资源使用
docker run --memory="512m" --cpus="0.5" nginx
# 启用内容信任
export DOCKER_CONTENT_TRUST=1Kubernetes安全配置:
yaml
apiVersion: v1
kind: Pod
metadata:
name: secure-pod
spec:
containers:
- name: nginx
image: nginx:1.19.10
securityContext:
runAsNonRoot: true
runAsUser: 1000
runAsGroup: 1000
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
capabilities:
drop: ["ALL"]
add: ["NET_BIND_SERVICE"]
resources:
limits:
cpu: "500m"
memory: "512Mi"
requests:
cpu: "200m"
memory: "256Mi"
securityContext:
fsGroup: 1000
supplementalGroups: [1001]7. 容器监控与日志管理
7.1 容器监控方案
容器监控是确保应用可靠性和性能的关键,可以使用多种工具:
Prometheus + Grafana:
bash
# 使用Helm安装Prometheus和Grafana(在Kubernetes中)
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install prometheus prometheus-community/kube-prometheus-stack使用cAdvisor监控容器资源使用:
bash
# 在Docker中,cAdvisor已集成到Docker Engine中
# 访问 http://localhost:8080/metrics 获取监控指标
# 在独立模式下运行cAdvisor
docker run --volume=/:/rootfs:ro \
--volume=/var/run:/var/run:ro \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--publish=8080:8080 \
--detach=true \
--name=cadvisor \
gcr.io/cadvisor/cadvisor:latest使用Metrics Server获取Kubernetes资源指标:
bash
# 安装Metrics Server
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
# 查看节点和Pod的资源使用情况
kubectl top nodes
kubectl top pods7.2 容器日志管理
容器日志管理对于故障排查和性能监控至关重要:
Docker日志管理:
bash
# 查看容器日志
docker logs mycontainer
# 跟踪日志输出
docker logs -f mycontainer
# 限制日志大小和文件数量(编辑docker daemon.json)
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}Kubernetes日志管理:
bash
# 查看Pod日志
kubectl logs mypod
# 查看Pod中特定容器的日志
kubectl logs mypod -c mycontainer
# 跟踪日志输出
kubectl logs -f mypod使用ELK Stack收集和分析日志:
yaml
# 使用Helm安装ELK Stack(在Kubernetes中)
helm repo add elastic https://helm.elastic.co
helm repo update
helm install elasticsearch elastic/elasticsearch --set replicas=1
helm install kibana elastic/kibana --set elasticsearchHosts=http://elasticsearch-master:9200
helm install filebeat elastic/filebeat --set kubernetes.enabled=true7.3 性能监控与告警
设置性能监控和告警可以及时发现和解决问题:
Prometheus告警规则示例:
yaml
groups:
- name: container_alerts
rules:
- alert: ContainerHighCpuUsage
expr: sum(rate(container_cpu_usage_seconds_total{container!=""}[5m])) by (pod, container) > 0.8
for: 5m
labels:
severity: warning
annotations:
summary: "High CPU usage ({{ $labels.pod }}/{{ $labels.container }})"
description: "Container CPU usage is above 80% for 5 minutes.\n VALUE = {{ $value }}\n LABELS: {{ $labels }}"
- alert: ContainerHighMemoryUsage
expr: container_memory_usage_bytes{container!=""} / container_spec_memory_limit_bytes{container!=""} > 0.9
for: 5m
labels:
severity: warning
annotations:
summary: "High memory usage ({{ $labels.pod }}/{{ $labels.container }})"
description: "Container memory usage is above 90% of limit for 5 minutes.\n VALUE = {{ $value | humanizePercentage }}\n LABELS: {{ $labels }}"Grafana仪表板:
- 容器资源使用情况仪表板(ID: 8563)
- Kubernetes集群监控仪表板(ID: 10856)
- Docker监控仪表板(ID: 893)
8. 容器最佳实践
8.1 Dockerfile最佳实践
编写高效、安全的Dockerfile:
- 使用多阶段构建减小镜像大小:
dockerfile
# 构建阶段
FROM node:14-alpine as builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# 运行阶段
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]- 合理排序指令利用构建缓存:
dockerfile
FROM node:14-alpine
WORKDIR /app
# 先复制依赖文件并安装,利用缓存
COPY package*.json ./
RUN npm ci
# 再复制代码,这样修改代码不会导致依赖重新安装
COPY . .
# 构建应用
RUN npm run build
EXPOSE 3000
CMD ["npm", "start"]- 最小化层数:
dockerfile
FROM alpine:3.14
# 合并多个RUN命令减少层数
RUN apk --no-cache add nginx php php-fpm && \
mkdir -p /run/nginx && \
rm -f /etc/nginx/conf.d/default.conf
COPY nginx.conf /etc/nginx/conf.d/
COPY index.php /var/www/html/
EXPOSE 80
CMD ["sh", "-c", "php-fpm & nginx -g 'daemon off;'\