centos7使用dockercompose搭建环境
前言
之前一直使用centos7,这个服务器已经停止维护了,所以docker安装和之前有点不一样,这里重新记录一下
1.阿里云镜像加速
打开阿里云
开通镜像服务

进入控制台

配置镜像加速,复制这个地址,后面安装docker后需要配置

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://*****.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
2.安装docker
关闭冲突组件
yum remove -y docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine

修复 Yum 源
因为 CentOS 7 已经停止维护(EOL):
- 官方 yum 源不可用或失效
yum install会报错或超时- 必须换到:
- vault.centos.org(官方归档源)
- 阿里云 / 清华镜像源
核心目的:停用旧的 CentOS 官方 yum 源(因为 CentOS 7 已 EOL,不再维护)
这三行命令就是: 把 CentOS 旧 yum 源全部备份移走,为重新配置新的 yum 源做准备。
# 打开
cd /etc/yum.repos.d/
# 创建备份目录
mkdir backup
# 把当前 /etc/yum.repos.d/ 移动到 backup
mv *.repo backup/
mkdir和mv已经执行过了,截图里没有执行

下载新源
curl -o CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

刷新缓存
可能有
FAILED但不影响安装
- 阿里云某些旧镜像域名(
mirrors.aliyuncs.com/mirrors.cloud.aliyuncs.com)- 当前网络无法连接(被拒绝 / 已废弃 / DNS或路由问题)
- yum 自动切换到了其他镜像,所以最后还是成功了
yum clean all
yum makecache

安装工具
yum install -y yum-utils device-mapper-persistent-data lvm2

添加 Docker 官方源(稳定生产版)
# 这是外网,建议使用阿里云地址,国内安装忽略这条命令
# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 国内使用阿里云地址
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo


查看docker可用版本
yum list docker-ce --showduplicates | sort -r

安装稳定版(推荐固定版本)不要直接 latest(生产风险)
# 如果不想指定版本
# yum install -y docker-ce docker-ce-cli containerd.io
yum install -y docker-ce-24.0.7 docker-ce-cli-24.0.7 containerd.io

创建配置目录
mkdir -p /etc/docker

配置daemon.json
阿里云加速地址需要你自己去阿里云地址获取
# 注释版,执行命令用下面的
# =========================
# Docker daemon 配置说明
# =========================
{
# 镜像加速器(解决 Docker Hub 拉取慢问题)
"registry-mirrors": [
"https://你的阿里云专属ID.mirror.aliyuncs.com", # 阿里云专属镜像加速(推荐,最稳定)
"https://mirror.ccs.tencentyun.com", # 腾讯云镜像加速(备用)
"https://registry.docker-cn.com" # Docker 中国加速(部分环境可能失效)
],
# cgroup 驱动(必须与 Kubernetes kubelet 保持一致)
"exec-opts": ["native.cgroupdriver=systemd"],
# 容器日志驱动(json-file 是默认方案)
"log-driver": "json-file",
# 日志轮转(防止磁盘被日志打爆)
"log-opts": {
"max-size": "100m", # 单个日志文件最大 100MB
"max-file": "3" # 最多保留 3 个日志文件
},
# 存储驱动(overlay2 是 Linux 推荐高性能方案)
"storage-driver": "overlay2"
}
# 这个不行可以试试下面的,目前没有稳定下载镜像的地址
cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": [
"https://你的阿里云专属ID.mirror.aliyuncs.com",
"https://mirror.ccs.tencentyun.com",
"https://registry.docker-cn.com"
],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
},
"storage-driver": "overlay2"
}
EOF
# 我是从网上找到这三个,下载速度还是有点慢
cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": [
"https://docker.xuanyuan.me",
"https://mirror.ccs.tencentyun.com",
"https://docker.m.daocloud.io"
]
}
EOF
# 查看配置
cat /etc/docker/daemon.json
# 重启docker
systemctl daemon-reload
systemctl restart docker
启动 Docker
systemctl daemon-reexec
systemctl enable docker
systemctl start docker

检查状态
systemctl status docker

检查状态
systemctl status docker

开启自启
systemctl enable docker

