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,适合开发和测试环境使用。
No Comments