导航菜单

生产环境最佳实践

陆兴东 2026-04-09 21 浏览 Docker

CI/CD 集成

image.png

GitHub Actions 示例

 

# .github/workflows/docker-build.yml          
name: Docker Build and Push          

on:          
push:          
    branches: [ main, develop ]          
pull_request:          
    branches: [ main ]          

env:          
REGISTRY: ghcr.io          
IMAGE_NAME: ${{ github.repository }}          

jobs:          
build:          
    runs-on: ubuntu-latest          
    permissions:          
      contents: read          
      packages: write          

    steps:          
      - name: Checkout 代码          
        uses: actions/checkout@v4          

      - name: 设置 Docker Buildx          
        uses: docker/setup-buildx-action@v3          

      - name: 登录到 Container Registry          
        uses: docker/login-action@v3          
        with:          
          registry: ${{ env.REGISTRY }}          
          username: ${{ github.actor }}          
          password: ${{ secrets.GITHUB_TOKEN }}          

      - name: 提取元数据          
        id: meta          
        uses: docker/metadata-action@v5          
        with:          
          images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}          
          tags: |          
            type=ref,event=branch          
            type=ref,event=pr          
            type=semver,pattern={{version}}          
            type=semver,pattern={{major}}.{{minor}}          
            type=sha,prefix={{branch}}-          

      - name: 构建并推送镜像          
        uses: docker/build-push-action@v5          
        with:          
          context: .          
          push: true          
          tags: ${{ steps.meta.outputs.tags }}          
          labels: ${{ steps.meta.outputs.labels }}          
          cache-from: type=gha          
          cache-to: type=gha,mode=max          
          build-args: |          
            BUILD_DATE=${{ github.event.head_commit.timestamp }}          
            VCS_REF=${{ github.sha }}          

      - name: 镜像漏洞扫描          
        uses: aquasecurity/trivy-action@master          
        with:          
          image-ref: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.sha }}          
          format: 'sarif'          
          output: 'trivy-results.sarif'          

      - name: 上传扫描结果          
        uses: github/codeql-action/upload-sarif@v2          
        if: always()          
        with:          
          sarif_file: 'trivy-results.sarif'

 

____________________

 

7.2 日志管理

 

# docker-compose.yml          
version: '3.8'          

services:          
  app:          
    image: myapp:latest          
    logging:          
      driver: "json-file"          
      options:          
        max-size: "100m"          
        max-file: "3"          
        labels: "production,app"          
        tag: "{{.Name}}/{{.ID}}"

 

ELK Stack 集成

 

version: '3.8'          

services:          
elasticsearch:          
    image: elasticsearch:8.11.0          
    environment:          
      - discovery.type=single-node          
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"          
    volumes:          
      - es_data:/usr/share/elasticsearch/data          
    ports:          
      - "9200:9200"          
    networks:          
      - elk          

logstash:          
    image: logstash:8.11.0          
    volumes:          
      - ./logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml:ro          
      - ./logstash/pipeline:/usr/share/logstash/pipeline:ro          
    ports:          
      - "5044:5044"          
    networks:          
      - elk          
    depends_on:          
      - elasticsearch          

kibana:          
    image: kibana:8.11.0          
    ports:          
      - "5601:5601"          
    environment:          
      - ELASTICSEARCH_HOSTS=http://elasticsearch:9200          
    networks:          
      - elk          
    depends_on:          
      - elasticsearch          

networks:          
elk:          
    driver: bridge          

volumes:          
  es_data:

 

____________________

 

7.3 监控和告警

 

version: '3.8'          

services:          
# ========== Prometheus ==========          
prometheus:          
    image: prom/prometheus:latest          
    container_name: prometheus          
    command:          
      - '--config.file=/etc/prometheus/prometheus.yml'          
      - '--storage.tsdb.path=/prometheus'          
      - '--web.console.libraries=/etc/prometheus/console_libraries'          
      - '--web.console.templates=/etc/prometheus/consoles'          
      - '--storage.tsdb.retention.time=200h'          
      - '--web.enable-lifecycle'          
    volumes:          
      - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro          
      - prometheus_data:/prometheus          
    ports:          
      - "9090:9090"          
    networks:          
      - monitoring          
    restart: unless-stopped          

# ========== Grafana ==========          
grafana:          
    image: grafana/grafana:latest          
    container_name: grafana          
    volumes:          
      - grafana_data:/var/lib/grafana          
      - ./grafana/provisioning:/etc/grafana/provisioning:ro          
    environment:          
      - GF_SECURITY_ADMIN_USER=admin          
      - GF_SECURITY_ADMIN_PASSWORD=admin123          
      - GF_USERS_ALLOW_SIGN_UP=false          
    ports:          
      - "3000:3000"          
    networks:          
      - monitoring          
    restart: unless-stopped          
    depends_on:          
      - prometheus          

# ========== cAdvisor ==========          
cadvisor:          
    image: gcr.io/cadvisor/cadvisor:latest          
    container_name: cadvisor          
    volumes:          
      - /:/rootfs:ro          
      - /var/run:/var/run:ro          
      - /sys:/sys:ro          
      - /var/lib/docker/:/var/lib/docker:ro          
      - /dev/disk/:/dev/disk:ro          
    ports:          
      - "8080:8080"          
    networks:          
      - monitoring          
    restart: unless-stopped          
    privileged: true          

# ========== Node Exporter ==========          
node_exporter:          
    image: prom/node-exporter:latest          
    container_name: node_exporter          
    command:          
      - '--path.procfs=/host/proc'          
      - '--path.sysfs=/host/sys'          
      - '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)'          
    volumes:          
      - /proc:/host/proc:ro          
      - /sys:/host/sys:ro          
      - /:/rootfs:ro          
    ports:          
      - "9100:9100"          
    networks:          
      - monitoring          
    restart: unless-stopped          

# ========== Alertmanager ==========          
alertmanager:          
    image: prom/alertmanager:latest          
    container_name: alertmanager          
    command:          
      - '--config.file=/etc/alertmanager/alertmanager.yml'          
      - '--storage.path=/alertmanager'          
    volumes:          
      - ./alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml:ro          
      - alertmanager_data:/alertmanager          
    ports:          
      - "9093:9093"          
    networks:          
      - monitoring          
    restart: unless-stopped          

networks:          
monitoring:          
    driver: bridge          

volumes:          
prometheus_data:          
grafana_data:          
  alertmanager_data: