操作系统要求:Linux发行版(Ubuntu 20.04 LTS或CentOS 8),内核版本4.15以上,已安装Docker 19.03+和Docker Compose 1.27+。
验证环境命令:
``` docker --version docker-compose --version ```创建项目目录结构:
``` mkdir -p archive-system/{config,data,logs,backup} cd archive-system ```基础镜像选择原则:根据档案软件技术栈决定。以Java Spring Boot应用为例:
数据库镜像选择:
在项目根目录创建Dockerfile:
``` FROM openjdk:11-jre-slim LABEL maintainer="your-team@company.com" 设置时区 RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \ echo "Asia/Shanghai" > /etc/timezone 创建非root用户 RUN groupadd -r appuser && useradd -r -g appuser appuser 安装必要工具 RUN apt-get update && \ apt-get install -y --no-install-recommends \ curl \ vim \ && rm -rf /var/lib/apt/lists/ 创建工作目录 WORKDIR /app 复制应用文件 COPY target/archive-system.jar /app/ COPY config/application-docker.yml /app/config/ 设置文件权限 RUN chown -R appuser:appuser /app USER appuser 健康检查 HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ CMD curl -f http://localhost:8080/actuator/health || exit 1 暴露端口 EXPOSE 8080 启动命令 ENTRYPOINT ["java", "-jar", "archive-system.jar", \ "--spring.config.location=file:/app/config/application-docker.yml"] ```application-docker.yml配置文件内容:
``` server: port: 8080 servlet: context-path: /archive spring: datasource: url: jdbc:postgresql://postgres:5432/archive_db username: ${DB_USERNAME:archive_user} password: ${DB_PASSWORD:your_secure_password} driver-class-name: org.postgresql.Driver hikari: maximum-pool-size: 10 minimum-idle: 5 redis: host: redis port: 6379 password: ${REDIS_PASSWORD:} database: 0 servlet: multipart: max-file-size: 50MB max-request-size: 100MB archive: storage: path: /data/archive/files backup-path: /data/archive/backup security: encryption-key: ${ENCRYPTION_KEY:} ```创建docker-compose.yml:
``` version: '3.8' services: postgres: image: postgres:13-alpine container_name: archive-postgres environment: POSTGRES_DB: archive_db POSTGRES_USER: archive_user POSTGRES_PASSWORD: ${DB_PASSWORD:-ChangeMe123} volumes: - postgres_data:/var/lib/postgresql/data - ./backup:/backup networks: - archive-network restart: unless-stopped healthcheck: test: ["CMD-SHELL", "pg_isready -U archive_user"] interval: 10s timeout: 5s retries: 5 redis: image: redis:6-alpine container_name: archive-redis command: redis-server --requirepass ${REDIS_PASSWORD:-RedisPass123} volumes: - redis_data:/data networks: - archive-network restart: unless-stopped archive-app: build: . container_name: archive-application depends_on: postgres: condition: service_healthy redis: condition: service_started environment: DB_PASSWORD: ${DB_PASSWORD:-ChangeMe123} REDIS_PASSWORD: ${REDIS_PASSWORD:-RedisPass123} ENCRYPTION_KEY: ${ENCRYPTION_KEY:-your-encryption-key-here} volumes: - ./data/files:/data/archive/files - ./data/backup:/data/archive/backup - ./logs:/app/logs ports: - "8080:8080" networks: - archive-network restart: unless-stopped volumes: postgres_data: redis_data: networks: archive-network: driver: bridge ```创建.env文件(不提交到版本控制):
``` 数据库配置 DB_PASSWORD=YourStrongPassword@2023 Redis配置 REDIS_PASSWORD=RedisSecurePass@2023 应用加密密钥(至少32位) ENCRYPTION_KEY=your-32-characters-long-secure-encryption-key 可选:外部服务配置 SMTP_HOST=smtp.yourcompany.com SMTP_PORT=587 SMTP_USERNAME=archive@yourcompany.com SMTP_PASSWORD=EmailPassword@2023 ```
生成强密码命令:
``` 生成数据库密码 openssl rand -base64 32 生成加密密钥 openssl rand -hex 32 ```在项目根目录执行:
``` 构建应用镜像 docker-compose build archive-app 或构建所有服务镜像 docker-compose build ```创建数据库初始化脚本init.sql:
``` CREATE TABLE IF NOT EXISTS archive_documents ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), document_number VARCHAR(100) NOT NULL UNIQUE, title VARCHAR(500) NOT NULL, category VARCHAR(100), storage_path VARCHAR(1000), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, created_by VARCHAR(100), metadata JSONB ); CREATE INDEX idx_document_number ON archive_documents(document_number); CREATE INDEX idx_category ON archive_documents(category); CREATE INDEX idx_created_at ON archive_documents(created_at); -- 创建审计表 CREATE TABLE IF NOT EXISTS archive_audit_logs ( id SERIAL PRIMARY KEY, action VARCHAR(50) NOT NULL, document_id UUID REFERENCES archive_documents(id), user_id VARCHAR(100), ip_address INET, timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP, details TEXT ); ```执行初始化:
``` 复制SQL文件到容器 docker cp init.sql archive-postgres:/tmp/init.sql 执行SQL脚本 docker exec -it archive-postgres psql -U archive_user -d archive_db -f /tmp/init.sql ```在docker-compose.yml中添加资源限制:
``` services: archive-app: deploy: resources: limits: memory: 2G cpus: '2' reservations: memory: 1G cpus: '0.5' ```创建logback-spring.xml:
```在application.yml中添加:
``` management: endpoints: web: exposure: include: health,info,metrics endpoint: health: show-details: always health: db: enabled: true redis: enabled: true ```创建backup.sh:
``` !/bin/bash BACKUP_DIR="/backup" DATE=$(date +%Y%m%d_%H%M%S) BACKUP_FILE="$BACKUP_DIR/archive_db_$DATE.sql.gz" docker exec archive-postgres pg_dump -U archive_user archive_db | gzip > $BACKUP_FILE 保留最近7天备份 find $BACKUP_DIR -name "archive_db_.sql.gz" -mtime +7 -delete ```在docker-compose.yml中添加监控:
``` services: prometheus: image: prom/prometheus:latest volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml ports: - "9090:9090" networks: - archive-network grafana: image: grafana/grafana:latest environment: GF_SECURITY_ADMIN_PASSWORD: admin volumes: - grafana_data:/var/lib/grafana ports: - "3000:3000" networks: - archive-network ```应用无法启动时: