北辰 发布的文章

需要使用docker-compose进行部署

创建docker-compose.yml文件

touch docker-compose.yml

写入如下配置

services:
  nacos:
    image: nacos/nacos-server:v2.1.2
    container_name: nacos-standalone
    ports:
      - "8848:8848"
      - "9848:9848"
      - "9849:9849"
    environment:
      - MODE=standalone
      - JVM_XMS=128m
      - JVM_XMX=128m
      - NACOS_AUTH_ENABLE=false
    volumes:
      - /beichen/nacos/data:/home/nacos/data
    restart: unless-stoppe

打开浏览器,访问 http://你的服务器IP:8848/nacos。

默认账号/密码:nacos / nacos。

您可以通过以下几种方式将Docker的存储位置改为 /home 目录:

方法1:修改Docker根目录(推荐)

步骤1:停止Docker服务

sudo systemctl stop docker

步骤2:移动现有Docker数据(如果有)

sudo mv /var/lib/docker /home/docker

步骤3:创建符号链接

sudo ln -s /home/docker /var/lib/docker

步骤4:或者修改daemon.json配置文件

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json << EOF
{
  "data-root": "/home/docker"
}
EOF

步骤5:启动Docker服务

sudo systemctl start docker

方法2:临时方案 - 使用存储空间充足的目录

步骤1:在/home下创建临时目录

mkdir -p /home/docker_tmp

步骤2:设置DOCKER_TMPDIR环境变量后加载镜像

export DOCKER_TMPDIR=/home/docker_tmp
docker load -i your_image_file.tar

方法3:直接指定存储目录启动Docker守护进程

# 停止当前Docker服务
sudo systemctl stop docker

# 使用指定数据目录启动Docker
sudo dockerd --data-root /home/docker &

验证配置

配置完成后,检查Docker存储位置:

docker info | grep "Docker Root Dir"

推荐使用方案

推荐使用方法1,修改daemon.json配置文件,这是最稳定和持久的解决方案。

执行完上述任一方法后,您就可以重新加载镜像了:

docker load -i your_image_file.tar

这样Docker就会使用 /home 目录下的空间来存储镜像和数据了。

安装docker

一、创建docker安装脚本

touch install.sh
#!/bin/sh
 
