docker 部署nacos1.4.7

  • 一、docker環境
  • 二、下載nacos-server:1.4.8
  • 三、在nacos目錄中新建DockerFile
  • 五、問題:運行後,容器直接不啓動

一、docker環境

1、docker鏡像源

手把手教你Docker部署Nacos_JAVA

{
  "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 目錄:

手把手教你Docker部署Nacos_JAVA_02

三、在nacos目錄中新建DockerFile

# 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目錄下構建:

docker build -t nacos-server:1.4.8 .

4、查看

docker images | grep nacos-server
# 輸出示例:nacos-server  1.4.8  鏡像ID  幾分鐘前  500MB左右

手把手教你Docker部署Nacos_#容器_03


四、運行 Nacos 容器

1、單機模式運行(掛載目錄需要自行修改):

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運行(掛載在本地):

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

五、問題:運行後,容器直接不啓動

手把手教你Docker部署Nacos_JAVA_04


解決:

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

查看日誌:發現日誌是正常輸出的

手把手教你Docker部署Nacos_docker_05


瀏覽器訪問http://localhost:8848/nacos

手把手教你Docker部署Nacos_#docker_06


nacos正常啓動;

但是exit; 退出後容器就立即退出了,説明:

交互模式(-it)啓動時,你手動執行了 startup.sh,但腳本是「前台運行」的;當你退出容器終端(exit)時,前台進程被終止,容器隨之停止(Docker 容器的生命週期與前台進程綁定,前台進程退出,容器就會停止)。
而之前的後台啓動命令(-d)之所以失敗,是因為 startup.sh 腳本默認會「後台運行 Nacos」(腳本內部會 fork 子進程),導致容器的前台進程退出,容器直接停止(相當於 “啓動完就跑路”)。

修復:

打開 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鏡像,然後運行

# 刪除原有
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

啓動成功:

手把手教你Docker部署Nacos_docker_07


訪問頁面:http://localhost:8848/nacos,正常了

手把手教你Docker部署Nacos_#運維_08