【Docker】summary
基础命令
# 查看容器状态
docker ps# 查看容器日志(排错神器)
docker logs 容器名称# 进入容器内部
docker exec -it 容器名称 bash# 停止容器
docker stop 容器名称# 启动容器
docker start 容器名称# 删除容器(不会删有 -v 挂载的数据)
docker rm 容器名称# 查询 windows docker 下载的镜像所在路径
docker info | findstr "Docker Root Dir"
redis 环境
基础信息(1 主 2 从 3 哨兵)
- 密码:
123456 - 主节点:
127.0.0.1:6379 - 从节点:
6380、6381 - 哨兵节点:
63791、63792、63793 - 哨兵主名称:
mymaster - 适用:Windows PowerShell
1. 一键创建 1 主 2 从 3 哨兵(全新创建)
powershell
docker run -d --name redis-master -p 6379:6379 redis redis-server --requirepass 123456; docker run -d --name redis-slave1 -p 6380:6379 redis redis-server --slaveof 127.0.0.1 6379 --masterauth 123456 --requirepass 123456; docker run -d --name redis-slave2 -p 6381:6379 redis redis-server --slaveof 127.0.0.1 6379 --masterauth 123456 --requirepass 123456; docker run -d --name sentinel1 -p 63791:26379 redis sh -c "mkdir -p /tmp && echo 'sentinel monitor mymaster 127.0.0.1 6379 2' > /tmp/sentinel.conf && echo 'sentinel auth-pass mymaster 123456' >> /tmp/sentinel.conf && redis-sentinel /tmp/sentinel.conf"; docker run -d --name sentinel2 -p 63792:26379 redis sh -c "mkdir -p /tmp && echo 'sentinel monitor mymaster 127.0.0.1 6379 2' > /tmp/sentinel.conf && echo 'sentinel auth-pass mymaster 123456' >> /tmp/sentinel.conf && redis-sentinel /tmp/sentinel.conf"; docker run -d --name sentinel3 -p 63793:26379 redis sh -c "mkdir -p /tmp && echo 'sentinel monitor mymaster 127.0.0.1 6379 2' > /tmp/sentinel.conf && echo 'sentinel auth-pass mymaster 123456' >> /tmp/sentinel.conf && redis-sentinel /tmp/sentinel.conf"2. 一键清空所有容器(删除重建)
powershell
docker rm -f $(docker ps -a -q --filter "name=redis") docker rm -f $(docker ps -a -q --filter "name=sentinel")3. 【最关键】哨兵配置文件修改(必须按顺序)
重要规则
修改前 → 必须关闭哨兵容器修改后 → 必须重启哨兵容器
步骤 1:关闭所有哨兵(必须做)
powershell
docker stop sentinel1 sentinel2 sentinel3步骤 2:修改配置文件(覆盖写入)
powershell
# 修改 sentinel1 docker exec sentinel1 sh -c "echo 'sentinel monitor mymaster 127.0.0.1 6379 2' > /tmp/sentinel.conf" docker exec sentinel1 sh -c "echo 'sentinel auth-pass mymaster 123456' >> /tmp/sentinel.conf" # 修改 sentinel2 docker exec sentinel2 sh -c "echo 'sentinel monitor mymaster 127.0.0.1 6379 2' > /tmp/sentinel.conf" docker exec sentinel2 sh -c "echo 'sentinel auth-pass mymaster 123456' >> /tmp/sentinel.conf" # 修改 sentinel3 docker exec sentinel3 sh -c "echo 'sentinel monitor mymaster 127.0.0.1 6379 2' > /tmp/sentinel.conf" docker exec sentinel3 sh -c "echo 'sentinel auth-pass mymaster 123456' >> /tmp/sentinel.conf"步骤 3:重启所有哨兵(必须做)
powershell
docker start sentinel1 sentinel2 sentinel34. 一键关闭所有(仅停止,保留容器)
Windows 专用
powershell
docker stop $(docker ps -a --filter "name=redis" --filter "name=sentinel" -q)5. 一键启动所有(恢复原有容器)
Windows 专用
powershell
docker start $(docker ps -a --filter "name=redis" --filter "name=sentinel" -q)6. 常用命令
查看所有容器状态
powershell
docker ps -a查看哨兵日志
powershell
docker logs sentinel1rocketmq 环境
- 停止:
docker stop rmqnamesrv rmqbroker rmqdashboard - 启动:
docker start rmqnamesrv rmqbroker rmqdashboard
使用 docker 安装 rocketmq 环境
下面给出一套单节点、可直接复制运行的 Docker 部署 RocketMQ 5.x(含 NameServer、Broker+Proxy、可视化控制台)完整步骤,适合开发 / 测试环境。
1. 环境准备
- 已安装 Docker(建议 20.10+)
- 防火墙放行端口:9876、10909、10911、10912、8080
2. 拉取镜像(官方 5.3.2)
bash
运行
# 核心镜像(NameServer + Broker + Proxy) docker pull apache/rocketmq:5.3.2 # 可视化控制台 docker pull styletang/rocketmq-console-ng:latest3. 创建网络(容器互通)
bash
运行
docker network create rocketmq4. 启动 NameServer(注册中心)
bash
运行
docker run -d \ --name rmqnamesrv \ --network rocketmq \ --restart always \ -p 9876:9876 \ -e "JAVA_OPT_EXT=-Xms256m -Xmx256m" \ apache/rocketmq:5.3.2 \ sh mqnamesrv验证:
bash
运行
docker logs -f rmqnamesrv # 看到 The Name Server boot success 即可5. 启动 Broker + Proxy(消息核心)
bash
运行
docker run -d \ --name rmqbroker \ --network rocketmq \ --restart always \ -p 10909:10909 -p 10911:10911 -p 10912:10912 \ -p 8080:8080 -p 8081:8081 \ -e "NAMESRV_ADDR=rmqnamesrv:9876" \ -e "JAVA_OPT_EXT=-Xms512m -Xmx512m" \ apache/rocketmq:5.3.2 \ sh mqbroker -n rmqnamesrv:9876验证:
bash
运行
docker logs -f rmqbroker # 看到 broker boot success 即可6. 启动可视化控制台(Web 管理)
bash
运行
docker run -d \ --name rmqconsole \ --network rocketmq \ --restart always \ -p 8082:8080 \ -e "JAVA_OPTS=-Drocketmq.namesrv.addr=rmqnamesrv:9876 -Dcom.rocketmq.console.config.path=/tmp" \ styletang/rocketmq-console-ng:latest访问:
plaintext
http://localhost:80827. 测试发送 / 消费消息
进入 Broker 容器测试:
bash
运行
docker exec -it rmqbroker bash # 发送消息 sh tools.sh org.apache.rocketmq.example.quickstart.Producer # 消费消息 sh tools.sh org.apache.rocketmq.example.quickstart.Consumer8. 常用端口说明
- 9876:NameServer
- 10909:Broker 对外服务端口
- 10911:Broker VIP 端口
- 10912:Broker 高可用端口
- 8080/8081:Proxy 端口(5.x 新架构)
- 8082:可视化控制台
9. (可选)Docker Compose 一键启动
新建docker-compose.yml:
yaml
version: '3.8' services: namesrv: image: apache/rocketmq:5.3.2 container_name: rmqnamesrv ports: - "9876:9876" networks: - rocketmq command: sh mqnamesrv environment: JAVA_OPT_EXT: "-Xms256m -Xmx256m" broker: image: apache/rocketmq:5.3.2 container_name: rmqbroker ports: - "10909:10909" - "10911:10911" - "10912:10912" - "8080:8080" - "8081:8081" networks: - rocketmq depends_on: - namesrv environment: NAMESRV_ADDR: "rmqnamesrv:9876" JAVA_OPT_EXT: "-Xms512m -Xmx512m" command: sh mqbroker -n rmqnamesrv:9876 console: image: styletang/rocketmq-console-ng:latest container_name: rmqconsole ports: - "8082:8080" networks: - rocketmq depends_on: - namesrv environment: JAVA_OPTS: "-Drocketmq.namesrv.addr=rmqnamesrv:9876" networks: rocketmq: driver: bridge启动:
bash
运行
docker-compose up -d如需,我可以帮你写一份Windows 环境下的启动脚本(含自动创建目录),直接双击即可运行。
将上述换行的命令改成不换行的形式
我把所有多行换行的 docker run 命令全部改成一行不换行版本,直接复制粘贴就能用,非常方便:
1. 创建网络
docker network create rocketmq2. 启动 NameServer
docker run -d --name rmqnamesrv --network rocketmq --restart always -p 9876:9876 -e "JAVA_OPT_EXT=-Xms256m -Xmx256m" apache/rocketmq:5.3.2 sh mqnamesrv3. 启动 Broker
docker run -d --name rmqbroker --network rocketmq --restart always -p 10909:10909 -p 10911:10911 -p 10912:10912 -p 8080:8080 -p 8081:8081 -e "NAMESRV_ADDR=rmqnamesrv:9876" -e "JAVA_OPT_EXT=-Xms512m -Xmx512m" apache/rocketmq:5.3.2 sh mqbroker -n rmqnamesrv:98764. 启动控制台
docker run -d --name rmqconsole --network rocketmq --restart always -p 8082:8080 -e "JAVA_OPTS=-Drocketmq.namesrv.addr=rmqnamesrv:9876 -Dcom.rocketmq.console.config.path=/tmp" styletang/rocketmq-console-ng:latest5. 测试命令
docker exec -it rmqbroker bash完整一键执行顺序(复制全部一起运行)
docker network create rocketmq docker run -d --name rmqnamesrv --network rocketmq --restart always -p 9876:9876 -e "JAVA_OPT_EXT=-Xms256m -Xmx256m" apache/rocketmq:5.3.2 sh mqnamesrv docker run -d --name rmqbroker --network rocketmq --restart always -p 10909:10909 -p 10911:10911 -p 10912:10912 -p 8080:8080 -p 8081:8081 -e "NAMESRV_ADDR=rmqnamesrv:9876" -e "JAVA_OPT_EXT=-Xms512m -Xmx512m" apache/rocketmq:5.3.2 sh mqbroker -n rmqnamesrv:9876 docker run -d --name rmqconsole --network rocketmq --restart always -p 8082:8080 -e "JAVA_OPTS=-Drocketmq.namesrv.addr=rmqnamesrv:9876 -Dcom.rocketmq.console.config.path=/tmp" styletang/rocketmq-console-ng:latest总结
- 所有命令都已压缩为单行,无换行、无转义符
- 直接复制即可在 Windows/Linux/Mac 终端运行
启动完成后访问控制台:
http://localhost:8082
MySQL
docker run -d --name mysql8 -p 3306:3306 ^
# docker run : 创建并启动一个新的容器
# -d : 后台运行容器(守护进程模式,detached)
# --name mysql8 : 给容器指定一个名字叫 mysql8(方便后续管理,如 start/stop/rm)
# -p 3306:3306 : 端口映射
# 宿主机端口:容器内部端口
# 即:访问本机 3306 端口 = 访问容器里的 MySQL 3306 端口-v D:/Environment/docker/mysql8/data:/var/lib/mysql ^
# -v : 数据卷挂载(Volume)
# D:/Environment/docker/mysql8/data
# 👉 Windows 宿主机的目录(用于持久化数据)
# /var/lib/mysql
# 👉 MySQL 容器内部存放数据库文件的目录
# 作用:即使容器删除,数据库数据也不会丢失(非常重要)-e MYSQL_ROOT_PASSWORD=123456 ^
# -e : 设置环境变量
# MYSQL_ROOT_PASSWORD
# 👉 MySQL 官方镜像要求的变量
# 用于设置 root 用户的密码
# 这里密码设置为:123456(生产环境请勿使用弱密码)--restart=always mysql:8.0
# --restart=always
# 👉 Docker 重启或宿主机重启时,自动启动该容器
# mysql:8.0 : 使用的镜像名称和版本
# 👉 如果不写版本,默认是 mysql:latest
docker run -d --name mysql8 -p 3306:3306 ^
-v D:/Environment/docker/mysql8/data:/var/lib/mysql ^
-e MYSQL_ROOT_PASSWORD=123456 ^
--restart=always mysql:8.0
既然你运行容器时使用了-v D:/Environment/docker/mysql8/data:/var/lib/mysql进行数据卷挂载,那么删除容器并不会删除你主机上的数据。
恢复(实际上是“重建”)非常简单,直接重新执行原来那条docker run命令即可:
相关命令:
docker run -d `
--name rocketmq-namesrv `
-p 9876:9876 `
-v D:/Environment/docker/rocketmq/namesrv/logs:/home/rocketmq/logs `
-v D:/Environment/docker/rocketmq/namesrv/store:/home/rocketmq/store `
-e "JAVA_OPTS=-Xms512m -Xmx512m" `
apache/rocketmq:5.1.0 `
sh mqnamesrvdocker run -d `
--name rocketmq-broker `
-p 10909:10909 `
-p 10911:10911 `
-p 10912:10912 `
-v D:/Environment/docker/rocketmq/broker/conf/broker.conf:/home/rocketmq/conf/broker.conf `
-v D:/Environment/docker/rocketmq/broker/logs:/home/rocketmq/logs `
-v D:/Environment/docker/rocketmq/broker/store:/home/rocketmq/store `
-e "JAVA_OPTS=-Xms1g -Xmx1g" `
apache/rocketmq:5.1.0 `
sh mqbroker -n 10.8.57.188:9876 -c /home/rocketmq/conf/broker.confdocker run -d `
--name rocketmq-dashboard `
-p 8086:8080 `
-e "JAVA_OPTS=-Drocketmq.namesrv.addr=10.8.57.188:9876" `
apacherocketmq/rocketmq-dashboard:latest
docker run -d --name rocketmq-dashboard `
-e "JAVA_OPTS=-Xmx512m -Xms512m -Drocketmq.namesrv.addr=10.8.57.188:9876" `
-p 8086:8080 `
apacherocketmq/rocketmq-dashboard:latest
docker stop rocketmq-namesrv rocketmq-broker rocketmq-dashboard
docker rm rocketmq-namesrv rocketmq-broker rocketmq-dashboard
首次启动 / 重建启动
docker compose up -d --build
查看运行状态
docker compose ps
查看 Broker 日志
docker compose logs -f broker
停止但不删除数据
docker compose down
停止并删除所有数据(慎用)
docker compose down -v#查看配置
Get-Content D:/Environment/docker/rocketmq/broker/conf/broker.conf
Docker Compose
dev / test / prod 配置不同
👉 Docker Compose 本身并没有“模块化”语法,所以它不适合“单体巨石文件”。
二、工程实践中正确的解决思路(非常重要)
✅ 核心原则
一个 docker-compose = 一个“关注点”
而不是 一个 docker-compose = 整个系统
三、推荐方案:Compose 拆分 + 合并加载(工业级)
✅ 方案一:docker-compose.yml + 多个 override / fragment
目录结构(强烈推荐)
deploy/
├── docker-compose.yml # 公共基础
├── redis.yml # Redis 主从 + Sentinel
├── mysql.yml # MySQL
├── mq.yml # RocketMQ / Kafka
└── dev.env # 环境变量
#启动(后台)
docker compose up -d#查看日志
docker compose logs -f 容器名#停止但不删容器
docker compose stop#停止并删除容器(数据不会丢)
docker compose down
启动方式
docker compose \
-f docker-compose.yml \
-f redis.yml \
-f mysql.yml \
-f mq.yml \
up -d
# 启动各组件
docker compose -f docker-compose.yml \
-f redis/docker-compose.redis.yml \
-f mysql/docker-compose.mysql.yml \
-f mq/docker-compose.kafka.yml \
up -ddocker run -d --name mysql8 -p 3306:3306 ^
# docker run : 创建并启动一个新的容器
# -d : 后台运行容器(守护进程模式,detached)
# --name mysql8 : 给容器指定一个名字叫 mysql8(方便后续管理,如 start/stop/rm)
# -p 3306:3306 : 端口映射
# 宿主机端口:容器内部端口
# 即:访问本机 3306 端口 = 访问容器里的 MySQL 3306 端口-v D:/Environment/docker/mysql8/data:/var/lib/mysql ^
# -v : 数据卷挂载(Volume)
# D:/Environment/docker/mysql8/data
# 👉 Windows 宿主机的目录(用于持久化数据)
# /var/lib/mysql
# 👉 MySQL 容器内部存放数据库文件的目录
# 作用:即使容器删除,数据库数据也不会丢失(非常重要)-e MYSQL_ROOT_PASSWORD=123456 ^
# -e : 设置环境变量
# MYSQL_ROOT_PASSWORD
# 👉 MySQL 官方镜像要求的变量
# 用于设置 root 用户的密码
# 这里密码设置为:123456(生产环境请勿使用弱密码)--restart=always mysql:8.0
# --restart=always
# 👉 Docker 重启或宿主机重启时,自动启动该容器
# mysql:8.0 : 使用的镜像名称和版本
# 👉 如果不写版本,默认是 mysql:latestdocker run -d --name mysql8 -p 3306:3306 ^
-v D:/Environment/docker/mysql8/data:/var/lib/mysql ^
-e MYSQL_ROOT_PASSWORD=123456 ^
--restart=always mysql:8.0
