docker-compose.yml最佳实践

version: '3.8'# 指定Compose文件的版本

services:  # 定义多个服务
  web:  # Web服务,通常是前端或后端的应用
    image: nginx:latest  # 使用Nginx镜像
    ports:
      - "80:80"# 将容器的80端口映射到主机的80端口
    volumes:
      - ./web:/usr/share/nginx/html  # 挂载本地目录到容器中
      - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf  # 挂载配置
    environment:
      - NGINX_HOST=localhost  # 设置环境变量
      - NGINX_PORT=80
    networks:
      - frontend  # 连接到前端网络
    depends_on:
      - app  # 该服务将在'app'服务启动后才启动
    restart: always  # 在容器崩溃后总是重启

  app:  # 应用服务,可以是任何语言的后端服务
    build:  # 从Dockerfile构建镜像
      context: ./app  # Dockerfile所在的目录
      dockerfile: Dockerfile  # 使用的Dockerfile名称
    ports:
      - "3000:3000"# 将容器的3000端口映射到主机的3000端口
    #  expose:         # 若是做负载均衡,不能用port
    #  - "3000"        # 容器暴露端口
    volumes:
      - ./app:/usr/src/app  # 挂载本地代码目录到容器中
    environment:
      - NODE_ENV=development  # 设置环境变量
      - PORT=3000
    networks:
      - frontend  # 连接到前端网络
      - backend  # 连接到后端网络
    depends_on:
      - db  # 该服务将在'db'服务启动后才启动
    restart: on-failure  # 仅在容器非正常退出时重启

  db:  # 数据库服务,使用MySQL
    image: mysql:5.7# 使用MySQL 5.7镜像
    volumes:
      - db_data:/var/lib/mysql  # 持久化MySQL数据到命名卷
    environment:
      MYSQL_ROOT_PASSWORD: example  # MySQL root用户的密码
      MYSQL_DATABASE: example_db  # 自动创建的数据库名称
      MYSQL_USER: user  # 创建的用户名称
      MYSQL_PASSWORD: password  # 用户密码
    networks:
      - backend  # 连接到后端网络
    restart: unless-stopped  # 仅在手动停止时不重启

volumes:  # 定义命名卷,用于数据持久化
  db_data:  # MySQL数据卷

networks:  # 定义自定义网络
  frontend:  # 前端网络,连接web和app服务
  backend:  # 后端网络,连接app和db服务

nginx.conf 负载均衡用

upstream backend {
  server app:3000;  # 使用服务名而非 IP
}

server {
  listen 80;
  location / {
    proxy_pass http://backend;  # 反向代理到后端集群
    proxy_set_header Host $host;
  }
}
posted @ 2025-07-18 09:34  朝阳1  阅读(28)  评论(0)    收藏  举报