3.下载镜像
docker-compsoe下载镜像没有那么快,建先 docker pull 是为了提前准备镜像,避免 docker compose 启动时因拉取镜像而变慢或失败。
Error response from daemon错误时自己网上搜索可用的加速地址
下载镜像和网速有关,可能没有那么快
docker pull mysql:8.0.45
docker pull redis:7.2
docker pull rabbitmq:3.12-management
docker pull docker.elastic.co/elasticsearch/elasticsearch:7.17.18
docker pull docker.elastic.co/kibana/kibana:7.17.18
docker pull nacos/nacos-server:v2.3.2-slim
docker pull seataio/seata-server:1.6.1
docker pull openzipkin/zipkin:2.24
# 这2个可能下载失败
docker pull bladex/sentinel-dashboard:1.8.6
docker pull ankane/pgvector:pg16
# 如果下载失败,Error response from daemon
# 自己去网上找可下载的加速地址
# 以下是我自己试的地址
docker pull mirror.baidubce.com/bladex/sentinel-dashboard:1.8.6
docker pull registry.docker-cn.com/bladex/sentinel-dashboard:1.8.6
docker pull docker.xuanyuan.me/bladex/sentinel-dashboard:1.8.6
docker pull registry-1.docker.io/bladex/sentinel-dashboard:1.8.6
# 这2个地址可以成功下载
docker pull docker.1panel.live/bladex/sentinel-dashboard:1.8.6
docker pull docker.1ms.run/bladex/sentinel-dashboard:1.8.6
docker pull docker.1panel.live/bladex/sentinel-dashboard:1.8.6
docker pull docker.1ms.run/ankane/pgvector:latest
下载完建议打成包,下次直接上传使用
docker save -o mysql_8.0.45.tar mysql:8.0.45
docker save -o zipkin_latest.tar openzipkin/zipkin:latest
docker save -o nginx_latest.tar nginx:latest
docker save -o redis_7.2.tar redis:7.2
docker save -o rabbitmq_3.12.tar rabbitmq:3.12-management
docker save -o nacos_2.3.2.tar nacos/nacos-server:v2.3.2-slim
docker save -o elasticsearch_7.17.18.tar docker.elastic.co/elasticsearch/elasticsearch:7.17.18
docker save -o kibana_7.17.18.tar docker.elastic.co/kibana/kibana:7.17.18
docker save -o sentinel_1.8.6.tar docker.1panel.live/bladex/sentinel-dashboard:1.8.6
docker save -o zipkin_2.24.tar openzipkin/zipkin:2.24
docker save -o seata_1.6.1.tar seataio/seata-server:1.6.1
docker save -o pgvector_latest.tar docker.1ms.run/ankane/pgvector:latest
docker save -o seata_1.5.2.tar seataio/seata-server:1.5.2
docker save -o rabbitmq_3.8.tar rabbitmq:3.8-management
docker save -o nacos_2.1.0.tar nacos/nacos-server:v2.1.0-slim

