-
Notifications
You must be signed in to change notification settings - Fork 14
Expand file tree
/
Copy pathdocker-compose.yml
More file actions
executable file
·161 lines (154 loc) · 5.65 KB
/
Copy pathdocker-compose.yml
File metadata and controls
executable file
·161 lines (154 loc) · 5.65 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
# 定义一个 YAML 锚点,用于定义通用的日志配置,方便在多个服务中引用
x-logging: &default-logging
# 使用 json-file 日志驱动,这是 Docker 的默认驱动
driver: json-file
options:
# 设置单个日志文件的最大大小为 10M
max-size: "10m"
# 设置最大日志文件数量为 5 个,达到上限后会进行轮转(删除最旧的日志文件)
max-file: "5"
services:
# ======================================
# 1. MySQL 数据库服务 (goj-mysql)
# ======================================
goj-mysql:
# 使用官方 MySQL 8.0 镜像
image: mysql:8.0
# 容器名称
container_name: goj-mysql
# 重启策略:容器无论退出状态如何都会自动重启
restart: always
security_opt:
# 禁用 seccomp 安全限制,有时能解决 MySQL 在容器内的一些权限问题 (可选, 默认不禁用)
- seccomp:unconfined
# 容器启动时执行的命令,用于配置 MySQL 运行参数
command:
# 设置默认认证插件,提高旧客户端兼容性
- --default-authentication-plugin=mysql_native_password
# 设置最大连接数
- --max_connections=1024
# 设置线程缓存大小
- --thread_cache_size=256
# 设置服务器字符集为 utf8mb4,支持全字符集
- --character-set-server=utf8mb4
# 设置服务器排序规则
- --collation-server=utf8mb4_general_ci
# 启用对 TIMESTAMP 类型的严格控制
- --explicit_defaults_for_timestamp=true
# 允许在存储过程和函数中使用不安全的 SQL
- --log_bin_trust_function_creators=1
# 环境变量,用于配置 MySQL 的初始化
environment:
- MYSQL_DATABASE=goj
- MYSQL_USER=goj
- MYSQL_PASSWORD=goj123456
- MYSQL_ROOT_PASSWORD=root123456
volumes:
# 数据卷挂载:将宿主机上的具名卷 mysql_data 挂载到容器内的 MySQL 数据目录,实现数据持久化
- mysql_data:/var/lib/mysql
ports:
# 端口映射:将宿主机的 3306 端口映射到容器的 3306 端口
- "3306:3306"
networks:
# 加入 goj-network 网络
- goj-network
# 应用前面定义的日志配置
logging: *default-logging
# ======================================
# 2. Redis 缓存服务 (goj-redis)
# ======================================
goj-redis:
# 使用基于 Alpine Linux 的轻量级 Redis 镜像
image: redis:alpine
container_name: goj-redis
restart: always
# 启动命令:开启 AOF(Append Only File)持久化
command: redis-server --appendonly yes
volumes:
# 数据卷挂载:将宿主机上的具名卷 redis_data 挂载到容器内的 /data 目录,实现数据持久化
- redis_data:/data
ports:
# 端口映射
- "6379:6379"
networks:
- goj-network
logging: *default-logging
# ======================================
# 3. 判题服务 (goj-judge)
# ======================================
goj-judge:
# 使用自定义的 goj-judge 镜像
image: krisliu16/goj-judge:latest
container_name: goj-judge
restart: always
# 赋予容器几乎所有权限,通常用于需要进行低级别系统操作或沙箱隔离的判题环境
privileged: true
# 设置共享内存大小为 512m (默认是 64m),判题过程可能需要更大的共享内存
shm_size: 512m
ports:
# 端口映射
- "5050:5050"
networks:
- goj-network
logging: *default-logging
# ======================================
# 4. 后端 API 服务 (goj-backend)
# ======================================
goj-backend:
# 从本地路径 ./goj-backend 查找 Dockerfile 并构建镜像
build: ./goj-backend
container_name: goj-backend
restart: always
# 环境变量:配置后端服务连接其他组件的地址
environment:
- DB_HOST=goj-mysql # 数据库主机名为服务名 goj-mysql
- DB_USER=goj
- DB_PASSWORD=goj123456
- DB_NAME=goj
- REDIS_ADDR=goj-redis:6379 # Redis 地址为服务名 goj-redis
- JUDGE_ADDR=http://goj-judge:5050 # 判题服务地址为服务名 goj-judge
ports:
# 端口映射:宿主机 3000 -> 容器 3000
- "3000:3000"
volumes:
# 挂载自定义数据卷(例如用于存储上传文件、配置文件等),使用相对路径
- ./goj-backend/data:/app/data
# 依赖服务:确保 goj-mysql 和 goj-redis 启动后,再启动 goj-backend
depends_on:
- goj-mysql
- goj-redis
networks:
- goj-network
logging: *default-logging
# ======================================
# 5. 前端 Web 服务 (goj-frontend)
# ======================================
goj-frontend:
# 从本地路径 ./goj-frontend 查找 Dockerfile 并构建镜像
build: ./goj-frontend
container_name: goj-frontend
restart: always
ports:
# 端口映射:宿主机 80 端口(标准 HTTP)-> 容器 80 端口
- "80:80"
# 依赖服务:确保 goj-backend 启动后,再启动 goj-frontend
depends_on:
- goj-backend
networks:
- goj-network
logging: *default-logging
# ======================================
# 网络配置
# ======================================
networks:
# 自定义网络 goj-network,用于连接所有服务
goj-network:
# 网络驱动:使用 bridge 驱动,这是默认的驱动类型,允许服务间通过服务名相互访问 (driver: bridge 可省略)
driver: bridge
# ======================================
# 卷(Volume)配置,用于数据持久化
# ======================================
volumes:
mysql_data:
redis_data:
problem_data: