Docker拉取应用环境

docker-compse一键安装应用环境

参考的资源包下载地址:https://gitcode.net/KnowledgePlanet/big-market/big-market-dev-ops
命令执行:

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

yaml的文件内容如下:

# 命令执行 docker-compose up -d
# docker-compose -f docker-compose-environment.yml up -d
version: "3.9"
services:
    # yum install -y httpd-tools
    nginx:
        image: registry.cn-hangzhou.aliyuncs.com/xfg-studio/nginx:latest
        container_name: nginx
        restart: always
        ports:
            - "443:443"
            - "80:80"
        volumes:
            - ./nginx/logs:/var/log/nginx
            - ./nginx/html:/usr/share/nginx/html
            - ./nginx/conf/nginx.conf:/etc/nginx/nginx.conf
            - ./nginx/conf/conf.d:/etc/nginx/conf.d
            - ./nginx/ssl:/etc/nginx/ssl/
        privileged: true
        networks:
            - my-network

    # 注册中心 https://github.com/nacos-group/nacos-docker - 其他配置可参考(集群)
    # http://127.0.0.1:8848/nacos 【账号:nacos 密码:nacos】
    nacos:
        image: nacos/nacos-server:v2.2.3-slim
        container_name: nacos
        restart: always
        ports:
            - "8848:8848"
            - "9848:9848"
        environment:
            - PREFER_HOST_MODE=hostname
            - MODE=standalone
            - SPRING_DATASOURCE_PLATFORM=mysql
            - MYSQL_SERVICE_HOST=mysql
            - MYSQL_SERVICE_DB_NAME=nacos_config
            - MYSQL_SERVICE_PORT=3306
            - MYSQL_SERVICE_USER=root
            - MYSQL_SERVICE_PASSWORD=12qw!@QW
            - MYSQL_SERVICE_DB_PARAM=characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true
            - NACOS_AUTH_IDENTITY_KEY=2222
            - NACOS_AUTH_IDENTITY_VALUE=2xxx
            - NACOS_AUTH_TOKEN=SecretKey012345678901234567890123456789012345678901234567890123456789
        networks:
            - my-network
        depends_on:
            mysql:
                condition: service_healthy
        deploy:
            resources:
                limits:
                    cpus: "1.00"
                    memory: "1G"

    mysql:
        image: mysql:8.0.32
        container_name: mysql
        command: --default-authentication-plugin=mysql_native_password
        restart: always
        environment:
            TZ: Asia/Shanghai
            MYSQL_ROOT_PASSWORD: 12qw!@QW
        ports:
            - "13306:3306"
        volumes:
            - ./mysql/sql:/docker-entrypoint-initdb.d
        healthcheck:
            test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
            interval: 5s
            timeout: 10s
            retries: 10
            start_period: 15s
        networks:
            - my-network

    # phpmyadmin https://hub.docker.com/_/phpmyadmin
    phpmyadmin:
        image: phpmyadmin:5.2.1
        container_name: phpmyadmin
        hostname: phpmyadmin
        ports:
            - 8899:80
        environment:
            - PMA_HOST=mysql
            - PMA_PORT=3306
            - MYSQL_ROOT_PASSWORD=12qw!@QW
        depends_on:
            mysql:
                condition: service_healthy
        networks:
            - my-network
        deploy:
            resources:
                limits:
                    cpus: "0.25"
                    memory: "256M"

    # Redis
    # chmod 666 redis.conf
    redis:
        image: redis:6.2
        container_name: redis
        restart: always
        hostname: redis
        privileged: true
        ports:
            - 16379:6379
        volumes:
            - ./redis/redis.conf:/usr/local/etc/redis/redis.conf
        command: redis-server /usr/local/etc/redis/redis.conf
        networks:
            - my-network
        healthcheck:
            test: ["CMD", "redis-cli", "ping"]
            interval: 10s
            timeout: 5s
            retries: 3
        deploy:
            resources:
                limits:
                    cpus: "0.25"
                    memory: "256M"

    # RedisAdmin https://github.com/joeferner/redis-commander
    # 账密 admin/admin
    redis-admin:
        image: spryker/redis-commander:0.8.0
        container_name: redis-admin
        hostname: redis-commander
        restart: always
        ports:
            - 8081:8081
        environment:
            - REDIS_HOSTS=local:redis:6379
            - HTTP_USER=fuzhengwei
            - HTTP_PASSWORD=12qw!@QW
            - LANG=C.UTF-8
            - LANGUAGE=C.UTF-8
            - LC_ALL=C.UTF-8
        networks:
            - my-network
        depends_on:
            redis:
                condition: service_healthy

    # rabbitmq
    # 账密 admin/admin
    # rabbitmq-plugins enable rabbitmq_management
    # chmod 777 enabled_plugins
    rabbitmq:
        image: rabbitmq:3.12.9
        container_name: rabbitmq
        restart: always
        ports:
            - "5672:5672"
            - "15672:15672"
        environment:
            RABBITMQ_DEFAULT_USER: admin
            RABBITMQ_DEFAULT_PASS: 12qw!@QW
        command: rabbitmq-server
        volumes:
            - ./rabbitmq/enabled_plugins:/etc/rabbitmq/enabled_plugins
        deploy:
            resources:
                limits:
                    cpus: "0.25"
                    memory: "256M"

    zookeeper:
        image: zookeeper:3.9.0
        container_name: zookeeper
        restart: always
        hostname: zoo1
        ports:
            - 2181:2181
        environment:
            ZOO_MY_ID: 1
            ZOO_SERVERS: server.1=zookeeper:2888:3888;2181
        networks:
            - my-network
        deploy:
            resources:
                limits:
                    cpus: "0.25"
                    memory: "256M"

    # canal-server 伪装成mysql的从库
    # docker cp canal-server:/home/admin/canal-server/conf/example/instance.properties /Users/xiaofuge/Documents/develop/github/xfg-studio/xfg-dev-tech-canal/docs/dev-ops/canal
    #  canal-server:
    #    image: canal/canal-server:v1.1.7
    #    container_name: canal-server
    #    restart: unless-stopped
    #    ports:
    #      - "11111:11111"
    #    volumes:
    #      - ./canal/instance.properties:/home/admin/canal-server/conf/example/instance.properties
    #    depends_on:
    #      - mysql
    #    networks:
    #      - my-network

    # canal-adapter 负责数据分发
    # docker cp canal-adapter:/opt/canal-adapter/conf/application.yml /Users/xiaofuge/Documents/develop/github/xfg-studio/xfg-dev-tech-canal/docs/dev-ops/canal-adapter
    # docker cp canal-adapter:/opt/canal-adapter/conf/rdb/mytest_user.yml /Users/xiaofuge/Documents/develop/github/xfg-studio/xfg-dev-tech-canal/docs/dev-ops/canal-adapter/rdb
    #  canal-adapter:
    #    image: coopersoft/canal-adapter:v1.1.6
    #    container_name: canal-adapter
    #    restart: unless-stopped
    #    ports:
    #      - "8082:8081"
    #    volumes:
    #      - ./canal-adapter/conf:/opt/canal-adapter/conf
    #      - ./canal-adapter/es7:/opt/canal-adapter/conf/es7
    #    depends_on:
    #      - mysql
    #    networks:
    #      - my-network
    #
    #  elasticsearch:
    #    image: elasticsearch:7.17.14
    #    ports:
    #      - '9200:9200'
    #      - '9300:9300'
    #    container_name: elasticsearch
    #    restart: always
    #    environment:
    #      - 'cluster.name=elasticsearch' # 设置集群名称为elasticsearch
    #      - 'discovery.type=single-node' # 以单一节点模式启动
    #      - "cluster.name=docker-cluster" # 设置名称
    #      - 'ES_JAVA_OPTS=-Xms512m -Xmx512m' # 设置使用jvm内存大小
    #    networks:
    #      - my-network

    #  kibana:
    #    image: kibana:7.17.14
    #    container_name: kibana
    #    restart: always
    #    volumes:
    #      - /etc/localtime:/etc/localtime
    #      - ./kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml
    #    ports:
    #      - '5601:5601'
    #    links:
    #      - elasticsearch:es #可以用es这个域名访问elasticsearch服务
    #    environment:
    #      - ELASTICSEARCH_URL=http://elasticsearch:9200 #设置访问elasticsearch的地址
    #      - 'elasticsearch.hosts=http://es:9200' #设置访问elasticsearch的地址
    #      - I18N_LOCALE=zh-CN
    #    networks:
    #      - my-network
    #    depends_on:
    #      - elasticsearch

    # http://127.0.0.1:9090/xxl-job-admin admin/123456 - 安装后稍等会访问即可
    # 官网镜像为 xuxueli/xxl-job-admin:2.4.1 但不支持ARM架构【需要自己打包】,所以找了一个 kuschzzp/xxl-job-aarch64:2.4.0 镜像支持 AMD/ARM
    xxl-job-admin:
        image: xuxueli/xxl-job-admin:2.4.1 #M1 Mac 更换镜像 kuschzzp/xxl-job-aarch64:2.4.0
        container_name: xxl-job-admin
        restart: always
        depends_on:
            - mysql
        ports:
            - "9090:9090"
        links:
            - mysql
        environment:
            - SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/xxl_job?serverTimezone=UTC&characterEncoding=utf8&autoReconnect=true&serverTimezone=Asia/Shanghai
            - SPRING_DATASOURCE_USERNAME=root
            - SPRING_DATASOURCE_PASSWORD=12qw!@QW
            - SERVER_PORT=9090
        networks:
            - my-network

