【NFTurbo】基于DockerCompose一键部署
基于DockerCompose一键部署
- 1. 安装Docker与Dokcer Compose
- 2. 配置Docker
- 3. 安装docker-compose
- 4. 配置镜像源
- 5. 安装脚本
- 5.1 打印脚本说明
- 5.2 获取公网IP地址
- 5.3 手动输入公网IP(如果无法自动获取)
- 5.4 替换配置文件中的 IP 地址
- 5.5 检查 Docker 是否正在运行
- 5.6 清理旧数据(可选)
- 5.7 启动 MySQL 和 Redis 服务
- 5.8 等待 MySQL 和 Redis 启动
- 5.9 查询所有服务
- 5.10 查询所有端口的占用
- 5.11 查看某个端口是否被占用
1. 安装Docker与Dokcer Compose
这里我的服务器使用的是CentOS7.6
[root@iv-ye20h65dz45i3z346rvs /]# lsb_release -a
LSB Version: :core-4.1-amd64:core-4.1-noarch # 表示当前系统支持的 LSB(Linux Standard Base)版本是 4.1,适用于 amd64(64 位架构)和 noarch(与架构无关的)系统。
Distributor ID: CentOS # Linux 发行版是 CentOS。
Description: CentOS Linux release 7.6.1810 (Core) #CentOS 版本是 7.6.1810,且是“Core”版本,即没有附带图形界面的服务器版。
Release: 7.6.1810 # 显示了 CentOS 版本的具体号。
Codename: Core # 这是CentOS的代号,表明该版本为核心版本,没有图形界面。
lsb_release -a
命令用于显示 Linux 系统的详细版本信息。具体来说,执行这个命令会输出以下信息:
- Distributor ID: 发行版的名称(例如 Ubuntu、CentOS、Debian)。
- Description: 发行版的简短描述,包括版本信息。
- Release: 发行版的版本号。
- Codename: 发行版的代号(例如 Ubuntu 的 20.04 版本代号为 Focal Fossa)。
不同系统安装Dokcer的方法
https://help.aliyun.com/zh/ecs/use-cases/install-and-use-docker#940c78642dmq9
2. 配置Docker
运行以下命令,下载docker-ce的yum源
sudo wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
运行以下命令,安装Docker
sudo yum -y install docker-ce
执行以下命令,检查Docker是否安装成功
sudo docker -v
执行以下命令,启动Docker服务,并设置开机自启动。
sudo systemctl start docker
sudo systemctl enable docker
执行以下命令,查看Docker是否启动。
3. 安装docker-compose
运行以下命令,安装setuptools。
sudo pip3 install -U pip setuptools
运行以下命令,安装docker-compose。
sudo pip3 install docker-compose
运行以下命令,验证docker-compose是否安装成功。
docker-compose --version
如果回显返回docker-compose版本信息,表示docker-compose已安装成功。
4. 配置镜像源
{"registry-mirrors": ["https://docker.anyhub.us.kg/","https://hub.uuuadc.top/","https://dockerhub.jobcher.com/","https://dockerhub.icu/","https://docker.ckyl.me/","https://docker.awsl9527.cn/","https://q7ta64ip.mirror.aliyuncs.com","https://hx983jf6.mirror.aliyuncs.com","https://docker.mirrors.ustc.edu.cn","https://hub-mirror.c.163.com","https://docker.m.daocloud.io","https://mirror.baidubce.com","https://docker.nju.edu.cn","https://jockerhub.com","https://dockerhub.azk8s.cn","https://dockerproxy.com","https://mirror.baidubce.com","https://docker.nju.edu.cn","https://mirror.iscas.ac.cn","https://dockerpull.org","https://docker.1panel.dev","https://docker.fxxk.dedyn.io","https://docker.xn--6oq72ry9d5zx.cn","https://docker.zhai.cm","https://docker.5z5f.com","https://a.ussh.net","https://docker.cloudlayer.icu","https://hub.littlediary.cn","https://hub.crdz.gq","https://docker.unsee.tech","https://docker.kejilion.pro","https://registry.dockermirror.com","https://hub.rat.dev","https://dhub.kubesre.xyz","https://docker.nastool.de","https://docker.udayun.com","https://docker.rainbond.cc","https://hub.geekery.cn","https://docker.1panelproxy.com","https://atomhub.openatom.cn","https://docker.m.daocloud.io"]
}
# 使配置生效
systemctl daemon-reload# 重启Docker
systemctl restart docker
5. 安装脚本
#!/bin/bashecho "=========================================="
echo "NFTurbo 环境核心依赖(MySQL、Redis、Nacos、XXL-JOB、RocketMQ、Seata)一键启动脚本"
echo "=========================================="# 获取公网IP地址
echo "🔍 正在获取公网IP地址..."
PUBLIC_IP=""# 尝试多个公网IP获取服务
for service in "ifconfig.me" "icanhazip.com" "ipinfo.io/ip" "ipecho.net/plain"; doecho "尝试从 $service 获取IP..."PUBLIC_IP=$(curl -s --connect-timeout 5 --max-time 10 "$service" 2>/dev/null | tr -d '\n\r')if [[ -n "$PUBLIC_IP" && "$PUBLIC_IP" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; thenecho "✅ 成功获取公网IP: $PUBLIC_IP"breakfi
done# 如果无法获取公网IP,让用户手动输入
if [[ -z "$PUBLIC_IP" || ! "$PUBLIC_IP" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; thenecho "❌ 无法自动获取公网IP"echo "请手动输入您的服务器公网IP地址:"read -p "请输入IP地址: " PUBLIC_IP# 验证IP地址格式while [[ ! "$PUBLIC_IP" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; doecho "❌ IP地址格式不正确,请重新输入:"read -p "请输入IP地址: " PUBLIC_IPdone
fiecho "🎯 使用IP地址: $PUBLIC_IP"# 替换配置文件中的占位符
echo "🔧 更新配置文件中的IP地址..."# 替换docker-compose.yml中的占位符
sed -i.bak "s/{{PUBLIC_IP}}/$PUBLIC_IP/g" docker-compose.yml# 替换RocketMQ broker配置中的占位符
sed -i.bak "s/{{PUBLIC_IP}}/$PUBLIC_IP/g" rocketMQ/data/broker/conf/broker.conf# 替换MySQL初始化脚本中的占位符
sed -i.bak "s/{{PUBLIC_IP}}/$PUBLIC_IP/g" mysql/init/01-nacos-mysql.sqlecho "✅ IP地址更新完成"# 检查Docker是否运行
if ! docker info > /dev/null 2>&1; thenecho "❌ Docker未运行,请先启动Docker"exit 1
fiecho "✅ Docker运行正常"# 清理旧数据(可选)
read -p "是否清理旧数据?(y/n): " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; thenecho "清理旧数据..."sudo rm -rf mysql/data/* redis/data/* es/data/*echo "✅ 数据清理完成"
fi# 启动MySQL和Redis
echo "🚀 启动MySQL和Redis..."
docker compose up -d mysql redis# 等待MySQL启动
echo "⏳ 等待MySQL启动..."
sleep 10# 检查MySQL是否健康
echo "🔍 检查MySQL健康状态..."
for i in {1..30}; doif docker compose exec mysql mysqladmin ping -h localhost --silent; thenecho "✅ MySQL启动成功"breakfiecho "⏳ 等待MySQL启动... ($i/30)"sleep 10
done# 检查Redis是否健康
echo "🔍 检查Redis健康状态..."
for i in {1..10}; doif docker compose exec redis redis-cli ping > /dev/null 2>&1; thenecho "✅ Redis连接正常"breakfiif [ $i -eq 10 ]; thenecho "❌ Redis连接失败,请检查Redis服务状态"exit 1fiecho "⏳ 等待Redis连接... ($i/10)"sleep 2
done# 初始化Redis数据
echo "🔧 初始化Redis数据..."
./init-redis-data.sh# 启动Nacos
echo "🚀 启动Nacos..."
docker compose up -d nacos# 等待Nacos启动
echo "⏳ 等待Nacos启动..."
sleep 10# 启动其他服务
echo "🚀 启动其他服务..."
docker compose up -d# 等待服务启动z
echo "⏳ 等待服务启动..."
sleep 10echo "=========================================="
echo "🎉 所有服务启动完成!"
echo "=========================================="
echo "服务访问地址:"
echo "MySQL: http://ip:3306 (用户名/密码: nfturbo/NFTurbo666)"
echo "Redis: http://ip:6379 (密码: NFTurbo666)"
echo "Nacos: http://ip:8848/nacos (用户名/密码: nacos/nacos)"
echo "XXL-Job: http://ip8082/xxl-job-admin (用户名/密码: admin/123456)"
echo "RocketMQ Dashboard: http://ip:8080"
echo "=========================================="# 显示服务状态
echo "📊 服务状态:"
docker compose ps
5.1 打印脚本说明
echo "=========================================="
echo "NFTurbo 环境核心依赖(MySQL、Redis、Nacos、XXL-JOB、RocketMQ、Seata)一键启动脚本"
echo "=========================================="
5.2 获取公网IP地址
echo "🔍 正在获取公网IP地址..."
PUBLIC_IP=""
for service in "ifconfig.me" "icanhazip.com" "ipinfo.io/ip" "ipecho.net/plain"; doecho "尝试从 $service 获取IP..."PUBLIC_IP=$(curl -s --connect-timeout 5 --max-time 10 "$service" 2>/dev/null | tr -d '\n\r')if [[ -n "$PUBLIC_IP" && "$PUBLIC_IP" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; thenecho "✅ 成功获取公网IP: $PUBLIC_IP"breakfi
done
该部分代码尝试从多个公网 IP 服务获取机器的公网 IP 地址。如果获取成功,则输出 IP 地址并跳出循环。如果所有尝试都失败,脚本将提示用户手动输入 IP 地址。
5.3 手动输入公网IP(如果无法自动获取)
if [[ -z "$PUBLIC_IP" || ! "$PUBLIC_IP" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; thenecho "❌ 无法自动获取公网IP"echo "请手动输入您的服务器公网IP地址:"read -p "请输入IP地址: " PUBLIC_IPwhile [[ ! "$PUBLIC_IP" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; doecho "❌ IP地址格式不正确,请重新输入:"read -p "请输入IP地址: " PUBLIC_IPdone
fi
5.4 替换配置文件中的 IP 地址
echo "🔧 更新配置文件中的IP地址..."
sed -i.bak "s/{{PUBLIC_IP}}/$PUBLIC_IP/g" docker-compose.yml
sed -i.bak "s/{{PUBLIC_IP}}/$PUBLIC_IP/g" rocketMQ/data/broker/conf/broker.conf
sed -i.bak "s/{{PUBLIC_IP}}/$PUBLIC_IP/g" mysql/init/01-nacos-mysql.sql
echo "✅ IP地址更新完成"
脚本将替换多个配置文件中的占位符 {{PUBLIC_IP}}
为实际获取到的公网 IP 地址。使用 sed 命令进行替换,并备份原文件。
5.5 检查 Docker 是否正在运行
if ! docker info > /dev/null 2>&1; thenecho "❌ Docker未运行,请先启动Docker"exit 1
fi
echo "✅ Docker运行正常"
这段代码检查 Docker 是否已经启动。如果 Docker 没有运行,则提示用户启动 Docker。
5.6 清理旧数据(可选)
read -p "是否清理旧数据?(y/n): " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; thenecho "清理旧数据..."sudo rm -rf mysql/data/* redis/data/* es/data/*echo "✅ 数据清理完成"
fi
此部分代码询问用户是否要清理旧的数据(如 MySQL、Redis、Elasticsearch 等服务的数据)。如果用户确认,脚本会删除相关目录中的数据文件。
5.7 启动 MySQL 和 Redis 服务
echo "🚀 启动MySQL和Redis..."
docker compose up -d mysql redis
5.8 等待 MySQL 和 Redis 启动
# 等待MySQL启动
echo "⏳ 等待MySQL启动..."
sleep 10
# 检查MySQL是否健康
echo "🔍 检查MySQL健康状态..."
for i in {1..30}; doif docker compose exec mysql mysqladmin ping -h localhost --silent; thenecho "✅ MySQL启动成功"breakfiecho "⏳ 等待MySQL启动... ($i/30)"sleep 10
done
5.9 查询所有服务
[root@iv-ye20h65dz45i3z346rvs /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5601964e9cf4 apacherocketmq/rocketmq-dashboard:latest "sh -c 'java $JAVA_O…" 3 hours ago Up 3 hours 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp rocketmq-dashboard
c2a92e11947b apache/rocketmq:5.2.0 "./docker-entrypoint…" 3 hours ago Up 3 hours 0.0.0.0:10909->10909/tcp, :::10909->10909/tcp, 9876/tcp, 0.0.0.0:10911-10912->10911-10912/tcp, :::10911-10912->10911-10912/tcp rmqbroker
aeb3770cc3c6 apache/rocketmq:5.2.0 "./docker-entrypoint…" 3 hours ago Up 3 hours 10909/tcp, 0.0.0.0:9876->9876/tcp, :::9876->9876/tcp, 10911-10912/tcp rmqnamesrv
799332d61cf4 xuxueli/xxl-job-admin:2.4.1 "sh -c 'java -jar $J…" 3 hours ago Up 3 hours 0.0.0.0:8082->8080/tcp, 0.0.0.0:23333->8080/tcp, :::8082->8080/tcp, :::23333->8080/tcp xxl-job
eb21af4b3950 seataio/seata-server:2.0.0 "/bin/bash /seata-se…" 3 hours ago Up 3 hours 0.0.0.0:7091->7091/tcp, :::7091->7091/tcp, 0.0.0.0:8091->8091/tcp, :::8091->8091/tcp seata-server
b967618b3e82 nacos/nacos-server:v2.5.1 "sh bin/docker-start…" 3 hours ago Up 3 hours 0.0.0.0:8848->8848/tcp, :::8848->8848/tcp, 0.0.0.0:9848->9848/tcp, :::9848->9848/tcp nacos
ddd1c89bf6f9 redis:latest "docker-entrypoint.s…" 3 hours ago Up 3 hours 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp redis
fa31290e7d98 mysql:8.4.1 "docker-entrypoint.s…" 3 hours ago Up 3 hours (healthy) 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql-8
🧾 每列字段含义
字段 | 说明 |
---|---|
CONTAINER ID | 容器的唯一 ID(短格式) |
IMAGE | 容器所用的镜像名称 |
COMMAND | 容器启动时执行的命令 |
CREATED | 容器创建的时间 |
STATUS | 当前状态(Up 表示运行中) |
PORTS | 端口映射(主机端口 -> 容器端口) |
NAMES | 容器名称(你运行时指定的 or 自动生成) |
5.10 查询所有端口的占用
[root@iv-ye20h65dz45i3z346rvs /]# netstat -tuln
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:10912 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:23333 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:8848 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:8082 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:7091 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:9876 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:9848 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:8091 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:10909 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:10911 0.0.0.0:* LISTEN
tcp6 0 0 :::10912 :::* LISTEN
tcp6 0 0 :::23333 :::* LISTEN
tcp6 0 0 :::3306 :::* LISTEN
tcp6 0 0 :::6379 :::* LISTEN
tcp6 0 0 :::8080 :::* LISTEN
tcp6 0 0 :::8848 :::* LISTEN
tcp6 0 0 :::8082 :::* LISTEN
tcp6 0 0 :::7091 :::* LISTEN
tcp6 0 0 :::9876 :::* LISTEN
tcp6 0 0 :::22 :::* LISTEN
tcp6 0 0 :::9848 :::* LISTEN
tcp6 0 0 ::1:25 :::* LISTEN
tcp6 0 0 :::8091 :::* LISTEN
tcp6 0 0 :::10909 :::* LISTEN
tcp6 0 0 :::10911 :::* LISTEN
udp 0 0 0.0.0.0:68 0.0.0.0:*
udp 0 0 127.0.0.1:323 0.0.0.0:*
udp6 0 0 ::1:323 :::*
关键端口解释
字段 | 含义说明 |
---|---|
Proto | 协议类型(如 TCP、UDP、TCP6、UDP6) |
Recv-Q | 接收队列(排队接收的数据字节数) |
Send-Q | 发送队列(排队发送的数据字节数) |
Local Address | 本地监听的 IP:端口 |
Foreign Address | 对端地址(监听时一般为 * ,表示任何客户端) |
State | 状态,LISTEN 表示正在监听(TCP 特有) |
端口 | 协议 | 含义 |
---|---|---|
8080 | TCP | 常见 Web 服务端口,Spring Boot / Tomcat 默认端口 |
3306 | TCP | MySQL 数据库 |
6379 | TCP | Redis 默认端口 |
8848 | TCP | Nacos 默认端口 |
9876 | TCP | RocketMQ NameServer |
10911 , 10909 , 10912 | TCP | RocketMQ Broker 相关端口 |
68 | UDP | DHCP 客户端 |
323 | UDP | NTP 服务用于时间同步 |
25 | TCP | 本地邮件传输协议(SMTP)监听 localhost |
22 | TCP | SSH 登录服务 |
8091 , 8082 , 7091 , 23333 | TCP | 自定义服务端口(例如 Java 项目、微服务、监控面板等) |
netstat -tuln
- -t:显示 TCP 连接。
- -u:显示 UDP 连接。
- -l:只显示在监听状态的端口。
- -n:显示数字格式的地址和端口(避免进行 DNS 查找)。
5.11 查看某个端口是否被占用
netstat -tuln | grep :8080
[root@iv-ye20h65dz45i3z346rvs /]# netstat -tuln | grep :8080
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN
tcp6 0 0 :::8080 :::* LISTEN
逐字段解释
字段 | 含义说明 |
---|---|
tcp / tcp6 | 表示该端口使用的是 TCP 协议(tcp6 表示支持 IPv6) |
0 0 | 当前连接的接收/发送队列长度(都为 0 表示无等待连接) |
0.0.0.0:8080 | 监听 IPv4 上的所有网卡地址的 8080 端口 |
:::8080 | 监听 IPv6 上的所有网卡地址的 8080 端口 |
0.0.0.0:* 或 :::* | 允许来自任意地址、任意端口的连接请求 |
LISTEN | 表示当前处于监听状态(服务已启动,正在等待客户端连接) |
说明总结:
✅ 当前系统上有服务(你的 Java 项目)在 监听 8080 端口。
✅ 使用的是 TCP 协议(见首列是 tcp 和 tcp6)。
✅ 监听地址为 0.0.0.0 和 ::(IPv6),表示接受来自任何 IP 的请求。