echo '解压tar包'
tar -xvf $1
echo '将docker目录下所有文件复制到/usr/bin目录'
cp docker/* /usr/bin
echo '将docker.service 复制到/etc/systemd/system/目录'
cp docker.service /etc/systemd/system/
echo '添加文件可执行权限'
chmod +x /etc/systemd/system/docker.service
echo '重新加载配置文件'
systemctl daemon-reload
echo '启动docker'
systemctl start docker
echo '设置开机自启'
systemctl enable docker.service
echo 'docker安装成功'
docker -v

二、创建docker-compose安装脚本

touch installCompose.sh
#!/bin/sh

set -e  # 遇到错误立即退出

# 检查参数
if [ $# -eq 0 ]; then
    echo "错误: 请提供docker-compose二进制文件名作为参数"
    echo "用法: ./installCompose.sh <docker-compose-binary-file>"
    exit 1
fi

COMPOSE_FILE=$1

# 检查文件是否存在
if [ ! -f "$COMPOSE_FILE" ]; then
    echo "错误: 文件 $COMPOSE_FILE 不存在"
    exit 1
fi

echo '步骤1: 检查文件类型'
file "$COMPOSE_FILE"

echo '步骤2: 将docker-compose文件复制到/usr/bin目录'
cp "$COMPOSE_FILE" /usr/bin/docker-compose

echo '步骤3: 添加文件可执行权限'
chmod +x /usr/bin/docker-compose

echo '步骤4: 验证docker-compose安装'
docker-compose --version

if [ $? -eq 0 ]; then
    echo '✅ docker-compose安装成功'
else
    echo '❌ docker-compose安装失败'
    exit 1
fi

三、创建docker.service脚本文件

touch docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
 
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
# restart the docker process if it exits prematurely
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
 
[Install]
WantedBy=multi-user.target

四、创建uninstall.sh卸载脚本

touch uninstall.sh
#!/bin/sh
 
echo '停止docker'
systemctl stop docker
echo '删除docker.service'
rm -f /etc/systemd/system/docker.service
echo '删除docker文件'
rm -rf /usr/bin/docker*
echo '重新加载配置文件'
systemctl daemon-reload
echo '卸载成功'

五、上传安装包到脚本目录

六、为脚本赋予权限

chmod 777 install.sh
chmod 777 installCompose.sh
chmod 777 uninstall.sh

七、执行脚本文件

sh install.sh docker-28.0.4.tgz
sh installCompose.sh docker-compose-linux-x86_64

八、验证命令

docker -v
docker-compose -v

好的,使用 Trea 编译器(一个结合了 Vue 前端和 Spring Boot 后端开发的工具或框架)进行项目开发时,制定清晰的项目规则至关重要。这能确保团队协作顺畅、代码风格统一、项目结构清晰。

以下是为您的 Vue + Spring Boot 全栈项目量身定制的一套项目规则,涵盖了目录结构、编码规范、API 设计、构建部署等多个方面。


Trea Vue + Spring Boot 全栈项目开发规则

一、 项目结构与命名规范

  1. 总体结构 (Monorepo 推荐)

    • 项目根目录下分为两个主要模块:bc-cxbs-frount/bc-cxbs-back/
    • 使用一个 Git 仓库进行管理,便于关联性修改和版本控制。
  2. 后端 (Spring Boot) 规范

    • 包名(Package): 使用 com.[公司/组织名].[项目名].[模块名] 的格式。

      • 示例:com.xxx.xxx.controller, com.xxx.xxx.service.impl, com.xxx.xxx.mapper
    • 类名(Class): 大驼峰命名法 (UserService, EmployeeController)
    • 方法名(Method): 小驼峰命名法 (getUserById, createNewOrder)
    • 变量(Variable): 小驼峰命名法 (userName, orderList)
    • 常量(Constant): 全大写,下划线分割 (MAX_CONNECTION, DEFAULT_TIMEOUT)
  3. 前端 (Vue) 规范

二、 代码风格与质量

  1. 后端 (Spring Boot)

    • 代码格式化: 统一使用 SpotlessGoogle Java Format 插件,在提交代码时自动格式化。
    • 静态代码分析: 集成 SonarQube 或使用 Checkstyle, PMD 进行代码质量扫描。必须修复 Blocker 和 Critical 级别的漏洞。
    • 依赖管理: 在 pom.xml 中使用 <dependencyManagement> 统一管理依赖版本。
  2. 前端 (Vue)

    • 代码格式化: 统一使用 Prettier
    • 代码检查: 统一使用 ESLint,推荐使用 @vue/eslint-config-prettier 规则集以避免与 Prettier 冲突。
    • 编辑器配置: 项目根目录提供 .editorconfig 文件,确保不同 IDE 基础格式一致。
    • Git Hook: 使用 Husky + lint-staged,在 git commit 前自动格式化代码 (prettier --write) 和进行 ESLint 检查。

三、 API 设计规范 (RESTful)

  1. 基本原则

    • 使用 HTTP 动词 (GET, POST, PUT, DELETE, PATCH) 表示操作类型。
    • 使用 名词复数 表示资源集合。
    • 返回合适的 HTTP 状态码 (200 OK, 201 Created, 400 Bad Request, 401 Unauthorized, 404 Not Found, 500 Internal Server Error)。
  2. URL 示例

    • GET /api/v1/users: 获取用户列表
    • POST /api/v1/users: 创建一个新用户
    • GET /api/v1/users/{id}: 获取单个用户详情
    • PUT /api/v1/users/{id}: 替换/更新一个用户(全量)
    • PATCH /api/v1/users/{id}: 部分更新一个用户
    • DELETE /api/v1/users/{id}: 删除一个用户
  3. 响应体格式

    • 统一使用 JSON 格式。
    • 响应体应包裹在一个标准的结构中,包含 code, data, message 等字段,便于前端统一处理。
    {
      "code": 200,
      "data": {
        "id": xxx,
        "name": "xxx"
      },
      "message": "Success"
    }
    • 对于列表,应提供分页信息:

      {
      "code": 1000,
      "msg": null,
      "pageNum": 1,
      "pageSize": 10,
      "total": 5,
      "pages": 1,
      "list": [
      {
          "userId": xxx,
          "deptId": xxx
      }
      ],
      "hasPreviousPage": false,
      "hasNextPage": false,
      "firstPage": true,
      "lastPage": true,
      "empty": false,
      "offset": 0
      }
  4. API 文档

    • 后端必须使用 OpenAPI 3.0 (Swagger) 自动生成 API 文档。
    • 集成 springdoc-openapi 库,访问 /v3/api-docs/swagger-ui.html 即可查看和调试接口。

四、 前后端交互与联调

  1. 环境配置

    • 前端使用 vue.config.jsdevServer.proxy 配置开发环境代理,解决跨域问题。

      // vue.config.js
      module.exports = {
        devServer: {
      proxy: {
        '/api': {
          target: 'http://localhost:8080', // 后端本地地址
          changeOrigin: true
        }
      }
        }
      };
  2. Axios 封装

    • 前端统一封装 Axios 实例,设置基地址 (baseURL)、请求/响应拦截器。
    • 拦截器中统一处理错误(如弹出错误消息)、添加认证 Token 等。
  3. 状态管理 (Vue)

    • 中大型项目推荐使用 Pinia (Vuex 的升级版) 进行全局状态管理,管理用户信息、应用配置等跨组件数据。

五、 数据与安全

  1. 前端安全

    • 对用户输入进行校验和转义,防止 XSS。
    • 谨慎使用 v-html

六、 构建与部署

  1. 环境分离

    • 为开发 (dev)、测试 (test)、生产 (prod) 环境提供不同的配置文件(如 application-dev.yml, .env.development, .env.production)。
  2. 后端构建

    • 使用 maven clean package -DskipTests 打包生成可执行的 JAR 文件。
  3. 前端构建

    • 使用 npm run build 生成静态资源文件 (dist 目录)。
  4. 部署策略 (示例)

    • 方案A (分离部署): 前端静态文件部署到 Nginx 或对象存储 (AWS S3, OSS)。后端 JAR 包部署到服务器或容器中。Nginx 同时作为反向代理将 API 请求转发给后端服务。
    • 方案B (集成部署): 将 npm run build 后的前端 dist 目录内容复制到 Spring Boot 的 src/main/resources/static/ 目录下,打包成一个 JAR。Spring Boot 同时提供 API 和静态资源服务。(适合简单项目)

如何使用这份规则:

  1. 将这份规则保存为 PROJECT_RULES.mdDEVELOPMENT_GUIDE.md 放在项目根目录。
  2. 让所有团队成员阅读并同意遵守。
  3. 将规则中的工具(Prettier, ESLint, Husky, Spotless, springdoc)具体配置到项目中。
  4. 在 Code Review 中严格检查这些规则的执行情况。

希望这套详细的规则能帮助您的 Trea 项目顺利开发!

好的,在 Docker Desktop 中下载好镜像后,导出镜像有两种主要方式,适用于不同的场景:

  1. docker save:用于将 一个或多个镜像 导出为一个归档文件(tar包),便于备份或传输到其他 Docker 环境中。这是最常用的方法。
  2. docker export:用于将 一个容器的文件系统 导出为一个 tar 归档文件。注意,它导出的是容器快照,会丢失镜像的历史、元数据(如环境变量、入口点)等信息,通常不用于镜像迁移。

对于你的需求“下载好镜像之后如何导出”,你应该使用 docker save 命令。


方法一:使用 docker save 导出镜像(推荐)

这是标准的镜像导出方法,会完整保留镜像的所有层、标签和历史。

步骤 1:打开终端

在 Docker Desktop 运行的情况下,打开你的命令行终端(如 Windows 上的 PowerShell 或 CMD,macOS 上的 Terminal)。

步骤 2:查看本地镜像列表

使用以下命令查看你本地已下载的镜像,并确认你要导出的镜像的 REPOSITORYTAG(或 IMAGE ID)。

docker images

输出示例:

REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
nginx        latest    2b7d6430f78d   2 weeks ago    142MB
ubuntu       20.04     d2e4e1f51132   3 weeks ago    77.8MB

步骤 3:执行导出命令

使用 docker save 命令将镜像导出为 .tar 文件。

语法:

docker save -o <输出文件名.tar> <镜像名:标签>

示例:

  1. 导出单个镜像(例如,将 nginx:latest 导出为 nginx_image.tar):

    docker save -o nginx_image.tar nginx:latest

    或者使用 IMAGE ID

    docker save -o nginx_image.tar 2b7d6430f78d
  2. 导出多个镜像到一个文件(例如,同时导出 nginx 和 ubuntu):

    docker save -o my_images.tar nginx:latest ubuntu:20.04

步骤 4:验证导出文件

命令执行成功后,你会在当前命令行所在的目录下找到生成的 .tar 文件(例如 nginx_image.tar)。


方法二:使用 docker export 导出容器(特定场景使用)

请注意: 这不是导出“镜像”的标准方法,而是导出“容器当前状态”为一个文件系统快照。

使用场景:当你有一个正在运行的容器,并且你只关心其当前的文件系统内容(比如一个构建好的项目环境),而不需要镜像的历史和层信息时,可以使用此方法。

步骤 1:查看正在运行的容器

docker ps

如果需要查看所有容器(包括已停止的):

docker ps -a

步骤 2:执行导出命令

语法:

docker export <容器名或容器ID> -o <输出文件名.tar>

示例:
假设你的容器名为 my_nginx_container,将其导出为 nginx_container_snapshot.tar

docker export my_nginx_container -o nginx_container_snapshot.tar

如何导入导出的镜像?

在你将 .tar 文件复制到另一台机器后,可以使用 docker loaddocker import 命令来恢复。

  • 导入由 docker save 导出的镜像文件.tar 文件):

    docker load -i nginx_image.tar

    导入后,使用 docker images 即可看到恢复的镜像。

  • 导入由 docker export 导出的容器快照文件.tar 文件):

    docker import nginx_container_snapshot.tar my_nginx_snapshot:latest

    这会将快照文件导入为一个新的镜像my_nginx_snapshot:latest),但这个新镜像没有之前镜像的历史层。

总结与建议

特性docker save (推荐)docker export
操作对象镜像(一个或多个)容器
输出内容完整的镜像,包括所有层、历史、元数据容器的文件系统快照(扁平化,无历史)
常用场景备份、迁移、分享镜像将容器的当前状态固化为一个快照文件
导入命令docker loaddocker import

对于你的需求“下载好镜像之后如何导出”,请始终使用 docker save 命令。这是唯一能保证完整无误地迁移镜像的方法。