#  # 数据采集
#  prometheus:
#    image: bitnami/prometheus:2.47.2
#    container_name: prometheus
#    restart: always
#    ports:
#      - 9090:9090
#    volumes:
#      - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
#    networks:
#      - my-network
#
#  # 监控界面
#  grafana:
#    image: grafana/grafana:10.2.0
#    container_name: grafana
#    restart: always
#    ports:
#      - 4000:4000
#    depends_on:
#      - prometheus
#    volumes:
#      - ./grafana:/etc/grafana
#    networks:
#      - my-network

networks:
    my-network:
        driver: bridge

配置程序分析:

1. Nginx

作用: Web服务器和反向代理
配置参数:

  • ports: 暴露80(HTTP)和443(HTTPS)端口
  • volumes: 挂载配置、日志、HTML文件和SSL证书目录
  • privileged: true: 赋予容器特权模式,便于操作

2. Nacos

作用: 服务发现和配置管理中心
配置参数:

  • ports: 8848(HTTP API)和9848(gRPC API)端口
  • environment:
    • MODE=standalone: 单机模式运行
    • MySQL数据库连接配置(主机、数据库名、端口、用户名、密码)
    • 认证相关配置(密钥、令牌)
  • depends_on: 依赖MySQL服务
  • resources: 限制CPU和内存使用

3. MySQL

作用: 关系型数据库服务
配置参数:

  • command: 使用原生密码认证插件
  • environment:
    • 设置时区为上海
    • 设置root密码为12qw!@QW
  • ports: 映射13306到容器内3306
  • volumes: 挂载初始化SQL脚本目录
  • healthcheck: 健康检查配置,使用mysqladmin ping命令

4. phpMyAdmin

作用: MySQL的Web管理界面
配置参数:

  • ports: 映射8899到容器内80
  • environment:
    • 连接MySQL的配置(主机、端口、密码)
  • depends_on: 依赖MySQL服务
  • resources: 限制资源使用

5. Redis

作用: 内存键值数据库
配置参数:

  • ports: 映射16379到容器内6379
  • volumes: 挂载自定义配置文件
  • command: 指定使用自定义配置文件启动
  • healthcheck: 使用redis-cli ping检查状态

6. Redis-Commander (Redis Admin)

作用: Redis的Web管理界面
配置参数:

  • ports: 映射8081到容器内8081
  • environment:
    • 连接Redis的配置
    • 设置Web界面登录凭证(用户名fuzhengwei,密码12qw!@QW)

7. RabbitMQ

作用: 消息队列服务
配置参数:

  • ports:
    • 5672: AMQP协议端口
    • 15672: 管理界面端口
  • environment: 设置默认用户和密码(admin/12qw!@QW)
  • volumes: 挂载插件配置文件

8. Zookeeper

作用: 分布式协调服务
配置参数:

  • ports: 映射2181端口
  • environment: 配置单节点集群设置

9. XXL-Job

作用: 分布式任务调度平台
配置参数:

  • ports: 映射9090端口
  • environment:
    • 数据库连接配置(连接MySQL的xxl_job数据库)
    • 设置服务端口
  • depends_on: 依赖MySQL服务

网络配置

  • my-network: 创建一个桥接网络,所有服务都加入此网络,便于服务间通信

