centos7使用dockercompose搭建环境

前言

之前一直使用centos7,这个服务器已经停止维护了,所以docker安装和之前有点不一样,这里重新记录一下

1.阿里云镜像加速

打开阿里云

https://www.aliyun.com/

开通镜像服务

image-20240521224442834

进入控制台

image-20240521224500498

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

image-20240521224541563

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

image-20260419214733736

修复 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/

mkdirmv已经执行过了,截图里没有执行

image-20260419215029448

下载新源

curl -o CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

image-20260419215223668

刷新缓存

可能有FAILED但不影响安装

  • 阿里云某些旧镜像域名(mirrors.aliyuncs.com / mirrors.cloud.aliyuncs.com
  • 当前网络无法连接(被拒绝 / 已废弃 / DNS或路由问题)
  • yum 自动切换到了其他镜像,所以最后还是成功了
yum clean all
yum makecache

image-20260419215342869

安装工具

yum install -y yum-utils device-mapper-persistent-data lvm2

image-20260419215829683

添加 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

image-20260419215910104

image-20260419220208251

查看docker可用版本

yum list docker-ce --showduplicates | sort -r

image-20260419220247506

安装稳定版(推荐固定版本)不要直接 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

image-20260419220443758

创建配置目录

mkdir -p /etc/docker

image-20260419220549853

配置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

image-20260420002338977

检查状态

systemctl status docker

image-20260420002354801

检查状态

systemctl status docker

image-20260420002732715

开启自启

systemctl enable docker

image-20260420002827319

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

image-20260421012606537

根据每个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

image-20260422000210360

4.5启动

执行命令

docker compose -f peng-docker-compose.yml up -d

image-20260421023330022

查看运行状态

docker compose -f peng-docker-compose.yml ps

image-20260421023343367

查看日志

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/

image-20260422000553091

kibana

http://192.168.188.180/kibana/app/home

image-20260422000758041es

http://192.168.188.180/es/

image-20260422000812331

mysql:密码配置在.env

image-20260422000845565

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

image-20260422004018137

redis:.env设置了密码

image-20260422004104958

📌 创作不易,感谢支持!

每一篇内容都凝聚了心血与热情,如果我的内容对您有帮助,欢迎请我喝杯咖啡☕,您的支持是我持续分享的最大动力!

💬 加入交流群(QQ群):576434538

微信打赏

posted @ 2026-06-09 01:52  peng_boke  阅读(15)  评论(0)    收藏  举报