-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathdocker-compose.yml
More file actions
252 lines (240 loc) · 8.08 KB
/
Copy pathdocker-compose.yml
File metadata and controls
252 lines (240 loc) · 8.08 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
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
# docker-compose.optimized.yml
# ─────────────────────────────────────────────────────────────────────────────
# 基于 docker-compose.yml 的修订版,逐项修复见 docker-compose.review.md
# 使用:docker compose -f docker-compose.optimized.yml up -d
# 前置:mkdir -p share-files && touch share-files/.gitkeep
# 定位:本地开发环境。口令按原始设计硬编码(123456),不使用 .env 变量。
# 该文件(含 docker-compose.yml)请勿推送到公开仓库。
# ─────────────────────────────────────────────────────────────────────────────
name: alpine-dnmp8
x-logging: &default-logging # 统一日志上限,避免 json-file 无界增长
driver: json-file
options:
max-size: "10m"
max-file: "3"
services:
### Nginx Web Container ###
nginx:
build: ./core/images/nginx
# nginx 启动时会解析 upstream 主机名,php82 未注册到 Docker DNS 会直接 [emerg] 退出,
# 因此显式声明启动顺序(不再依赖 restart 策略反复试错)
depends_on:
php82:
condition: service_started
volumes:
- ./www:/var/www/html:ro # nginx 只读,写入由 php82 负责
- ./core/conf/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro
- ./core/conf/nginx/conf/conf.d:/etc/nginx/conf.d:ro
- ./web-conf:/etc/nginx/web-conf:ro
# 不挂载 /var/log/nginx:保留镜像内指向 /dev/stdout|/dev/stderr 的软链接,
# 日志走容器 stdio(docker compose logs -f nginx),由 logging driver 负责存储与轮转
- ./share-files:/var/www/share-files:ro
ports:
- "80:80"
# - "443:443" # 容器内尚无 TLS server 块与证书,先不发布;配置后取消注释
healthcheck:
test: ["CMD-SHELL", "wget -q -O /dev/null http://127.0.0.1/ || exit 1"]
interval: 30s
timeout: 5s
retries: 3
start_period: 10s
restart: unless-stopped
logging: *default-logging
networks:
- net-all
### PHP FPM Container ###
php82:
build: ./core/images/php82
volumes:
- ./www:/var/www/html
# 开发环境用 -development(display_errors=On / memory_limit=2G);
# 对外环境请切到 php.ini-production
- ./core/conf/php82/conf/php.ini-development:/usr/local/etc/php/php.ini:ro
- ./core/conf/php82/conf/php-fpm.conf:/usr/local/etc/php-fpm.conf:ro
- ./core/conf/php82/conf/php-fpm.d/www.conf:/usr/local/etc/php-fpm.d/www.conf:ro
# - type: bind
# source: ../.ssh
# target: /root/.ssh
- ./share-files:/var/www/share-files
expose:
- "9000" # 仅作文档用途,服务名已可互通
healthcheck:
test: ["CMD-SHELL", "nc -z 127.0.0.1 9000 || exit 1"]
interval: 30s
timeout: 5s
retries: 3
start_period: 10s
restart: unless-stopped
logging: *default-logging
networks:
- net-all
### Mysql8.0 Container ###
mysql80:
build: ./core/images/mysql80
volumes:
- type: volume
source: data-mysql80
target: /var/lib/mysql
volume:
nocopy: true # 正确:避免镜像空目录覆盖初始化
# - ./core/conf/mysql/conf/my.cnf:/etc/mysql/my.cnf:ro
- ./share-files:/var/www/share-files
ports:
# 仅宿主机可访问;若宿主已占用 3306,改为 "127.0.0.1:3307:3306"
- "127.0.0.1:3306:3306"
environment:
MYSQL_ROOT_PASSWORD: "123456"
healthcheck:
test: ["CMD-SHELL", "mysqladmin ping -h 127.0.0.1 -uroot -p\"$$MYSQL_ROOT_PASSWORD\" --silent"]
interval: 10s
timeout: 5s
retries: 10
start_period: 30s
restart: unless-stopped
logging: *default-logging
networks:
- net-all
### Elasticsearch7 Container ###
elasticsearch7:
build: ./core/images/elasticsearch
environment:
- discovery.type=single-node
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- data-elasticsearch7:/usr/share/elasticsearch/data
ports:
- "127.0.0.1:9200:9200"
healthcheck:
test: ["CMD-SHELL", "curl -fsS http://localhost:9200/_cluster/health || exit 1"]
interval: 20s
timeout: 5s
retries: 6
start_period: 60s
restart: unless-stopped
logging: *default-logging
networks:
- net-all
### Redis Container ###
redis:
build: ./core/images/redis
# 保持镜像默认启动参数(无 AUTH、默认 RDB 持久化)。
# 如需开启认证或限制内存,取消下面注释(本地开发用固定口令):
# command: redis-server --appendonly yes --maxmemory 512mb --maxmemory-policy allkeys-lru --requirepass 123456
volumes:
- data-redis:/data
ports:
- "127.0.0.1:6379:6379"
healthcheck:
test: ["CMD-SHELL", "redis-cli ping | grep -q PONG"]
interval: 10s
timeout: 5s
retries: 5
start_period: 10s
restart: unless-stopped
logging: *default-logging
networks:
- net-all
### Rabbitmq Container ###
rabbitmq:
build: ./core/images/rabbitmq
volumes:
- data-rabbitmq:/var/lib/rabbitmq # 修复:原为 /data,mnesia 数据实际未持久化
ports:
# - "127.0.0.1:15672:15672"
- "127.0.0.1:5672:5672"
environment:
- RABBITMQ_DEFAULT_USER=root
- RABBITMQ_DEFAULT_PASS=123456
healthcheck:
test: ["CMD", "rabbitmq-diagnostics", "-q", "ping"]
interval: 20s
timeout: 10s
retries: 5
start_period: 30s
restart: unless-stopped
logging: *default-logging
networks:
- net-all
### ── 备用组件:默认不启动,docker compose --profile extra up -d 启用 ── ###
### MariaDB Container ###
# mariadb:
# build: ./core/images/mariadb
# profiles: ["extra"]
# volumes:
# - data-mariadb:/var/lib/mysql
# - ./share-files:/var/www/share-files
# ports:
# - "127.0.0.1:3307:3306" # 与 mysql80 的 3306 错开
# environment:
# MARIADB_ROOT_PASSWORD: "123456"
# restart: unless-stopped
# logging: *default-logging
# networks:
# - net-all
### Elasticsearch8 Container ###
# elasticsearch8:
# build: ./core/images/elasticsearch8
# profiles: ["extra"]
# environment:
# - discovery.type=single-node
# - bootstrap.memory_lock=true
# - "ES_JAVA_OPTS=-Xms1g -Xmx1g"
# - xpack.security.enabled=false
# mem_limit: 3g
# ulimits:
# memlock:
# soft: -1
# hard: -1
# volumes:
# - data-elasticsearch8:/usr/share/elasticsearch/data
# ports:
# - "127.0.0.1:9201:9200" # 与 elasticsearch7 的 9200 错开
# restart: unless-stopped
# logging: *default-logging
# networks:
# - net-all
### OpenSearch Container ###
# opensearch:
# build: ./core/images/opensearch
# profiles: ["extra"]
# environment:
# - discovery.type=single-node
# - bootstrap.memory_lock=true
# - "OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m" # OpenSearch 用这个变量名
# ulimits:
# memlock:
# soft: -1
# hard: -1
# volumes:
# - data-opensearch:/usr/share/opensearch/data
# ports:
# - "127.0.0.1:9202:9200" # 与两个 ES 实例错开
# restart: unless-stopped
# logging: *default-logging
# networks:
# - net-all
### Networks ###
networks:
net-all:
driver: bridge
### Volumes ###
volumes:
data-mysql80:
driver: local
data-redis:
driver: local
data-rabbitmq:
driver: local
data-elasticsearch7:
driver: local
# data-elasticsearch8:
# driver: local
# data-opensearch:
# driver: local
# data-mariadb:
# driver: local