根据每个linux每个目录不同的作用,尊重规范,决定在/opt目录下运行服务
| 目录 | 作用 | 是否放业务 |
|---|---|---|
/usr |
系统软件(yum/apt装的) | ❌ 不放 |
/etc |
配置文件 | ⚠️ 只放配置 |
/var |
运行数据(日志/数据库) | ⚠️ 常用 |
/opt |
第三方/自定义软件(Docker项目) | ✅ 推荐 |
/home |
用户文件 | ⚠️ 可用 |
/tmp |
临时文件 | ❌ 不长期用 |
4.docker-compose
4.1.env
# MySQL Root 用户密码
MYSQL_ROOT_PASSWORD=root
# PostgreSQL 超级用户密码
POSTGRES_PASSWORD=postgres
# Redis 访问密码
REDIS_PASSWORD=redis
# RabbitMQ 管理员密码
RABBITMQ_PASSWORD=admin
4.2nginx
# =========================================================
# ⚙ 基础配置
# =========================================================
worker_processes auto;
events {
# 单 worker 最大连接数
worker_connections 1048;
}
http {
# =========================================================
# 📌 基础优化(稳定性 + 性能)
# =========================================================
sendfile on;
tcp_nopush on;
tcp_nodelay on;
# 长连接保持
keepalive_timeout 65;
# 上传限制(防止 ES / Kibana 报错)
client_max_body_size 100m;
# =========================================================
# 🚀 Gzip(测试环境也建议开)
# =========================================================
gzip on;
gzip_comp_level 5;
gzip_min_length 1k;
gzip_types text/plain text/css application/json application/javascript;
# =========================================================
# 🔁 upstream(Docker 服务发现)
# =========================================================
upstream kibana {
server kibana:5601;
keepalive 32;
}
upstream rabbitmq {
server rabbitmq:15672;
keepalive 16;
}
upstream es {
server elasticsearch:9200;
keepalive 16;
}
# =========================================================
# 🌍 对外入口
# =========================================================
server {
listen 80;
# =====================================================
# 📊 Kibana(✔ 已支持 /kibana 子路径)
# 子路径代理三要素
# location /kibana/(必须带 /)
# proxy_pass http://kibana(不能带 /)
# Kibana 必须设置 basePath
# =====================================================
location /kibana/ {
proxy_pass http://kibana;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# WebSocket(必须)
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 60s;
}
# =====================================================
# 🐰 RabbitMQ(🔥关键:rewrite 修复子路径问题)
# =====================================================
location /rabbitmq/ {
# ❗核心修复:去掉 /rabbitmq 前缀
rewrite ^/rabbitmq/(.*)$ /$1 break;
proxy_pass http://rabbitmq;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
# WebSocket 支持
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 60s;
}
# =====================================================
# 🔍 Elasticsearch API
# =====================================================
location /es/ {
proxy_pass http://es/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
# ES 查询可能较慢
proxy_read_timeout 60s;
# ❗关闭缓冲(ES 流式返回更快)
proxy_buffering off;
}
# =====================================================
# ❤️ 健康检查(给 Docker 用)
# =====================================================
location /health {
access_log off;
return 200 "OK";
}
# =====================================================
# 🧪 默认页面(避免 404)
# =====================================================
location / {
return 200 "Nginx Gateway Running";
}
}
}
4.3my.cnf
[mysqld]
# =========================================================
# 🧠 字符集配置(必须)
# =========================================================
# 服务端默认字符集,建议统一 utf8mb4(支持 emoji / 多语言)
character-set-server = utf8mb4
# 排序规则,utf8mb4_unicode_ci 更通用(比 general_ci 更准确)
collation-server = utf8mb4_unicode_ci
# =========================================================
# 🧩 InnoDB 引擎核心配置(性能关键)
# =========================================================
# InnoDB 缓冲池(最重要参数)
# 👉 用于缓存数据和索引,命中率越高性能越好
# 👉 建议占物理内存 50%~70%
# 👉 虚拟机建议不要太大(避免吃爆内存)
innodb_buffer_pool_size = 512M
# redo log 文件大小(影响写入性能)
# 👉 越大:写入更顺畅,但恢复时间变长
innodb_log_file_size = 256M
# 避免双缓存(OS缓存 + InnoDB缓存)
# 👉 直接使用磁盘IO,减少内存浪费
innodb_flush_method = O_DIRECT
# 事务刷盘策略(影响性能 vs 数据安全)
# 1 = 每次提交都刷盘(最安全,性能稍低)
# 2 = 每秒刷一次(性能更高,可能丢1秒数据)
innodb_flush_log_at_trx_commit = 1
# =========================================================
# 🔗 连接控制(防止打爆数据库)
# =========================================================
# 最大连接数(非常关键)
# 👉 不是越大越好,每个连接都会占内存
# 👉 过大可能导致 OOM(内存溢出)
max_connections = 150
# 空闲连接超时时间(秒)
# 👉 防止连接长期占用资源
wait_timeout = 300
# =========================================================
# 🐢 慢查询日志(生产强烈建议开启)
# =========================================================
# 开启慢查询日志
slow_query_log = 1
# 慢查询阈值(秒)
# 👉 超过1秒的SQL会被记录
long_query_time = 1
# (可选)慢查询日志文件路径(不写也会有默认)
# slow_query_log_file = /var/lib/mysql/slow.log
# =========================================================
# 📊 binlog(二进制日志,生产必备)
# =========================================================
# 开启 binlog(用于主从复制 / 数据恢复)
log_bin = mysql-bin
# 日志格式(推荐 ROW,最安全)
binlog_format = ROW
# binlog 保留天数(避免磁盘爆满)
expire_logs_days = 3
# =========================================================
# 🌐 其他优化
# =========================================================
# 跳过 DNS 解析(提升连接性能)
# 👉 否则每次连接都可能做反向DNS查询
skip-name-resolve
# 设置时区(避免时间错乱)
default-time-zone = '+08:00'
4.3peng-docker-compose.yml
version: "3.8"
# =========================================================
# 🌐 网络层设计(所有服务通信基础)
# =========================================================
# ✔ 自定义 bridge 网络:容器间通过 service name 互通
# ✔ 不使用 IP:避免容器重启 IP 漂移导致服务失联
# ✔ 统一网络:降低微服务复杂度(类似内网 DNS)
# =========================================================
networks:
peng-net:
driver: bridge
services:
# =========================================================
# 🐘 PostgreSQL(关系型数据库 + pgvector 向量能力)
# =========================================================
postgres:
image: docker.1ms.run/ankane/pgvector:latest
container_name: postgres
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: IdentityDB
volumes:
- /opt/docker/postgres:/var/lib/postgresql/data
ports:
- "5432:5432"
networks:
- peng-net
restart: unless-stopped
# -------------------------
# ❤️ 健康检查机制
# -------------------------
#healthcheck:
# test: ["CMD-SHELL", "pg_isready -U postgres"]
# interval: 20s
# timeout: 30s # 【优化】避免慢启动误判
# retries: 10 # 【优化】提高容错
# start_period: 20s # 【优化】启动宽限期
# =========================================================
# 🧠 Redis(缓存 / 会话 / 限流 / 分布式锁)
# =========================================================
redis:
image: redis:7.2
container_name: redis
command:
- redis-server
- --appendonly
- "yes"
- --requirepass
- "${REDIS_PASSWORD}"
- --maxmemory
- 256mb
- --maxmemory-policy
- allkeys-lru
volumes:
- /opt/docker/redis:/data
ports:
- "6379:6379"
networks:
- peng-net
restart: unless-stopped
#healthcheck:
# test: ["CMD-SHELL", "redis-cli -a $REDIS_PASSWORD ping | grep PONG"]
# interval: 20s
# timeout: 15s # 【优化】Redis 快速服务
# retries: 5
# start_period: 10s # 【优化】避免刚启动误判
# =========================================================
# 🐬 MySQL(核心业务数据库)
# =========================================================
mysql:
image: mysql:8.0.45
container_name: mysql
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: app_db
volumes:
- /opt/docker/mysql/data:/var/lib/mysql
- /opt/docker/mysql/conf:/etc/mysql/conf.d
- /opt/docker/mysql/init:/docker-entrypoint-initdb.d
ports:
- "3306:3306"
networks:
- peng-net
restart: unless-stopped
#healthcheck:
# test: ["CMD-SHELL", "mysqladmin ping -h localhost -uroot -p$$MYSQL_ROOT_PASSWORD"]
# interval: 20s
# timeout: 30s # 【优化】初始化慢
# retries: 10
# start_period: 30s # 【优化】首次建库很慢
# =========================================================
# 🐰 RabbitMQ(消息队列)
# =========================================================
rabbitmq:
image: rabbitmq:3.12-management
container_name: rabbitmq
environment:
RABBITMQ_DEFAULT_USER: admin
RABBITMQ_DEFAULT_PASS: ${RABBITMQ_PASSWORD}
volumes:
- /opt/docker/rabbitmq:/var/lib/rabbitmq
ports:
- "5672:5672"
- "15672:15672"
networks:
- peng-net
restart: unless-stopped
#healthcheck:
# test: ["CMD", "rabbitmq-diagnostics", "ping"]
# interval: 30s # 【优化】启动较慢
# timeout: 30s
# retries: 10
# start_period: 30s # 【优化】避免误判
# =========================================================
# 🔍 Elasticsearch(搜索 / 日志 / 检索)
# =========================================================
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.17.18
container_name: elasticsearch
environment:
- discovery.type=single-node
- ES_JAVA_OPTS=-Xms512m -Xmx512m
- xpack.security.enabled=false
volumes:
- /opt/docker/elasticsearch:/usr/share/elasticsearch/data
ports:
- "9200:9200"
networks:
- peng-net
restart: unless-stopped
ulimits:
memlock:
soft: -1
hard: -1
#healthcheck:
# test: ["CMD-SHELL", "curl -s http://localhost:9200 >/dev/null || exit 1"]
# interval: 30s
# timeout: 60s
# retries: 20
# start_period: 60s
# =========================================================
# 📊 Kibana(ES 可视化平台)
# =========================================================
kibana:
image: docker.elastic.co/kibana/kibana:7.17.18
container_name: kibana
environment:
ELASTICSEARCH_HOSTS: http://elasticsearch:9200
SERVER_BASEPATH: "/kibana"
SERVER_REWRITEBASEPATH: "true"
xpack.security.enabled: "false"
ports:
- "5601:5601"
networks:
- peng-net
restart: unless-stopped
# depends_on:
# elasticsearch:
# # condition: service_healthy
# condition: service_started
# -------------------------
# ❤️ 健康检查(新增)
# -------------------------
#healthcheck:
# test: ["CMD-SHELL", "wget -qO- http://localhost:5601/kibana || exit 1"]
# interval: 30s
# timeout: 90s # 【优化】Kibana 最慢
# retries: 15
# start_period: 60s # 【优化】必须加
# =========================================================
# 🌐 Nginx(统一入口 / 网关层)
# =========================================================
nginx:
image: nginx:latest
container_name: nginx
ports:
- "80:80"
volumes:
- /opt/docker/nginx/nginx.conf:/etc/nginx/nginx.conf
networks:
- peng-net
restart: unless-stopped
#depends_on:
# kibana:
# condition: service_started
# rabbitmq:
# condition: service_started
# elasticsearch:
# condition: service_started
# -------------------------
# ❤️ 健康检查(已修复)
# -------------------------
# healthcheck:
# ❗ 原来 nc 会失败(nginx 镜像没有)
# test: ["CMD-SHELL", "wget -qO- http://localhost/health || exit 1"]
# interval: 30s
# timeout: 15s # 【优化】
# retries: 3
# start_period: 15s # 【优化】
4.4创建目录
创建目录
# 700:完全私有(安全级)
# 755:开放但受控
# 先删除再创建
rm -rf /opt/docker \
&& mkdir -p /opt/docker/{mysql/{data,conf,init,logs},redis,postgres,rabbitmq,elasticsearch,nginx} \
&& chmod -R 755 /opt/docker \
&& chmod -R 777 /opt/docker/mysql \
&& chmod -R 777 /opt/docker/redis \
&& chmod -R 777 /opt/docker/postgres \
&& chmod -R 777 /opt/docker/rabbitmq \
&& chmod -R 777 /opt/docker/elasticsearch \
&& chown -R 1000:1000 /opt/docker/elasticsearch
# 进入目录
cd /opt/docker
复制 peng-docker-compose.yml相关配置文件到/opt/docker/目录下:
/opt/docker/mysql/conf/my.cnf/opt/docker/nginx/nginx.conf/opt/docker/.env
目录结构如下
/opt/docker
├── peng-docker-compose.yml # 主编排文件(入口)
├── .env # 环境变量(强烈建议)
├── nginx
│ ├── nginx.conf # 主配置(你现在在用)
├── mysql
│ ├── data/ # 数据目录(必须)
│ ├── conf/
│ │ └── my.cnf # 自定义配置(bind-address等)
│ └── init/
├── redis
├── postgres
├── rabbitmq
├── elasticsearch
└── kibana

4.5启动
执行命令
docker compose -f peng-docker-compose.yml up -d

查看运行状态
docker compose -f peng-docker-compose.yml ps

查看日志
docker compose -f peng-docker-compose.yml logs -f
停止服务
docker compose -f peng-docker-compose.yml down
5.测试
rabbitmq:用户名配置在peng-docker-compose.yml,密码配置在.env
http://192.168.188.180/rabbitmq/

kibana
http://192.168.188.180/kibana/app/home

es
http://192.168.188.180/es/

mysql:密码配置在.env

postgres:用户名配置在peng-docker-compose.yml,密码配置在.env

redis:.env设置了密码

📌 创作不易,感谢支持!
每一篇内容都凝聚了心血与热情,如果我的内容对您有帮助,欢迎请我喝杯咖啡☕,您的支持是我持续分享的最大动力!
💬 加入交流群(QQ群):576434538

浙公网安备 33010602011771号