# docker-container **Repository Path**: silence1224/docker-container ## Basic Information - **Project Name**: docker-container - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-01-30 - **Last Updated**: 2026-01-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 县级就业AI项目部署文档 ## 项目概述 - **项目名称**: county-job-ai-node - **架构**: 前后端分离 + Docker容器化部署 - **前端**: Vue 3 + Vite + Vue Router - **后端**: Node.js + Express - **Web服务器**: Nginx ## 项目结构 ``` county-job-ai-node/ ├── back/ # 后端项目 │ ├── app.js # 主入口文件 │ ├── package.json │ ├── Dockerfile # 后端Docker镜像 │ └── docker-compose.yml ├── front/ # 前端项目 │ ├── src/ │ │ └── router/ # 路由配置 │ ├── index.html │ ├── package.json │ ├── vite.config.js # Vite配置 │ ├── nginx.conf # Nginx配置(挂载用) │ ├── Dockerfile # 前端Docker镜像(多阶段构建) │ └── docker-compose.yml └── nginx/ # Nginx相关配置 ``` ## 后端部署 ### 1. 构建后端镜像 ```bash cd /root/project/back docker compose build ``` ### 2. 启动后端容器 ```bash docker compose up -d ``` ### 3. 验证后端服务 ```bash # 查看容器状态 docker ps | grep county-job-back # 测试API curl http://localhost:8888/api/users ``` ### 后端Docker配置说明 **Dockerfile** (`back/Dockerfile`): - 基础镜像: `node:18-alpine` - 工作目录: `/app` - 端口: `8888` - 启动命令: `node app.js` **docker-compose.yml** (`back/docker-compose.yml`): - 容器名: `county-job-back` - 镜像名: `county-job-back:v1` - 端口映射: `8888:8888` - 网络: `back-network` ## 前端部署 ### 1. 构建前端镜像 ```bash cd /root/project/front docker compose build ``` ### 2. 启动前端容器 ```bash docker compose up -d ``` ### 3. 配置Nginx **步骤1:创建Nginx配置文件** ```bash cat > /root/project/nginx/nginx.conf << 'EOF' server { listen 80; server_name localhost; location / { alias /usr/share/nginx/html/county-job/; try_files $uri $uri/ /county-job/index.html; } location /api { proxy_pass http://172.18.0.1:8888; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } EOF ``` **步骤2:复制配置到容器** ```bash docker cp /root/project/nginx/nginx.conf county-job-front:/etc/nginx/conf.d/default.conf ``` **步骤3:重载Nginx** ```bash docker exec county-job-front nginx -s reload ``` ### 4. 验证前端服务 ```bash # 查看容器状态 docker ps | grep county-job-front # 测试前端页面 curl http://localhost/county-job/ # 测试API代理 curl http://localhost/api/users ``` ### 前端Docker配置说明 **Dockerfile** (`front/Dockerfile`): - **多阶段构建**: - builder阶段: Node.js + Vite构建前端 - 运行阶段: Nginx提供静态文件服务 - 基础镜像: - builder: `node:18-alpine` - 运行: `nginx:alpine` - 工作目录: `/app` (builder阶段) - 输出目录: `dist/county-job` - Nginx目录: `/usr/share/nginx/html/county-job` - 端口: `80` **docker-compose.yml** (`front/docker-compose.yml`): - 容器名: `county-job-front` - 镜像名: `county-job-front:v1` - 端口映射: `80:80` - 额外主机配置: `host.docker.internal:host-gateway` ### Vite配置说明 **vite.config.js** (`front/vite.config.js`): - base: `/` - outDir: `dist/county-job` - 开发服务器代理: - `/api` → `http://localhost:8888` ## 容器管理 ### 创建和启动容器 ```bash # 1. 构建镜像 docker compose build # 2. 创建并启动容器 docker compose up -d # 3. 查看运行中的容器 docker ps # 4. 查看所有容器(包括停止的) docker ps -a # 5. 停止容器 docker stop county-job-front docker stop county-job-back # 6. 启动已存在的容器 docker start county-job-front docker start county-job-back # 7. 重启容器 docker restart county-job-front docker restart county-job-back # 8. 删除容器 docker rm county-job-front docker rm county-job-back # 9. 停止并删除所有容器 docker compose down # 10. 停止并删除容器 + 镜像 docker compose down --rmi all ``` ### 常用操作组合 ```bash # 完整启动流程(从零开始) cd /root/project/front docker compose build # 构建镜像 docker compose up -d # 创建并启动容器 # 更新部署 cd /root/project/front docker compose down # 停止并删除容器 docker compose build # 重新构建 docker compose up -d # 启动新容器 # 快速重启(不重新构建) docker restart county-job-front # 查看状态 docker ps | grep county-job ``` ### 查看运行状态 ```bash # 查看所有容器 docker ps -a # 查看特定容器 docker ps | grep county-job ``` ### 查看容器日志 ```bash # 前端日志 docker logs county-job-front # 后端日志 docker logs county-job-back # 实时查看日志 docker logs -f county-job-front ``` ### 停止和启动容器 ```bash # 停止容器 docker stop county-job-front county-job-back # 启动容器 docker start county-job-front county-job-back # 重启容器 docker restart county-job-front ``` ### 进入容器 ```bash # 进入前端容器 docker exec -it county-job-front sh # 进入后端容器 docker exec -it county-job-back sh ``` ### 复制文件 ```bash # 从宿主机复制到容器 docker cp /root/nginx.conf county-job-front:/etc/nginx/conf.d/default.conf # 从容器复制到宿主机 docker cp county-job-front:/etc/nginx/conf.d/default.conf /root/nginx.conf ``` ## 网络配置 ### 容器通信 - **前端容器访问后端**: - 通过nginx代理: `http://172.18.0.1:8888` - 172.18.0.1 是宿主机的docker网桥IP - **获取宿主机IP**: ```bash ip addr show docker0 | grep "inet " | awk '{print $2}' | cut -d/ -f1 ``` ### 端口映射 | 服务 | 容器端口 | 宿主机端口 | | ---- | ---- | ----- | | 前端 | 80 | 80 | | 后端 | 8888 | 8888 | ## 访问地址 ### 前端访问 ``` http://47.106.89.240/county-job/ ``` ### 后端API访问 ```bash # 本地访问 curl http://localhost:8888/api/users # 公网访问 curl http://47.106.89.240:8888/api/users ``` ### Nginx代理访问 ```bash # 通过前端nginx代理访问后端API curl http://47.106.89.240/api/users ``` ## Nginx配置详解 ### 配置文件位置 - **宿主机配置**: `/root/nginx.conf` - **容器配置**: `/etc/nginx/conf.d/default.conf` ### 配置说明 ```nginx server { listen 80; # 监听80端口 server_name localhost; # 前端静态文件 location / { alias /usr/share/nginx/html/county-job/; # 静态文件目录 try_files $uri $uri/ /county-job/index.html; # SPA路由支持 } # API反向代理 location /api { proxy_pass http://172.18.0.1:8888; # 代理到宿主机后端 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } ``` ### 配置更新流程 ```bash # 1. 编辑配置 vi /root/project/nginx/nginx.conf # 2. 复制到容器 docker cp /root/project/nginx/nginx.conf county-job-front:/etc/nginx/conf.d/default.conf # 3. 测试配置 docker exec county-job-front nginx -t # 4. 重载配置(不中断服务) docker exec county-job-front nginx -s reload # 5. 验证 curl http://localhost/api/users ``` ## 常见问题 ### 1. 容器无法启动 **检查日志**: ```bash docker logs county-job-front ``` **常见原因**: - 端口被占用 - nginx配置错误 - 镜像构建失败 ### 2. 502 Bad Gateway **原因**: nginx无法连接到后端 **解决**: ```bash # 测试容器能否访问后端 docker exec county-job-front curl http://172.18.0.1:8888/api/users # 检查nginx配置 docker exec county-job-front cat /etc/nginx/conf.d/default.conf ``` ### 3. 前端页面404 **检查**: ```bash # 静态文件是否存在 docker exec county-job-front ls -la /usr/share/nginx/html/county-job/ # nginx配置路径是否正确 docker exec county-job-front cat /etc/nginx/conf.d/default.conf ``` ### 4. host.docker.internal无效 **原因**: Linux上需要配置extra_hosts **解决**: 1. 检查docker-compose.yml是否包含: ```yaml extra_hosts: - "host.docker.internal:host-gateway" ``` 2. 或使用宿主机IP代替 (172.18.0.1) ## 容器与宿主机关系 ### 关键概念 - **容器文件系统**: 独立的文件系统,互不干扰 - **容器与宿主机**: 两个独立的"系统" - **文件存储**: 容器文件最终存储在宿主机的 `/var/lib/docker/` ### 操作区别 | 操作类型 | 宿主机命令 | 容器命令 | | ---- | --------------------------- | ---------------------------------------- | | 查看文件 | `cat /etc/nginx/nginx.conf` | `docker exec 容器名 cat /etc/nginx/nginx.conf` | | 执行命令 | `ls -la` | `docker exec 容器名 ls -la` | | 编辑文件 | `vi /root/test.txt` | `docker exec -it 容器名 vi /root/test.txt` | | 复制文件 | `cp a.txt b.txt` | `docker cp a.txt 容器名:/path/` | ### 判断规则 - 命令带 `docker exec 容器名` → 操作容器 - 命令不带docker前缀 → 操作宿主机 ## 生产环境建议 ### 方案1: 使用宿主机Nginx(推荐) 1. 将前端静态文件部署到宿主机nginx 2. 更稳定、易于管理 3. 便于配置HTTPS、域名等 ### 方案2: 继续使用容器 添加额外配置: - HTTPS支持 - 域名配置 - 防火墙配置 - 日志管理 ## 开发环境 ### 前端开发 ```bash cd front npm install npm run dev ``` 访问: `http://localhost:5173/county-job/` ### 后端开发 ```bash cd back npm install node app.js ``` 访问: `http://localhost:8888/api/users` ## 总结 本项目实现了: - ✓ 前后端完全分离 - ✓ Docker容器化部署 - ✓ Nginx反向代理 - ✓ API跨域处理 - ✓ SPA路由支持 前端访问: `http://47.106.89.240/county-job/` 后端访问: `http://47.106.89.240:8888/api/users`