#!/bin/bash
set -e
BASE_DIR="/data/docker/web"
NGINX_DIR="${BASE_DIR}/nginx"
TOMCAT_DIR="${BASE_DIR}/tomcat"
echo "========================================"
echo " Nginx + Tomcat 目录初始化脚本"
echo "========================================"
# 检查 Docker
if ! command -v docker &> /dev/null; then
echo "❌ 错误:未检测到 Docker,请先安装 Docker"
exit 1
fi
echo "✅ Docker 已就绪"
# 1. 创建本地目录
echo ""
echo "📁 创建本地目录..."
sudo mkdir -p ${NGINX_DIR}/{conf.d,html,ssl,logs}
sudo mkdir -p ${TOMCAT_DIR}/{conf,webapps,logs}
echo " ${NGINX_DIR}/conf.d"
echo " ${NGINX_DIR}/html"
echo " ${NGINX_DIR}/ssl"
echo " ${NGINX_DIR}/logs"
echo " ${TOMCAT_DIR}/conf"
echo " ${TOMCAT_DIR}/webapps"
echo " ${TOMCAT_DIR}/logs"
# 2. 启动临时 Nginx 容器复制默认文件
echo ""
echo "🐳 正在从 nginx:alpine 提取默认文件..."
docker run --rm -d --name nginx-init-temp nginx:alpine sleep 5 >/dev/null 2>&1 || true
sleep 2
# 确保 ssl 目录存在(nginx 镜像默认没有)
docker exec nginx-init-temp mkdir -p /etc/nginx/ssl 2>/dev/null || true
docker cp nginx-init-temp:/etc/nginx/conf.d/. ${NGINX_DIR}/conf.d/ 2>/dev/null || true
docker cp nginx-init-temp:/usr/share/nginx/html/. ${NGINX_DIR}/html/ 2>/dev/null || true
docker cp nginx-init-temp:/etc/nginx/ssl/. ${NGINX_DIR}/ssl/ 2>/dev/null || true
docker cp nginx-init-temp:/var/log/nginx/. ${NGINX_DIR}/logs/ 2>/dev/null || true
docker stop nginx-init-temp >/dev/null 2>&1 || true
echo " ✅ Nginx 默认文件已复制"
# 3. 启动临时 Tomcat 容器复制默认文件
echo ""
echo "🐳 正在从 tomcat:9-jdk8-temurin 提取默认文件..."
docker run --rm -d --name tomcat-init-temp tomcat:9-jdk8-temurin >/dev/null 2>&1 || true
sleep 3
docker cp tomcat-init-temp:/usr/local/tomcat/conf/. ${TOMCAT_DIR}/conf/ 2>/dev/null || true
docker cp tomcat-init-temp:/usr/local/tomcat/webapps/. ${TOMCAT_DIR}/webapps/ 2>/dev/null || true
docker cp tomcat-init-temp:/usr/local/tomcat/logs/. ${TOMCAT_DIR}/logs/ 2>/dev/null || true
docker stop tomcat-init-temp >/dev/null 2>&1 || true
echo " ✅ Tomcat 默认文件已复制"
# 4. 修正权限(方便宿主机用户直接编辑)
echo ""
echo "🔧 修正目录权限为当前用户..."
sudo chown -R $(id -u):$(id -g) ${BASE_DIR}
echo " ✅ 权限已修正"
# 5. 输出结果
echo ""
echo "========================================"
echo " 🎉 初始化完成!目录结构如下:"
echo "========================================"
find ${BASE_DIR} -maxdepth 3 -type f | head -20 | sed 's/^/ /'
echo ""
echo "📋 下一步:"
echo " 1. 编辑 ${NGINX_DIR}/conf.d/default.conf 配置反向代理"
echo " 2. 把你的 .war 包放入 ${TOMCAT_DIR}/webapps/"
echo " 3. 在该目录创建 docker-compose.yml 并执行 docker compose up -d"
echo ""
echo "💡 提示:容器将以 root (user: \"0:0\") 运行,无需担心权限问题"# 保存脚本
cat > init.sh << 'EOF'
# 上面整个脚本内容粘贴到这里
EOF
# 赋权并执行
chmod +x setup.sh
./setup.sh/data/docker/web/
├── nginx/
│ ├── conf.d/
│ │ └── default.conf
│ ├── html/
│ │ └── index.html
│ ├── ssl/ # 空目录,放证书
│ └── logs/ # 空目录
└── tomcat/
├── conf/
│ ├── server.xml
│ └── ...
├── webapps/
│ ├── ROOT/
│ └── ...
└── logs/ # 空目录{/tabs-pane}
{tabs-pane label="nginx"}
1. 创建本地目录
sudo mkdir -p /data/docker/web/nginx/{conf.d,html,ssl,logs}2. 启动临时 nginx 容器(后台运行30秒,供复制文件)
docker run --rm -d --name nginx-temp nginx:alpine sleep 303. 在容器内创建 ssl 目录(nginx 镜像默认没有)
docker exec nginx-temp mkdir -p /etc/nginx/ssl4. 复制容器内文件到本地
docker cp nginx-temp:/etc/nginx/conf.d/. /data/docker/web/nginx/conf.d/
docker cp nginx-temp:/usr/share/nginx/html/. /data/docker/web/nginx/html/
docker cp nginx-temp:/etc/nginx/ssl/. /data/docker/web/nginx/ssl/
docker cp nginx-temp:/var/log/nginx/. /data/docker/web/nginx/logs/5. 停止容器(--rm 会自动删除)
docker stop nginx-temp6. 修正本地权限(可选。把目录所有权改回当前用户,方便后续编辑)
sudo chown -R $(id -u):$(id -g) /data/docker/web/nginx{/tabs-pane}
{tabs-pane label="Tomcat"}
1. 创建本地目录
sudo mkdir -p /data/docker/web/tomcat/{conf,webapps,logs}2. 启动临时 Tomcat 容器(前台运行,保持存活)
docker run --rm -d --name tomcat-temp tomcat:9-jdk8-temurin3. 复制容器内默认文件到本地
docker cp tomcat-temp:/usr/local/tomcat/conf/. /data/docker/web/tomcat/conf/
docker cp tomcat-temp:/usr/local/tomcat/webapps/. /data/docker/web/tomcat/webapps/
docker cp tomcat-temp:/usr/local/tomcat/logs/. /data/docker/web/tomcat/logs/4. 停止容器(--rm 自动删除)
docker stop tomcat-temp5. 修正权限
sudo chown -R $(id -u):$(id -g) /data/docker/web/tomcat加 user: "0:0" 用 root 跑,或sudo chown -R 1000:1000 /data/docker/web/tomcat/webapps /data/docker/web/tomcat/logs 把目录改成容器内 tomcat 用户的权限。
{/tabs-pane}
{tabs-pane label="创建网络"}
bridge 是 Docker 的默认网络名字,但它有两个硬伤:
1、默认 bridge 不支持容器互相通过名称解析(只能走 IP);
自定义 bridge(oracle_net)自带内嵌 DNS,容器之间 ping 容器名 直接通。
2、默认 bridge 在宿主机重启后不会自动重建你之前通过 docker run --net bridge ... 启动的容器网络配置;
而 compose 自己建的那个临时 bridge(ID 很长)重启会消失,于是出现 network not found。
把网络显式建出来并设成 external: true,相当于告诉 compose:
“这网我自己管,重启也在,你别删。”
docker network create 自定义名字
例如
docker network create web_network把正在跑的项目切到这个持久化网络即可,三步完成:
- 1、把 compose 文件末尾的 networks 段改成:
networks: --定义此服务要使用的网络。
web_network: --网络的名称(自定义的)
external: true --关键配置,表示这个网络是“外部的”
> Docker Compose 不会尝试创建这个网络;它会去查找 Docker 中已经存在的名为 web_network 的网络;如果找不到,启动时会报错。
networks:
web_network:
external: true- 2、给每个 service 显式指定网络(如果你之前已经写了 networks: - web_network 可跳过)
示例:
services:
nginx:
networks:
- web_network
tomcat:
networks:
- web_network- 3、重新应用
docker compose down # 停旧容器、清掉旧的“临时”网络
docker compose up -d # 用新的持久网络重新创建容器完成后验证:
docker network ls # 能看到 web_network
docker inspect web_network # 容器已挂进去
reboot # 宿主机重启
docker compose start # 不再报 “network not found”以后任何其他 compose 项目只要:
networks:
default:
external: true
name: web_network只要满足下面两点,就可以“容器名 + 端口”互相访问:
它们挂在同一个自定义 bridge 网络(这里就是 web_network);
目标容器监听了对应端口(EXPOSE 或 -p 都可以,不需要映射到宿主机)。
nginx 容器内部监听 80
tomcat 容器内部监听 8080
同一 web_network 下:
在 tomcat 容器里
curl http://nginx:80
在 nginx 容器里
curl http://tomcat:8080Docker 的内嵌 DNS 会把容器名自动解析成各自的内网 IP,所以跨容器通信无需再记 IP,也无需暴露宿主机端口。
{/tabs-pane}
{tabs-pane label="Docker"}
安装docker
官方安装脚本:
curl -fsSL https://get.docker.com | sh国内一键安装脚本:
bash <(curl -sSL https://emohe.cn/docker.sh)手动离线安装Docker
下载Docker:
• 官方文件下载地址:https://download.docker.com/linux/static/stable/x86_64/
• 清华大学下载地址 :https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/static/stable/x86_64/离线安装
1.确认系统架构
uname -m根据输出选择对应二进制包
{/timeline-item}
{timeline-item color="#f1f500"}
2.解压 Docker 并安装
tar xvf docker-27.3.1.tgz # 建议用新版本
cp -p docker/* /usr/bin/{/timeline-item}
{timeline-item color="#d0fa00"}
3.添加 containerd 服务(关键补充)
cat > /usr/lib/systemd/system/containerd.service << 'EOF'
[Unit]
Description=containerd container runtime
Documentation=https://containerd.io
After=network.target local-fs.target
[Service]
ExecStart=/usr/bin/containerd
Type=notify
Delegate=yes
KillMode=process
Restart=always
RestartSec=5
LimitNPROC=infinity
LimitCORE=infinity
LimitNOFILE=infinity
TasksMax=infinity
OOMScoreAdjust=-999
[Install]
WantedBy=multi-user.target
EOF{/timeline-item}
{timeline-item color="#73ff00"}
4.添加 docker 服务(优化版)
cat > /usr/lib/systemd/system/docker.service << 'EOF'
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service containerd.service
Wants=network-online.target
Requires=containerd.service
[Service]
Type=notify
ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=1048576
LimitNPROC=1048576
LimitCORE=1048576
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
EOF{/timeline-item}
{timeline-item color="#02f2aa"}
5.安装 Docker Compose
确认架构!这里以 x86_64 为例,ARM64 请替换文件名
cp docker-compose-linux-x86_64_v5.1.3 /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose建立软链,确保全局可用
ln -sf /usr/local/bin/docker-compose /usr/bin/docker-compose{/timeline-item}
{timeline-item color="#013ff9"}
6.启动并验证
systemctl daemon-reload
systemctl enable --now containerd
systemctl enable --now docker
# 验证
docker -v
docker-compose -v{/timeline-item}
{/tabs-pane}
{tabs-pane label="标签二"}
标签二内容
{/tabs-pane}
评论 (0)