未启用的服务

以下是 Docker Compose 文件中被注释掉但同样重要的服务详解,这些服务通常在特定场景下使用:

1. Canal 服务组(MySQL 增量数据同步)

(1) Canal-Server

作用:伪装成 MySQL 的从库,实时解析 binlog 日志
核心配置

ports:
  - "11111:11111"  # Canal 客户端通信端口
volumes:
  - ./canal/instance.properties:/home/admin/canal-server/conf/example/instance.properties  # 关键配置文件

配置文件作用
instance.properties 需配置:

  • canal.instance.mysql.slaveId:伪装为 MySQL 从库的 ID
  • canal.instance.filter.regex:监控的数据库表过滤规则(如 .*\\..* 监控所有表)

(2) Canal-Adapter

作用:将 Canal-Server 解析的数据分发到其他存储(如 ES、Redis)
关键配置

ports:
  - "8082:8081"  # Adapter 管理端口
volumes:
  - ./canal-adapter/conf:/opt/canal-adapter/conf  # 包含 application.yml
  - ./canal-adapter/es7:/opt/canal-adapter/conf/es7  # ES 映射规则

典型场景
将 MySQL 数据实时同步到 Elasticsearch,需在 application.yml 中配置:

  • 数据源连接(指向 Canal-Server)
  • 目标存储(如 ES 的地址和索引映射)

2. Elasticsearch + Kibana(搜索与分析)

(1) Elasticsearch

作用:分布式搜索和数据分析引擎
关键参数

environment:
  - 'discovery.type=single-node'  # 单节点模式(生产环境需集群)
  - 'ES_JAVA_OPTS=-Xms512m -Xmx512m'  # JVM 内存限制
ports:
  - '9200:9200'  # REST API 端口
  - '9300:9300'  # 集群通信端口

注意

  • 生产环境需挂载 data 目录持久化数据
  • 可通过 elasticsearch.yml 配置安全认证

(2) Kibana

作用:Elasticsearch 的可视化分析界面
核心配置

environment:
  - ELASTICSEARCH_URL=http://elasticsearch:9200  # 指向 ES 服务
  - I18N_LOCALE=zh-CN  # 中文界面
ports:
  - '5601:5601'  # Web 访问端口

典型用途

  • 日志分析(需配合 Filebeat 或 Logstash)
  • 数据仪表盘构建

3. Prometheus + Grafana(监控系统)

(1) Prometheus

作用:指标采集与存储
关键配置

volumes:
  - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml  # 监控目标配置
ports:
  - 9090:9090  # 管理界面端口

配置文件示例
prometheus.yml 中需定义:

  • scrape_configs:监控哪些服务(如 Node Exporter、MySQL Exporter)
  • alerting:告警规则配置

(2) Grafana

作用:监控数据可视化
核心参数

ports:
  - 4000:4000  # 默认端口应为 3000,此处可能是自定义
volumes:
  - ./grafana:/etc/grafana  # 持久化仪表盘配置

典型场景

  • 通过 Prometheus 数据源展示 CPU/内存/服务健康状态
  • 需手动导入或创建 Dashboard

被注释服务的共同特点

  1. 资源占用较高
    Elasticsearch 和 Prometheus 对内存需求较大,适合单独部署。
  2. 配置复杂度高
    如 Canal 需要精确匹配 MySQL 的 binlog 格式,Prometheus 需配置采集间隔和目标。
  3. 按需启用
    这些服务通常在以下场景使用:
    • 需要实时数据同步(Canal)
    • 全文搜索或日志分析(ES+Kibana)
    • 基础设施监控(Prometheus+Grafana)

MySQL

MySQL5.7

docker pull mysql:5.7

运行指令:

docker run -d --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e TZ=Asia/Shanghai mysql:5.7

解释一下参数的含义:
-d:以后台的方式运行;
--name mysql:指定容器的名称为 mysql;
-p 3306:3306: 将容器的 3306 端口挂载到宿主机的 3306 端口上(前面是宿主机的端口号,后面是容器的端口号);
-e MYSQL_ROOT_PASSWORD=123456:指定 root 用户的密码为 123456;
-e TZ=Asia/Shanghai:指定容器内部时区为上海时区;

posted @ 2025-07-15 11:13  一人一口粥  阅读(21)  评论(0)    收藏  举报
|