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;
}
}