docker run 即可獲得統一 JDK/Maven/Tomcat/Node 環境。.tar 內網傳輸,避開 Registry 帶寬限制。宿主機 (IDE + 源碼)
│ 掛載卷 -v /local/code:/app
▼
容器 (Ubuntu + JDK + Maven + Tomcat)
│ 端口映射 -p 8080:8080
▼
瀏覽器訪問 localhost:8080
# 1. 拉取基礎鏡像
docker pull ubuntu:22.04
# 2. 進入容器安裝工具鏈
docker run -it --name java-dev-base ubuntu:22.04 bash
# 容器內執行:
apt-get update && apt-get install -y openjdk-17-jdk maven git vim curl
# 配置環境變量(寫入 /etc/profile)
echo 'export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64' >> /etc/profile
echo 'export MAVEN_HOME=/opt/maven' >> /etc/profile
echo 'export PATH=$JAVA_HOME/bin:$MAVEN_HOME/bin:$PATH' >> /etc/profile
source /etc/profile
# 3. 安裝 Tomcat 9
cd /opt && wget https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.85/bin/apache-tomcat-9.0.85.tar.gz
tar -xzf apache-tomcat-9.0.85.tar.gz && ln -s apache-tomcat-9.0.85 tomcat
# 4. 提交為新鏡像
exit # 退出容器
docker commit java-dev-base myorg/java-dev:1.0
docker rm java-dev-base
docker run -it -d \
--name java-dev \
-v /Users/name/workspace:/app \
-v /Users/name/.m2:/root/.m2 \ # 緩存 Maven 本地倉庫
-p 8080:8080 \
myorg/java-dev:1.0 \
bash
進入容器:docker exec -it java-dev bash
dev.sh(放入專案根目錄)#!/bin/bash
# 用法:./dev.sh -y # 全量更新依賴並啟動
# ./dev.sh -p # 快速打包啟動
# ./dev.sh -r # 僅重啟 Tomcat
# ./dev.sh -c # 僅編譯 Java 類熱加載
# ./dev.sh -w # 監聽 VM 模板文件自動同步
# ./dev.sh -l # 尾部追蹤 catalina.out
set -e
DEV_PROFILE="local"
WAR_SOURCE="/app/target/*.war"
TOMCAT_HOME="/opt/tomcat"
WEBAPPS="$TOMCAT_HOME/webapps"
WT=5 # 監聽間隔秒
newwar() {
rm -rf "$WEBAPPS"/*
mv $WAR_SOURCE "$WEBAPPS/ROOT.war"
}
restart_tomcat() {
killall -9 java 2>/dev/null || true
"$TOMCAT_HOME/bin/startup.sh"
tail -f "$TOMCAT_HOME/logs/catalina.out"
}
sync_vm() {
watch -n $WT cp -r /app/src/main/webapp/WEB-INF/tpl/* "$WEBAPPS/ROOT/WEB-INF/tpl/"
}
sync_java() {
cp -r /app/target/classes/* "$WEBAPPS/ROOT/WEB-INF/classes/"
}
case "$1" in
-y) mvn clean install -U -P$DEV_PROFILE -DskipTests && newwar && restart_tomcat ;;
-p) mvn clean package -P$DEV_PROFILE -DskipTests && newwar && restart_tomcat ;;
-r) restart_tomcat ;;
-c) mvn clean compile -P$DEV_PROFILE -DskipTests && sync_java && restart_tomcat ;;
-w) sync_vm ;;
-l) tail -f "$TOMCAT_HOME/logs/catalina.out" ;;
*) echo "Usage: $0 {-y|-p|-r|-c|-w|-l}" ;;
esac
容器內執行:chmod +x dev.sh && ./dev.sh -y
# 導出鏡像(約 1.2GB)
docker save myorg/java-dev:1.0 -o java-dev-1.0.tar
# 內網傳輸(AirDrop/共享目錄/USB)
# 同事機器導入
docker load -i java-dev-1.0.tar
# 驗證
docker images | grep java-dev
將 dev.sh 放入專案 Git 倉庫,新成員 git clone → docker load → docker run -v ... → ./dev.sh -y 三分鐘上手。
| 現象 | 原因 | 解決 |
|---|---|---|
| 容器啟動即退出 | 無前台進程 | docker run -it -d ... bash 保持交互式 |
| 宿主機無法訪問 8080 | 防火牆/端口映射錯誤 | 確認 -p 8080:8080、宿主機防火牆放行 |
| Maven 下載極慢 | 無鏡像源 | 掛載宿主機 ~/.m2 或鏡像內配置阿里云 settings.xml |
| 熱加載不生效 | Tomcat 未啟用 reloadable | Context reloadable="true" 或用 JRebel/Spring Loaded |