**阿里云轻量服务器从零搭建Docker私有仓库及Java项目部署全流程指南**前言最近入手了一台阿里云轻量应用服务器2核1G华南1深圳节点打算用来做Java项目测试和Docker镜像私有仓库。整个搭建过程踩了不少坑特此记录下来希望能帮到有类似需求的朋友。适用场景个人开发者测试Java项目搭建私有Docker Registry学习Linux Docker基础操作将Spring Boot项目打包成Docker镜像并推送到私有仓库服务器配置规格2核 1GB内存 30GB系统盘镜像宝塔Linux面板阿里云专享版 11.1.0地域华南1深圳系统Alibaba Cloud LinuxCentOS系本文操作环境本地开发Windows 11 IDEA 2024.3项目框架Spring Boot 2.7.x Maven 多模块项目Docker版本26.x一、服务器初始化1.1 购买与初始设置在阿里云控制台购买轻量应用服务器选择宝塔Linux面板镜像省去手动装环境的麻烦。创建实例后务必重置密码初始没有密码。等待实例状态变为“运行中”。1.2 获取宝塔面板登录信息服务器启动后通过阿里云自带的Workbench远程连接登录登录后执行以下命令获取宝塔面板的初始账号密码bt default系统会输出类似这样的信息外网面板地址: http://120.79.27.205:8888/xxxxxx内网面板地址: http://172.17.63.129:8888/xxxxxxusername: xxxxxxxpassword: xxxxxxx1.3 登录宝塔面板并安装Docker浏览器访问 http://你的公网IP:8888/xxxxxx 登录宝塔面板。首次登录会弹出初始化推荐配置窗口。点击顶部 Docker 标签页只保留勾选Docker服务取消MySQL、Nginx等其他选项节省内存。安装方式选 极速安装点击一键安装。等待约5~10分钟Docker安装完成。⚠️ 注意如果你的面板初始化界面已关闭可以直接在左侧“软件商店”中搜索“Docker”手动安装。二、Docker环境配置2.1 解决Docker启动失败问题避坑指南宝塔安装的Docker有时候会因为配置问题启动失败最常见的原因是 /etc/docker/daemon.json 格式错误。检查Docker状态systemctl statusdocker如果启动失败检查配置文件cat/etc/docker/daemon.json正确的配置文件格式注意逗号{registry-mirrors:[https://docker.m.daocloud.io,https://docker.1panel.live],insecure-registries:[120.79.27.205:5000]} 关键避坑“registry-mirrors” 行末尾必须有逗号否则JSON解析失败Docker无法启动。修复后重启Dockersystemctl daemon-reload systemctl restartdocker2.2 验证Docker是否正常dockerversiondockerinfo|grep-A5Registry Mirrors如果能正常输出版本信息且能看到配置的镜像加速地址说明Docker配置成功。三、部署MariaDB轻量级数据库为什么不用MySQL1GB内存跑MySQL占用300~500MB太吃力MariaDB 10.5 仅占150~200MB更省资源。3.1 启动MariaDB容器要运行的话自己修一下斜杠去掉缩减到同一行记得留空格其他同理dockerrun-d\--namemariadb\-m300m\-p3306:3306\-eMYSQL_ROOT_PASSWORDLhy001118\--restartalways\mariadb:10.5参数解释-d后台运行–name mariadb容器名称-m 300m内存限制为300MB-p 3306:3306宿主机3306端口映射到容器3306端口-e MYSQL_ROOT_PASSWORDxxx设置root密码–restartalwaysDocker启动时自动重启容器3.2 验证MariaDB是否正常运行查看容器状态dockerps|grepmariadb测试数据库连接dockerexec-itmariadb mysql-uroot-pLhy001118-eSHOW DATABASES;如果输出能看到 mysql、sys 等默认数据库列表说明部署成功。四、搭建Docker Registry私有仓库4.1 启动Registry服务dockerrun-d\--nameregistry\-m100m\-p5000:5000\--restartalways\-v/mnt/registry:/var/lib/registry\registry:2参数解释-v /mnt/registry:/var/lib/registry将容器内的镜像数据持久化到宿主机 /mnt/registry 目录防止容器删除后数据丢失。4.2 验证Registry是否正常运行查看容器状态dockerps|grepregistry访问仓库API空仓库会返回空列表curlhttp://localhost:5000/v2/_catalog预期返回{“repositories”:[]}4.3 开放防火墙端口在阿里云轻量服务器控制台 → 防火墙中添加规则端口 协议 用途5000 TCP Docker Registry3306 TCP MariaDB如需远程连接8080 TCP Java应用后续部署用五、推送测试镜像到私有仓库5.1 拉取测试镜像dockerpull nginx:latest5.2 给镜像打标签dockertag nginx:latest120.79.27.205:5000/my-nginx:v1格式要求[仓库地址]/[项目名]/[镜像名]:[标签]5.3 推送镜像dockerpush120.79.27.205:5000/my-nginx:v15.4 验证推送结果curl-XGET http://120.79.27.205:5000/v2/_catalog预期返回{“repositories”:[“my-nginx”]}查看指定镜像的版本列表curlhttp://120.79.27.205:5000/v2/my-nginx/tags/list预期返回{“name”:“my-nginx”,“tags”:[“v1”]}六、Java项目打包并推送镜像实战核心6.1 项目结构说明以下是一个典型的多模块Maven项目结构com-hippo-net/ # 项目根目录├── Dockerfile # Docker构建文件放在根目录├── pom.xml # 父POM├── com-hippo-net-common/ # 公共模块工具类无main方法├── com-hippo-net-base/ # 基础模块├── com-hippo-net-gateway/ # 网关模块有main方法可独立运行✅├── com-hippo-net-business/ # 业务模块└── com-hippo-net-starter/ # 启动模块有main方法可独立运行✅ 关键点只有包含 SpringBootApplication 和 main 方法的模块才能独立运行如 gateway 和 starter。6.2 本地打包在IDEA中执行Maven打包命令mvn clean package-DskipTests或者在IDEA右侧Maven面板中依次点击 clean → package。打包完成后各模块的jar包位于com-hippo-net-gateway/target/com-hippo-net-gateway-1.0.0-SNAPSHOT.jar com-hippo-net-starter/target/com-hippo-net-starter-1.0.0-SNAPSHOT.jar6.3 上传jar包到服务器在服务器上创建应用目录mkdir-p/opt/myappcd/opt/myapp方式一使用scp命令上传在本地Windows PowerShell中执行scpF:/software/project/self/com-hippo-net/com-hippo-net-gateway/target/com-hippo-net-gateway-1.0.0-SNAPSHOT.jar root120.79.27.205:/opt/myapp/方式二使用宝塔面板上传在宝塔面板的“文件”管理中进入 /opt/myapp 目录点击“上传”选择本地的jar包上传即可。6.4 编写Dockerfile在 /opt/myapp 目录下创建 Dockerfiledockerfile FROM openjdk:8-jre-alpine WORKDIR /app COPY com-hippo-net-gateway-1.0.0-SNAPSHOT.jar /app/app.jar EXPOSE8080ENTRYPOINT[java,-jar,app.jar]Dockerfile指令解释指令 含义FROM openjdk:8-jre-alpine 基于极轻量的JDK 8镜像约85MBWORKDIR /app 设置容器内工作目录COPY xxx.jar /app/app.jar 将jar包复制到容器并重命名为app.jarEXPOSE 8080 声明容器监听8080端口ENTRYPOINT [“java”, “-jar”, “app.jar”] 容器启动时执行的命令6.5 构建镜像dockerbuild-t120.79.27.205:5000/my-gateway:v1.0.my-gateway 是镜像名可以随意取v1.0 是版本标签建议使用语义化版本号。6.6 推送镜像到私有仓库dockerpush120.79.27.205:5000/my-gateway:v1.06.7 验证推送结果查看仓库所有镜像curlhttp://120.79.27.205:5000/v2/_catalog查看my-gateway的所有版本curlhttp://120.79.27.205:5000/v2/my-gateway/tags/list七、在服务器上运行Java应用7.1 拉取并运行运行容器dockerrun-d\--namemy-gateway\-p8080:8080\--restartalways\120.79.27.205:5000/my-gateway:v1.0查看运行状态dockerps查看应用日志dockerlogs-fmy-gateway7.2 访问测试在浏览器中访问 http://120.79.27.205:8080/你的接口路径如果能正常返回数据说明部署成功7.3 版本更新流程当代码有更新时按以下步骤操作1. 本地重新打包mvn clean package-DskipTests2. 上传新jar包覆盖旧文件3. 构建新版本镜像dockerbuild-t120.79.27.205:5000/my-gateway:v1.1.4. 推送新版本dockerpush120.79.27.205:5000/my-gateway:v1.15. 停止并删除旧容器dockerstop my-gatewaydockerrmmy-gateway6. 运行新版本dockerrun-d--namemy-gateway-p8080:8080120.79.27.205:5000/my-gateway:v1.1八、常用管理命令速查Docker容器管理查看运行中的容器dockerps查看所有容器含已停止dockerps-a查看容器日志dockerlogs--tail100my-gatewaydockerlogs-fmy-gateway# 实时跟踪日志停止/启动/重启容器dockerstop my-gatewaydockerstart my-gatewaydockerrestart my-gateway删除容器dockerrm-fmy-gateway进入容器内部dockerexec-itmy-gatewayshDocker镜像管理查看本地镜像列表dockerimages删除本地镜像dockerrmi120.79.27.205:5000/my-gateway:v1.0清理无用镜像和容器dockersystem prune-aRegistry仓库管理bash查看所有镜像仓库curlhttp://120.79.27.205:5000/v2/_catalog查看指定仓库的标签列表curlhttp://120.79.27.205:5000/v2/my-gateway/tags/list查看镜像manifest信息curlhttp://120.79.27.205:5000/v2/my-gateway/manifests/v1.0九、踩坑总结问题 原因 解决方案Docker无法启动 /etc/docker/daemon.json 格式错误漏逗号 修正JSON格式systemctl restart dockerpermission denied 用admin用户操作Docker 切换su - root或将用户加入docker组拉取镜像超时 Docker Hub被墙或速度慢 配置国内镜像加速器推送报HTTP错误 Docker默认要求HTTPS 配置insecure-registries信任HTTP地址no such file or directory Dockerfile中COPY的路径不存在 确认jar包已上传且路径正确内存不足导致容器被杀 1GB跑MySQLJavaRegistry 限制容器内存(-m)或临时启用Swapcommon模块无法启动 没有main方法 换成有main方法的模块如gateway/starter十、性能优化建议针对 1GB内存 的服务器开启Swap交换分区在宝塔“软件商店”安装Linux工具箱添加2GB Swap防止内存爆掉。或手动创建Swapddif/dev/zeroof/swapfilebs1Mcount2048chmod600/swapfilemkswap/swapfileswapon/swapfileecho/swapfile none swap sw 0 0/etc/fstab限制容器内存启动时始终加上 -m 参数。docker run -d --name my-gateway -m 400m -p 8080:8080 xxx按需启动服务不需要时用 docker stop 关闭MariaDB节省内存给Java项目测试。使用轻量级基础镜像openjdk:8-jre-alpine 比标准 openjdk:8 小约300MB。考虑云数据库长期使用建议购买阿里云RDS有免费试用把数据库迁到云端。十一、后续扩展思路配置Registry密码认证为私有仓库添加HTTP Basic认证提升安全性搭建Harbor企业级镜像仓库功能更强大但需更高配置配置GitLab CI/CD自动化构建并推送镜像到私有仓库编写docker-compose.yml一键启动所有服务MariaDB Registry Java应用配置Nginx反向代理为Registry配置域名和HTTPS证书docker-compose.yml示例yamlversion:3services:mariadb:image:mariadb:10.5container_name:mariadbrestart:alwaysports:-3306:3306environment:MYSQL_ROOT_PASSWORD:Lhy001118mem_limit:300mregistry:image:registry:2container_name:registryrestart:alwaysports:-5000:5000volumes:-/mnt/registry:/var/lib/registrymem_limit:100mgateway:image:120.79.27.205:5000/my-gateway:v1.0container_name:my-gatewayrestart:alwaysports:-8080:8080mem_limit:400m使用方式docker-composeup-d# 启动所有服务docker-composedown# 停止所有服务结语从一台新购买的阿里云轻量服务器到完整可用的Docker私有仓库再到Java项目镜像的构建与推送整个过程大约需要60~90分钟。虽然中间踩了不少坑特别是daemon.json格式问题、网络超时、jar包路径问题但最终跑通的那一刻还是挺有成就感的。希望这篇指南能帮你少走一些弯路。附录一键验证脚本部署完成后执行以下脚本快速验证所有服务状态echo “ 容器运行状态 ”dockerps|grep-Emariadb|registry|my-gatewayecho “ 端口监听状态 ”netstat-tlnp|grep-E3306|5000|8080echo “ Registry镜像列表 ”curl-shttp://localhost:5000/v2/_catalog|python3-mjson.tool2/dev/null||curl-shttp://localhost:5000/v2/_catalogecho “ MariaDB连接测试 ”dockerexecmariadb mysql-uroot-pLhy001118-eSHOW DATABASES;2/dev/null|grep-qmysqlecho✅ MariaDB 正常||echo❌ MariaDB 连接失败