Docker上云踩坑实录

发现一个好东西!爪子云给GitHub用户每月发5美元免费额度,正好把我写的SpringBoot项目搬到云上试试水。下面是完整的操作过程,从搭环境到填坑,再到把项目推上去,一步一步都写清楚啦~

一、前期准备:先整个Docker环境试试水

部署项目得先有Docker环境,第一步先去Docker官网下安装包就行。

我用的是Windows 11电脑,虽然早有耳闻Windows对Docker的适配不如Mac丝滑,但现在WSL 2都出好久了,应该能用吧?先试着在Windows上直接装装看~

踩坑1:Windows 11虚拟化开不了,Docker装不上!

结果刚装就翻车了,系统直接提示"虚拟平台未开启",安装失败😭。

一波三折的解决尝试:

  1. 先按Win+R打开运行框,输入optionalfestures.exe打开"Windows功能"窗口,勾选Hyper-V和"虚拟机平台"这两个选项保存。结果坑来了------"虚拟机平台"怎么勾都勾不上,关掉再打开还是没选中😓。
  1. 换个思路,用管理员身份打开PowerShell,试着用命令开,结果还是失败...
  1. 进BIOS看看,发现"Secure Virtual Machine Mode"(虚拟化模式)本来就是开着的;
  2. 怀疑是安卓模拟器占了资源,把所有模拟器都卸载了,问题还是没解决;
  3. 又试着用系统修复命令查问题,结果啥问题都没查到:
bash 复制代码
# 扫描并修复系统受损文件
sfc /scannow 

# 修复DISM组件缓存,解决系统组件异常问题
DISM /Online /Cleanup-Image /RestoreHealth
  1. 最后想更更新WSL试试,结果下载的安装包都打不开...

试了这么多办法都不行,放弃Windows了!直接用VMware装个Ubuntu虚拟机,在Linux环境里搞Docker部署~

二、Ubuntu虚拟机环境搭建:这次总该顺利了吧

步骤1:Ubuntu初始化配置

虚拟机装完Ubuntu,先更更新软件包,再装个vm-tools(不然复制命令、传文件都麻烦),命令直接抄下面的:

bash 复制代码
# 更新apt包索引,获取最新软件信息
sudo apt-get update 

# 升级已装的软件包,-y自动确认,不用手动点
sudo apt upgrade -y

# 装增强版VMware工具,支持复制粘贴、文件共享
sudo apt install open-vm-tools-desktop -y

# 重启虚拟机,让工具生效
sudo reboot

步骤2:在Ubuntu里装Docker Engine

直接用Docker官方的APT仓库装,这样版本最新,也不容易出依赖问题,跟着步骤来就行。

子步骤2.1:先配置Docker的APT仓库

  1. 先更新下apt索引,再装几个依赖包(让apt能通过HTTPS装软件):
bash 复制代码
# 更新apt包索引
sudo apt-get update

# 装三个必要依赖:验证HTTPS证书、网络请求、密钥管理
sudo apt-get install -y ca-certificates curl gnupg
  1. 添加Docker官方的GPG密钥(保证装的软件是正版的,没被篡改):
bash 复制代码
# 创建存放APT密钥的目录,设置好权限
sudo install -m 0755 -d /etc/apt/keyrings

# 下载Docker官方密钥,转成二进制格式存好
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# 给所有用户读密钥的权限
sudo chmod a+r /etc/apt/keyrings/docker.gpg
  1. 配置Docker仓库(注意:noble是Ubuntu 24.04的代号,你装的是其他版本就对应改一下):
bash 复制代码
# 把Docker仓库添加到APT源列表里
# arch=$(dpkg --print-architecture):自动识别系统架构(比如amd64、arm64)
# $(. /etc/os-release && echo "$VERSION_CODENAME"):自动识别Ubuntu版本代号
echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

子步骤2.2:安装Docker核心组件

仓库配置好,就可以装Docker主程序、容器运行时这些核心东西了:

bash 复制代码
# 再更一次apt索引,确保能拿到Docker最新的软件信息
sudo apt-get update

# 一次性装完核心组件:Docker引擎、命令行工具、容器运行时、构建插件、编排工具
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

子步骤2.3:验证下Docker装没装好

跑个官方的hello-world镜像试试水,能跑起来就没问题:

bash 复制代码
# 拉取hello-world测试镜像并运行
sudo docker run hello-world

如果看到"Hello from Docker!"这句话,说明Docker装好了,能正常用~

(可选)不用每次都输sudo:配置非root用户运行Docker

默认用Docker得加sudo,有点麻烦,配置一下让普通用户也能直接用:

bash 复制代码
# 创建docker用户组(如果已经有了就忽略)
sudo groupadd docker

# 把当前用户加入docker组($USER就是你当前登录的用户名)
sudo usermod -aG docker $USER

# 刷新用户组配置,不用注销重新登录就能生效
newgrp docker

# 再试一次,这次不用输sudo了
docker run hello-world

三、SpringBoot项目Docker打包+推送

步骤1:把项目传到虚拟机里

把本地的SpringBoot项目复制到Ubuntu虚拟机里,然后进入项目根目录(就是有Dockerfile的那个文件夹),打开终端准备操作。

步骤2:构建Docker镜像

bash 复制代码
# 构建Docker镜像
# -t 项目名:latest:给镜像起个名,latest表示最新版本
# .:指定Dockerfile在当前目录
docker build -t 项目名:latest .

步骤3:本地先跑起来试试

bash 复制代码
# 后台运行容器
# -d:后台跑,不占终端
# --name 项目名:给容器起个唯一的名字
# -p 主机端口:容器端口:端口映射,把虚拟机的端口指向容器里的项目端口
# -e "SPRING_PROFILES_ACTIVE=prod":指定用prod环境配置
docker run -d --name 项目名 -p 主机端口:容器端口 -e "SPRING_PROFILES_ACTIVE=prod" 项目名:latest

步骤4:推到Docker Hub,方便爪子云拉取

得先把镜像推到Docker Hub(就是docker.io),爪子云才能拉取部署。按下面步骤来:

  1. 先登录你的Docker Hub账号:
bash 复制代码
# 登录Docker Hub,把"用户名"改成你自己的账号
docker login -u 用户名
  1. 去Docker Hub官网建个私有仓库(存自己的项目镜像,别公开了);
  2. 给本地镜像改个标签,要符合Docker Hub的格式(用户名/仓库名:版本):
bash 复制代码
# 给本地镜像重命名,适配Docker Hub推送格式
docker tag 项目名 用户名/项目名:latest
  1. 最后把镜像推上去:
bash 复制代码
# 推送镜像到Docker Hub的私有仓库
docker push 用户名/项目名:latest

四、部署必踩的坑!附解决方案

踩坑2:构建镜像时提示"failed to do request,connect: connection refused"

问题原因:

Docker默认从国外仓库拉镜像,国内网不好连,所以拉不下来,构建就卡住了。

解决方案:配置国内镜像源加速

bash 复制代码
# 用nano打开Docker配置文件(没有就自动创建)
nano /etc/docker/daemon.json

# 粘贴下面的国内镜像源配置(Ctrl+O保存,Ctrl+X退出)
{ 
  "registry-mirrors": [ 
    "https://hub-mirror.c.163.com",  # 网易镜像源
    "https://docker.m.daocloud.io",  # DaoCloud镜像源
    "https://docker.nju.edu.cn"       # 南京大学镜像源
  ] 
}

# 重新加载配置
systemctl daemon-reload 

# 重启Docker,让配置生效
systemctl restart docker

配置完再跑docker build,速度会快很多!如果还是慢,就再找个其他国内收费镜像源试试。

踩坑3:推送镜像时提示"failed to do request,connect: connection refused"

问题原因:

推镜像到Docker Hub要连国外服务器,国内网直接连不上;而且镜像只能用docker push推,不能在官网传。

解决方案:用代理打通网络

  1. 把VMware的网络设为桥接模式,让虚拟机和主机在同一个局域网;
  2. 在主机上打开代理工具,开启局域网共享,记一下主机的局域网IP(比如192.168.1.100);
  3. 在Ubuntu里配置网络代理,指向主机的代理地址;
  4. 关键一步:给Docker也配置代理:
bash 复制代码
# 编辑Docker配置文件
nano /etc/docker/daemon.json

# 添加代理配置(把127.0.0.1:7890改成你的代理地址和端口)
{ 
  "proxies": { 
    "http-proxy": "http://127.0.0.1:7890", 
    "https-proxy": "http://127.0.0.1:7890" 
  } 
}

# 重新加载配置并重启Docker
systemctl daemon-reload 
systemctl restart docker

配置完可以在Ubuntu里直接打开浏览器或者用curl命令测试一下就没问题了。

踩坑4:项目部署后连不上线上数据库

问题原因:

阿里云、腾讯云这些线上数据库都开了IP白名单,只有白名单里的IP才能连。爪子云服务器的IP没加进去,自然连不上。

解决方案:把爪子云IP加到数据库白名单

  1. 先在爪子云的Terminal里查一下服务器的公网IP:
bash 复制代码
# 查询当前服务器的公网IP
curl ip.sb
  1. 登录你的数据库管理控制台,找到"IP白名单"设置,把查到的爪子云IP加进去; 3. 保存配置后,重启一下项目容器,等白名单生效,就能正常连数据库啦。

五、后续优化:前后端都部署好,网站就能跑啦

后端部署到爪子云后,前端项目可以放到GitHub私有仓库里,用Vercel或者Render这些平台,一键自动部署超方便。前后端都弄好,你的网站就能在线访问啦~

六、安全建议

通过部署平台自带的环境变量注入敏感信息,而不是application.yml

相关推荐
Knight_AL1 天前
MinIO 入门实战:Docker 安装 + Spring Boot 文件上传(公有 / 私有)
spring boot·docker·容器
better_liang1 天前
每日Java面试场景题知识点之-Docker容器化部署
java·docker·微服务·devops·容器化·企业级开发
南山nash1 天前
Docker 网络详细讲解
运维·docker·容器
白驹过隙不负青春1 天前
Docker-compose部署java服务及前端服务
java·运维·前端·docker·容器·centos
Carry3451 天前
Nexus respository 搭建前端 npm 私服
前端·docker
阿杰 AJie1 天前
Ubuntu 22.04 安装 Docker
linux·ubuntu·docker
赵文宇(温玉)1 天前
Docker是时代发展的产物
运维·docker·容器
赵文宇(温玉)1 天前
Docker发展时间线(2008~2025)
运维·docker·容器
草木红1 天前
Docker 和 portainer 安装
运维·docker·容器·portainer