基于 Docker 容器化环境配置
一、Docker 基础概念镜像Image应用及其依赖环境的打包如 mysql:latest可 push/pull 到 Docker Hub。容器Container镜像的运行实例相互隔离独立文件系统、网络、端口。数据卷Volume将宿主机目录挂载到容器内用于持久化数据如 MySQL 的 /var/lib/mysql。常用命令docker run-d \--name mysql-container2 \-p 3306:3306 \-e MYSQL_ROOT_PASSWORDadmin \-v/Users/wuying/mysql:/var/lib/mysql \ mysql:latest二、Dockerfile 与镜像构建基础 Dockerfile# 指定基础镜像FROMnode:24.15-alpine# 设置容器内工作目录WORKDIR/app# 复制 package.json 利用缓存加速COPYpackage*.json./# 安装依赖RUN npm install# 复制项目所有代码到容器内COPY..# 构建项目RUN npm run build# 暴露端口EXPOSE 3000# 容器启动时执行的命令CMD[node,dist/main.js]多阶段构建减小体积优点最终镜像体积小不包含源码、开发依赖等。# 构建阶段含 devDependenciesFROMnode:24.15-alpine AS builder WORKDIR/appCOPYpackage*.json./RUN npm installCOPY..RUN npm run build# 运行阶段仅生产依赖 编译结果FROMnode:24.15-alpine ENV NODE_ENVproduction WORKDIR/appCOPYpackage*.json./RUN npm install--productionCOPY--frombuilder/app/dist./dist EXPOSE 3000 CMD[node,dist/main.js]三、Docker Compose编排多个容器开发环境docker-compose.dev.yml同时启动 MySQL、Milvus 及其依赖etcd、minio。通过 volume 挂载持久化数据。环境变量灵活控制目录如 ${DOCKER_VOLUME_DIRECTORY:-.}。version:3.8services:# MySQLmysql: image: mysql:latest container_name: mysql-dev ports:-3306:3306environment: MYSQL_ROOT_PASSWORD: admin MYSQL_DATABASE: book command: mysqld--character-set-serverutf8mb4--collation-serverutf8mb4_general_ci# 设置默认字符集volumes:-${DOCKER_VOLUME_DIRECTORY:-.}/volumes/mysql:/var/lib/mysql restart: always# Milvusetcd: container_name: milvus-etcd-dev image: quay.io/coreos/etcd:v3.5.25 environment:-ETCD_AUTO_COMPACTION_MODErevision# 压缩模式基于修订版本-ETCD_AUTO_COMPACTION_RETENTION1000# 保留最近1000个修订版本-ETCD_QUOTA_BACKEND_BYTES4294967296# 数据库大小限制4GB-ETCD_SNAPSHOT_COUNT50000# 每5万次修改创建快照volumes:-${DOCKER_VOLUME_DIRECTORY:-.}/volumes/etcd:/etcd# 持久化目录command: etcd-advertise-client-urlshttp://etcd:2379-listen-client-urls http://0.0.0.0:2379--data-dir/etcd# 启动命令test:[CMD,etcdtrl,endpoint,health]interval: 30s# 每30秒检查一次timeout: 20s# 单次检查超时20秒retries: 3# 连续失败3次判定为不健康minio: container_name: milvus-minio-dev image: minio/minio:RELEASE.2024-12-18T13-15-44Z environment: MINIO_ACCESS_KEY: minioadmin# 控制台用户名MINIO_SECRET_KEY: minioadmin# 控制台密码ports:-9001:9001# 控制台UI端口-9000:9000# API端口Milvus连接用volumes:-${DOCKER_VOLUME_DIRECTORY:-.}/volumes/minio:/minio_data# 持久化数据command: minio server/minio_data--console-address:9001# 启动命令healthcheck: test:[CMD,curl,-f,http://localhost:9000/minio/health/live]interval: 30s timeout: 20s retries: 3 standalone: container_name: milvus-standalone-dev image: milvusdb/milvus:v2.6.11 command:[milvus,run,standalone]# 单机模式security_opt:-seccomp:unconfined# 允许所有系统调用性能优先environment: MINIO_REGION: us-east-1# MinIO 存储区域S3兼容ETCD_ENDPOINTS: etcd:2379#「元数据」存储地址MINIO_ADDRESS: minio:9000#「对象」存储地址volumes:-${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus# 持久化数据healthcheck: test:[CMD,curl,-f,http://localhost:9091/healthz]interval: 30s start_period: 90s# 启动等待90秒后再检查timeout: 20s retries: 3 ports:-19530:19530# gRPC客户端端口-9091:9091# 健康检查端口depends_on:-etcd-minionetworks: default: name: common-network生产环境docker-compose.prod.ymlservices: mysql-prod: image: mysql:latest environment: MYSQL_ROOT_PASSWORD: admin MYSQL_DATABASE: book volumes:-${DOCKER_VOLUME_DIRECTORY:-.}/volumes/mysql-prod:/var/lib/mysql restart: always nest-app: build: context:.dockerfile: Dockerfile# 使用当前目录的 Dockerfileports:-3000:3000depends_on:-mysql-prod restart: always业务服务通过容器名互相访问如 mysql-prod。使用 depends_on 控制启动顺序。–build 确保每次启动前重新构建镜像。四、开发与部署流程本地开发npm run docker:up → 一键启动 MySQL Milvus代码直连 localhost。生产部署npm run docker:prod:up – --build → 构建并启动 Nest 镜像 MySQL容器互联使用容器名。核心思想开发时用 Docker Compose 跑基础设施生产时也将应用容器化统一编排环境一致性高。docker:up:DOCKER_VOLUME_DIRECTORY/Users/wuying/ docker compose -f docker-compose.dev.yml up -d,docker:down:docker compose -f docker-compose.dev.yml down,docker:prod:up:docker compose -f docker-compose.prod.yml up -d --build,