docker 部署nacos1.4.7
一、docker环境
1、docker镜像源

powershell
{
"builder": {
"gc": {
"defaultKeepStorage": "20GB",
"enabled": true
}
},
"experimental": false,
"registry-mirrors": [
"https://docker.1panel.live",
"https://dockerhub.icu",
"https://docker.aws19527.cn",
"https://docker.anyhub.us.kg",
"https://docker.m.daocloud.io"
]
}
二、下载nacos-server:1.4.8
地址:https://codeload.github.com/alibaba/nacos/zip/refs/tags/1.4.8
目录:

三、在nacos目录中新建DockerFile
powershell
# 1. 基础镜像:使用 Java 8(Nacos 1.4.8 依赖 JDK 8,推荐 openjdk:8-jre-slim 轻量版)
FROM openjdk:8-jre-slim
# 2. 维护者信息(可选)
# LABEL maintainer="your-name <your-email>"
LABEL version="1.4.8"
LABEL description="Nacos-Server 1.4.8 自定义镜像"
# 3. 安装必要依赖(可选,解决 startup.sh 可能的执行问题)
RUN apt-get update && apt-get install -y --no-install-recommends \
bash \
curl \
&& rm -rf /var/lib/apt/lists/*
# 4. 创建 Nacos 工作目录
WORKDIR /home/nacos
# 5. 复制本地文件到镜像中
# 复制 bin 目录(启动脚本)
COPY bin/ ./bin/
# 复制 conf 目录(配置文件)
COPY conf/ ./conf/
# 复制 target 目录(核心 JAR 包)
COPY target/ ./target/
# 复制 data 和 logs 目录(可选,镜像中可空,运行时挂载宿主机目录)
COPY data/ ./data/
COPY logs/ ./logs/
# 6. 给启动脚本添加执行权限(关键:避免启动时权限不足)
RUN chmod +x ./bin/startup.sh
# 7. 配置环境变量(可选,用于 startup.sh 读取,如 JVM 参数、Nacos 模式等)
# 示例:设置 JVM 堆内存(根据实际需求调整)
ENV JAVA_OPTS="-Xms512m -Xmx1024m"
# 示例:设置 Nacos 启动模式(standalone 单机模式,cluster 集群模式,默认单机)
ENV MODE="standalone"
# 示例:设置 Nacos 端口(默认 8848,需与 application.properties 一致)
ENV NACOS_PORT="8848"
# 8. 暴露 Nacos 端口(默认 8848,若配置文件改了端口,需同步修改)
EXPOSE 8848
# 9. 启动命令(关键:执行 startup.sh,指定单机模式)
# 注:startup.sh 已支持通过 MODE 环境变量指定模式,无需在命令后加 -m standalone
CMD ["./bin/startup.sh"]
3、在nacos目录下构建:
powershell
docker build -t nacos-server:1.4.8 .
4、查看
powershell
docker images | grep nacos-server
# 输出示例:nacos-server 1.4.8 镜像ID 几分钟前 500MB左右

四、运行 Nacos 容器
1、单机模式运行(挂载目录需要自行修改):
powershell
docker run -d \
--name nacos-1.4.8 \
-p 8848:8848 \
-v /path/to/your/nacos/data:/home/nacos/data \ # 挂载数据目录(持久化)
-v /path/to/your/nacos/logs:/home/nacos/logs \ # 挂载日志目录(方便查看)
-e MODE=standalone \
-e JAVA_OPTS="-Xms512m -Xmx1024m" \ # 可选:调整JVM内存
nacos-server:1.4.8
windows运行(挂载在本地):
powershell
docker run -d --name nacos-1.4.8 --restart=always -p 8848:8848 -v D://work/xinchao-projects/my/nacos-server-1.4.8/nacos/data:/home/nacos/data -v D://work/xinchao-projects/my/nacos-server-1.4.8/nacos/logs:/home/nacos/logs nacos-server:1.4.8 ./bin/startup.sh -m standalone
Mac运行(挂载到本地):
docker run -d --name nacos-1.4.8 --restart=always -p 8848:8848 -v /Users/tangyuan/work/java-projects/my-projects/nacos-server-1.4.8/nacos/data -v /Users/tangyuan/work/java-projects/my-projects/nacos-server-1.4.8/nacos/logs nacos-server:1.4.8 ./bin/startup.sh -m standalone
五、问题:运行后,容器直接不启动

解决:
powershell
1、容器没有启动,也进不去,所以采用交互模式启动容器
# 停止并删除旧测试容器
docker stop nacos-test && docker rm nacos-test
# 交互模式启动容器(进入 bash 终端)
docker run -it --name nacos-test -p 8848:8848 -e MODE=standalone nacos-server:1.4.8 /bin/bash
在容器终端内手动执行 startup.sh:进入容器后,直接执行启动脚本,观察实时输出(此时会直接打印报错,而非写入日志):
# 进入容器后,执行以下命令
cd /home/nacos
./bin/startup.sh -m standalone
查看日志:发现日志是正常输出的

浏览器访问http://localhost:8848/nacos

nacos正常启动;
但是exit; 退出后容器就立即退出了,说明:
powershell
交互模式(-it)启动时,你手动执行了 startup.sh,但脚本是「前台运行」的;当你退出容器终端(exit)时,前台进程被终止,容器随之停止(Docker 容器的生命周期与前台进程绑定,前台进程退出,容器就会停止)。
而之前的后台启动命令(-d)之所以失败,是因为 startup.sh 脚本默认会「后台运行 Nacos」(脚本内部会 fork 子进程),导致容器的前台进程退出,容器直接停止(相当于 "启动完就跑路")。
修复:
powershell
打开 startup.sh,搜索以下内容(Nacos 1.4.8 脚本关键代码):
bash
运行
# 原脚本中启动 JVM 的命令(大概在 260 行左右,不同版本行数可能略有差异)
nohup $JAVA -Dserver.port=${PORT} $JAVA_OPTS $NACOS_OPTS -jar ${BASE_DIR}/target/${JAR_NAME} $OPT_PARAMS > ${BASE_DIR}/logs/start.out 2>&1 &
删除 nohup 和末尾的 &(这两个是让脚本后台运行的关键),修改后如下:
bash
运行
# 修改后的前台启动命令(删除 nohup 和末尾的 &)
$JAVA -Dserver.port=${PORT} $JAVA_OPTS $NACOS_OPTS -jar ${BASE_DIR}/target/${JAR_NAME} $OPT_PARAMS > ${BASE_DIR}/logs/start.out 2>&1
说明:nohup 是 "忽略挂起信号",& 是 "后台运行",删除后 JVM 会以前台进程运行,容器会一直存活(容器生命周期与 JVM 进程绑定)。
保存脚本,确保本地脚本已更新(若之前替换过官方脚本,需重新修改)。
重新build镜像,然后运行
powershell
# 删除原有
docker rmi -f nacos-server:1.4.8
# 进入nacos目录下 重新构建镜像
docker build -t nacos-server:1.4.8 .
# 启动(这里把日志挂载到了我本地的磁盘):
docker run -d --name nacos-1.4.8 -p 8848:8848 -v D://work/xinchao-projects/my/nacos-server-1.4.8/nacos/data:/home/nacos/data -v D://work/xinchao-projects/my/nacos-server-1.4.8/nacos/logs:/home/nacos/logs nacos-server:1.4.8 ./bin/startup.sh -m standalone
启动成功:

