9. Linux与容器化
9.1 核心知识点
Linux基础命令
文件操作:ls, cd, pwd, mkdir, rm, cp, mv, touch
文件查看:cat, less, head, tail, grep
文件权限:chmod, chown
进程管理:ps, top, kill, pkill
网络命令:ping, netstat, curl, wget
系统信息:uname, df, du, freeDocker基础
docker build -t myapp:1.0 .
docker run -d -p 8080:8080 --name myapp myapp:1.0
docker ps
docker logs myapp
docker exec -it myapp /bin/bash
docker stop myapp
docker rm myapp
docker rmi myapp:1.0Dockerfile
FROM golang:1.21-alpine AS builder
WORKDIR /app
COPY . .
RUN go build -o main .
FROM alpine:latest
WORKDIR /root/
COPY --from=builder /app/main .
EXPOSE 8080
CMD ["./main"]Kubernetes基础
kubectl get pods
kubectl get services
kubectl get deployments
kubectl apply -f deployment.yaml
kubectl logs -f pod-name
kubectl exec -it pod-name -- /bin/bash
kubectl scale deployment myapp --replicas=3
kubectl delete pod pod-nameKubernetes资源
Deployment:
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:1.0
ports:
- containerPort: 8080
Service:
apiVersion: v1
kind: Service
metadata:
name: myapp-service
spec:
selector:
app: myapp
ports:
- port: 80
targetPort: 8080
type: LoadBalancer
ConfigMap:
apiVersion: v1
kind: ConfigMap
metadata:
name: myapp-config
data:
database.url: "postgres://localhost:5432/mydb"
cache.enabled: "true"
Secret:
apiVersion: v1
kind: Secret
metadata:
name: myapp-secret
type: Opaque
data:
password: cGFzc3dvcmQ=9.2 常见面试题
Q1: 如何编写高效的Dockerfile?
解题思路:
- 说明Dockerfile的最佳实践
- 解释多阶段构建的优势
- 演示如何优化镜像大小
- 说明如何利用Docker缓存
代码实现:
FROM golang:1.21-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main .
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /app/main .
EXPOSE 8080
CMD ["./main"]常见错误分析:
- 错误1:不使用多阶段构建导致镜像过大
- 错误2:COPY顺序不当导致缓存失效
- 错误3:忘记设置EXPOSE端口
Q2: Kubernetes的Deployment和StatefulSet有什么区别?
解题思路:
- 解释Deployment的基本特性(无状态应用)
- 解释StatefulSet的基本特性(有状态应用)
- 对比两者的适用场景
- 说明StatefulSet的稳定网络标识和持久化存储
代码实现:
Deployment(无状态应用):
apiVersion: apps/v1
kind: Deployment
metadata:
name: webapp
spec:
replicas: 3
selector:
matchLabels:
app: webapp
template:
metadata:
labels:
app: webapp
spec:
containers:
- name: webapp
image: webapp:1.0
ports:
- containerPort: 8080
StatefulSet(有状态应用):
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
serviceName: mysql
replicas: 3
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:8.0
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumeClaimTemplates:
- metadata:
name: mysql-persistent-storage
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 10Gi常见错误分析:
- 错误1:混淆Deployment和StatefulSet的适用场景
- 错误2:StatefulSet忘记配置serviceName
- 错误3:不理解StatefulSet的有序部署和扩展
Q3: 如何在Kubernetes中实现配置管理?
解题思路:
- 说明ConfigMap和Secret的用途
- 演示如何创建ConfigMap和Secret
- 说明如何在Pod中使用ConfigMap和Secret
- 展示如何实现配置的热更新
代码实现:
ConfigMap(非敏感配置):
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
app.properties: |
server.port=8080
database.url=postgres://localhost:5432/mydb
cache.enabled=true
log-level: "info"
Secret(敏感配置):
apiVersion: v1
kind: Secret
metadata:
name: app-secret
type: Opaque
data:
database-password: cGFzc3dvcmQxMjM=
api-key: YXBpLWtleS0xMjM0NTY3ODkw
使用ConfigMap和Secret:
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:1.0
env:
- name: LOG_LEVEL
valueFrom:
configMapKeyRef:
name: app-config
key: log-level
- name: DATABASE_PASSWORD
valueFrom:
secretKeyRef:
name: app-secret
key: database-password
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: app-config常见错误分析:
- 错误1:在Secret中存储明文密码
- 错误2:ConfigMap和Secret的value需要base64编码
- 错误3:不理解配置更新的传播机制