Skip to main content

Minikube 本地 Registry 管理 Laravel 和 Vue 镜像

使用 Minikube 内置的 registry 可以方便地在本地管理 Laravel 和 Vue 镜像,无需依赖外部 registry(如 Docker Hub)。以下是完整的配置方案:

1. 启用 Minikube 的本地 Registry

# 启动 Minikube 并启用 registry 插件
minikube start --driver=docker --insecure-registry="10.0.0.0/24"
minikube addons enable registry

# 查看 registry 服务
kubectl get svc -n kube-system | grep registry

# 设置端口转发,使本地可以访问 registry
kubectl port-forward --namespace kube-system service/registry 5000:80 &

2. 配置 Docker 使用 Minikube 的 Registry

# 设置环境变量指向 Minikube 的 Docker daemon
eval $(minikube docker-env)

# 验证是否连接到 Minikube 的 Docker
docker info | grep "Name: minikube"

3. 构建和推送 Laravel 镜像

Laravel Dockerfile 示例

# Dockerfile.laravel
FROM php:8.1-fpm

# 安装依赖
RUN apt-get update && apt-get install -y \
    git \
    curl \
    libpng-dev \
    libonig-dev \
    libxml2-dev \
    zip \
    unzip \
    libzip-dev

# 安装 PHP 扩展
RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd zip

# 安装 Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

# 设置工作目录
WORKDIR /var/www

# 复制项目文件
COPY . .

# 安装依赖
RUN composer install --optimize-autoloader --no-dev

# 优化配置
RUN php artisan config:cache && \
    php artisan route:cache && \
    php artisan view:cache

# 暴露端口
EXPOSE 9000

# 启动命令
CMD ["php-fpm"]

构建和推送 Laravel 镜像

# 构建镜像
docker build -t localhost:5000/laravel-app:latest -f Dockerfile.laravel .

# 推送镜像到本地 registry
docker push localhost:5000/laravel-app:latest

# 验证镜像是否在 registry 中
curl http://localhost:5000/v2/_catalog

4. 构建和推送 Vue 镜像

Vue Dockerfile 示例

# Dockerfile.vue
FROM node:16 as builder

WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build

FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

相关 Nginx 配置

# nginx.conf
server {
    listen 80;
    server_name localhost;

    location / {
        root /usr/share/nginx/html;
        index index.html;
        try_files $uri $uri/ /index.html;
    }

    location /api {
        proxy_pass http://laravel-backend:9000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

构建和推送 Vue 镜像

# 构建镜像
docker build -t localhost:5000/vue-app:latest -f Dockerfile.vue .

# 推送镜像到本地 registry
docker push localhost:5000/vue-app:latest

# 验证镜像
curl http://localhost:5000/v2/_catalog

5. 部署 Kubernetes 资源

Laravel 部署配置

# laravel-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: laravel-backend
  namespace: laravel-vue-app
spec:
  replicas: 2
  selector:
    matchLabels:
      app: laravel-backend
  template:
    metadata:
      labels:
        app: laravel-backend
    spec:
      containers:
      - name: laravel-app
        image: localhost:5000/laravel-app:latest
        imagePullPolicy: Always
        env:
        - name: DB_HOST
          value: "mysql"
        - name: DB_DATABASE
          value: "laravel"
        - name: DB_USERNAME
          value: "root"
        - name: DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: laravel-secrets
              key: db-password
        ports:
        - containerPort: 9000
        resources:
          requests:
            cpu: "100m"
            memory: "256Mi"
          limits:
            cpu: "500m"
            memory: "512Mi"

Vue 部署配置

# vue-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: vue-frontend
  namespace: laravel-vue-app
spec:
  replicas: 2
  selector:
    matchLabels:
      app: vue-frontend
  template:
    metadata:
      labels:
        app: vue-frontend
    spec:
      containers:
      - name: vue-app
        image: localhost:5000/vue-app:latest
        imagePullPolicy: Always
        ports:
        - containerPort: 80
        resources:
          requests:
            cpu: "50m"
            memory: "128Mi"
          limits:
            cpu: "200m"
            memory: "256Mi"

6. 验证部署

# 应用所有配置
kubectl apply -f namespace.yaml
kubectl apply -f mysql-pvc.yaml
kubectl apply -f mysql-deployment.yaml
kubectl apply -f mysql-service.yaml
kubectl apply -f redis-deployment.yaml
kubectl apply -f redis-service.yaml
kubectl apply -f laravel-deployment.yaml
kubectl apply -f laravel-service.yaml
kubectl apply -f vue-deployment.yaml
kubectl apply -f vue-service.yaml
kubectl apply -f ingress.yaml

# 查看 pod 状态
kubectl get pods -n laravel-vue-app -w

# 获取应用 URL
minikube service list

7. 自动化构建和部署脚本

创建 build-and-deploy.sh 脚本:

#!/bin/bash

# 构建 Laravel 镜像
echo "Building Laravel image..."
docker build -t localhost:5000/laravel-app:latest -f Dockerfile.laravel .
docker push localhost:5000/laravel-app:latest

# 构建 Vue 镜像
echo "Building Vue image..."
docker build -t localhost:5000/vue-app:latest -f Dockerfile.vue .
docker push localhost:5000/vue-app:latest

# 重新部署 Kubernetes 资源
echo "Redeploying applications..."
kubectl rollout restart deployment/laravel-backend -n laravel-vue-app
kubectl rollout restart deployment/vue-frontend -n laravel-vue-app

echo "Deployment complete!"

8. 常见问题解决

镜像拉取问题

如果遇到镜像拉取问题,可以尝试:

# 确保 Minikube 使用本地 Docker daemon
eval $(minikube docker-env)

# 检查 registry 是否运行
kubectl get pods -n kube-system | grep registry

# 如果 registry 有问题,重新启用
minikube addons disable registry
minikube addons enable registry

性能优化

对于开发环境,可以配置资源限制:

# 在 deployment 中添加
resources:
  requests:
    cpu: "100m"
    memory: "128Mi"
  limits:
    cpu: "500m"
    memory: "512Mi"

9. 清理资源

# 删除部署
kubectl delete -f .

# 禁用 registry
minikube addons disable registry

# 删除本地镜像
docker rmi localhost:5000/laravel-app:latest
docker rmi localhost:5000/vue-app:latest

通过这种方式,您可以在 Minikube 环境中完全本地化管理 Laravel 和 Vue 镜像,无需依赖外部 registry,适合开发和测试环境使用。