Docker入门
一、安装Docker
1.1安装wsl2(WSL 2,Windows 的 Linux 子系统)
java
wsl --install
相当于为 Docker 准备底层运行所需的"地基"与"发动机"。
1.2下载 Docker Desktop
这是 Docker 的软件本体和图形控制面板。它安装在 Windows 上,负责在前端接收操作指令,但后台会将容器任务直接交给 WSL 2 这个引擎去执行。网址在下面:
java
https://www.docker.com/products/docker-desktop/
二、在Linux上面实操(Ubuntu22.04)
在 Ubuntu 22.04 上安装并配置 Docker 非常简单,直接打开 Ubuntu 终端,按照以下 4 步操作即可:
第一步:更新系统并安装基础依赖
Bash
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg lsb-release
第二步:添加 Docker 官方 GPG 密钥与软件源
-
创建密钥目录并下载官方密钥:
Bash
sudo install -m 0755 -d /etc/apt/keyrings 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 -
写入 Docker 软件源:
Bash
echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
第三步:安装 Docker 引擎与 Docker Compose
Bash
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
第四步:启动服务并免 sudo 配置(推荐)
-
设置开机自启并启动 Docker:
Bash
sudo systemctl enable docker sudo systemctl start docker -
将当前用户加入 docker 组(避免每次敲命令都要加
sudo):Bash
sudo usermod -aG docker $USER newgrp docker -
测试是否安装成功:
Bash
docker run hello-world
如果终端打印出 Hello from Docker!,说明你的 Ubuntu 22.04 已经配置好 Docker 与 Docker Compose 了。
三、在Windows上进行打包项目
在当前 IDEA 界面右侧的 Maven 面板中即可直接执行打包:
方法一:使用图形界面(推荐,最直观)
- 在右侧窗口找到
Lifecycle这一项,点击左侧的小箭头展开它。 - 展开后会看到
clean、validate、compile、test、package等选项。 - 先双击
clean(清理之前的缓存与构建产物)。 - 等下方控制台执行完后,再双击
package(执行打包)。 - 看到控制台输出
BUILD SUCCESS后,打开左侧项目目录树的target文件夹,里面就会生成打包好的.jar文件。
小技巧(跳过测试):
如果打包时不想执行单元测试以防报错,可以先点击 Maven 面板上方工具栏带有蓝色闪电图标 的按钮(
Toggle 'Skip Tests' Mode),然后再双击package。
方法二:使用底部终端命令
-
点击 IDEA 底部工具栏的
Terminal(终端)。 -
输入以下命令并回车:
Bash
./mvnw clean package -DskipTests(如果提示找不到命令,也可以直接用
mvn clean package -DskipTests)
四、制作 Docker 镜像并运行
从日志看到,jar 包已经生成在:
D:\idea project\GraduateProject\competition-hub-backend\target\competition-hub-backend-0.0.1-SNAPSHOT.jar
接下来进入制作 Docker 镜像并运行的实操阶段,按照以下步骤进行:
第一步:准备后端部署目录与 Dockerfile
- 在项目下新建一个文件夹(例如命名为
backend-docker)。 - 将
target目录下的competition-hub-backend-0.0.1-SNAPSHOT.jar复制到该文件夹中,并将其重命名为app.jar(方便后续维护)。 - 在该文件夹中新建一个名为
Dockerfile的文件(无任何扩展名),填入以下内容:
Dockerfile
# 基础镜像(若使用 Java 8 可替换为 openjdk:8-jre-alpine)
FROM eclipse-temurin:17-jre
# 声明项目运行端口(按你的实际端口调整,如 8080)
EXPOSE 8080
# 复制 jar 包到容器内
COPY app.jar /app.jar
# 容器启动命令
ENTRYPOINT ["java", "-jar", "/app.jar"]
第二步:传输到 Ubuntu 虚拟机
把 Windows 上的文件传输到 Ubuntu 虚拟机中有多种方式,具体要看你的 Ubuntu 是运行在什么环境里的。下面整理了最常用的几种具体实现方式,你可以根据自己的情况选择最方便的一种:
情况一:如果你使用的是 WSL2 下的 Ubuntu(最简单!)
如果你在"第一步"中安装了 WSL2 并通过它运行 Ubuntu,那么 Windows 和 Ubuntu 的文件系统其实是互通的。你不需要任何传输工具,直接在 Ubuntu 终端里用命令拷贝即可。
Windows 的 C盘、D盘 在 Ubuntu 中自动挂载在 /mnt/c/、/mnt/d/ 目录下。
具体操作:
-
打开你的 Ubuntu 终端。
-
假设你的
backend-docker文件夹在 Windows 的D:\backend-docker,你可以直接把它复制到 Ubuntu 的桌面上(假设桌面文件夹存在,或者直接放当前用户目录下):bash# 将 D 盘的 backend-docker 复制到 Ubuntu 当前用户的 home 目录下 cp -r /mnt/d/backend-docker ~/ -
然后进入该目录即可:
bashcd ~/backend-docker
情况二:如果你使用的是 VMware 或 VirtualBox 等独立虚拟机
如果是独立的虚拟机环境,你可以通过网络或者共享工具来传输文件。
方法 A:使用 SCP 命令(不需要额外下载软件,推荐)
Windows 10/11 自带 scp 命令,可以直接通过网络将文件推送到虚拟机的 Linux 系统中。
前提:你的 Ubuntu 虚拟机需要开启 SSH 服务(sudo apt install openssh-server),并且你需要知道 Ubuntu 的 IP 地址(在 Ubuntu 中输入 ip addr 查看,找到网卡如 ens33 下的 inet 地址,千万不要用 docker0 的地址)。

具体操作:
-
在 Windows 中打开终端(CMD 或 PowerShell)。
-
使用
cd命令进入你存放backend-docker文件夹的上一级目录。 -
输入以下命令传输整个文件夹(注意替换为你自己的虚拟机账号和真实 IP):
bash# scp -r 文件夹 用户名@虚拟机IP:目标路径 scp -r backend-docker pfr@192.168.155.100:~/Desktop/ -
第一次连接会提示
Are you sure you want to continue connecting (yes/no)?,输入yes并回车。 -
随后终端会提示你输入 Ubuntu 的密码,输入密码时屏幕不会有任何显示,盲敲完密码回车即可。看到进度条即代表传输成功。

方法 B:使用 Xftp / MobaXterm / FinalShell 等可视化工具
如果你觉得敲命令太麻烦,可以下载一个可视化的 SFTP 客户端(比如免费的 Xftp 或 FinalShell)。
具体操作:
- 打开 Xftp,点击"新建连接"。
- 主机(Host) 填入 Ubuntu 虚拟机的 IP 地址,协议 选择
SFTP,端口 默认为22。 - 输入你 Ubuntu 的用户名和密码进行连接。
- 连接成功后,左边是你的 Windows 文件,右边是你的 Ubuntu 文件。你只需要直接用鼠标把左边的
backend-docker文件夹拖拽到右边的目录里即可。
方法 C:使用 VMware/VirtualBox 自带的"共享文件夹"功能
虚拟机的设置中通常允许你将 Windows 的某个文件夹与 Ubuntu 共享。
具体操作(以 VMware 为例):
- 在 VMware 中,右键你的 Ubuntu 虚拟机 -> 设置 (Settings)。
- 切换到"选项 (Options)"选项卡 -> 共享文件夹 (Shared Folders)。
- 选择"总是启用 (Always enabled)",然后点击"添加 (Add)",把 Windows 上的
backend-docker文件夹添加进来。 - 启动 Ubuntu,你通常可以在
/mnt/hgfs/目录下找到这个共享文件夹,直接在 Ubuntu 里访问或复制即可。
第三步:在 Ubuntu 中构建镜像并运行
强烈建议在 Linux 中将项目存放在用户主目录的专用文件夹下,而不是堆在桌面。
-
整理项目目录:
bashcd ~ mkdir projects mv ~/Desktop/backend-docker ~/projects/ cd ~/projects/backend-docker确保当前目录下包含
app.jar和Dockerfile。特别注意,如果在构建时提示找不到 target 目录,请修改Dockerfile,将COPY target/xxx.jar app.jar改为简单的COPY app.jar app.jar。 -
配置国内镜像加速(解决基础镜像拉取失败问题):
如果你在构建时遇到
server misbehaving报错或拉取超时,请配置加速器:bashsudo nano /etc/docker/daemon.json输入以下内容并保存退出(Ctrl+O,回车,Ctrl+X):
json{ "registry-mirrors": [ "https://docker.m.daocloud.io", "https://dockerpull.com", "https://docker.1panel.live" ] }然后重启 Docker:
sudo systemctl daemon-reload && sudo systemctl restart docker。 -
构建 Docker 镜像:
bashdocker build -t competition-backend:1.0 .(注意末尾的
.代表当前目录)构建成功的标志如下:

-
启动容器:
注意: 如果你的 Spring Boot 真实启动端口是 8099,映射时也必须对应,例如
-p 8099:8099。bashdocker run -d -p 8099:8099 --name my-backend competition-backend:1.0
第四步:验证后端是否运行成功
-
查看实时运行日志:
bashdocker logs -f my-backend(看到 Spring Boot 的 Banner 和
Started ... Application in ... seconds说明启动成功)
-
查看当前运行的容器状态:
bashdocker ps
🎉 至此,后端项目部署完毕!在 Windows 主机的浏览器或 Postman 中访问 http://<虚拟机IP>:8099/api/... 即可测试接口。
五、Docker 容器运维与高频踩坑对策(实战总结)
在实际服务器运维和日常开发中,容器重启、端口冲突和异常退出是最常见的核心问题,以下为经典实战场景及解决对策:
1. 虚拟机/服务器重启后,容器找不到了?
- 常见现象:
虚拟机重启后,执行docker ps发现列表空空如也,网页无法访问。 - 原因剖析:
Docker 容器在系统关机后默认进入Exited(停止)状态,并不会自动销毁,但默认也不会自动恢复运行。 - 排坑对策:
-
查看所有容器(包括已停止的):
bashdocker ps -a -
一键唤醒已有容器(千万不要重复使用
docker run,否则会报名字冲突):bashdocker start my-backend my-frontend -
一劳永逸(配置开机自动启动):
bashdocker update --restart always my-backend my-frontend(配置后,只要虚拟机开机或 Docker 守护进程启动,容器就会自动秒级自启)
-

2. 端口冲突与"无端口映射的残缺空壳容器"陷阱
-
常见现象:
- 启动容器时报错:
failed to bind host port 0.0.0.0:80/tcp: address already in use。 - 容器显示
Up状态,但外部浏览器输入 IP 永远提示"拒绝连接(CONNECTION_REFUSED)",查看docker ps时发现容器的PORTS这一列是完全空白的。
- 启动容器时报错:
-
原因剖析:
- Ubuntu 系统重启后,系统自带的原生服务(如 Apache2)可能开机自启霸占了 80 端口。
- 在端口被占用时执行
docker run,Docker 在报错中断前可能已经创建了一个没有绑定成功端口的"残缺空壳容器" 。此时如果直接用docker start启动它,它依然没有任何端口映射能力,外界流量无法流入。
-
排坑对策(标准修复 3 步法):
-
彻底关闭并禁用占用端口的原生服务:
bashsudo systemctl stop apache2 sudo systemctl disable apache2 # 禁用开机自启 -
彻底删除残缺容器:
bashdocker rm -f my-frontend -
重新执行完整的端口映射启动命令:
bashdocker run -d -p 80:80 --name my-frontend --restart always competition-frontend:1.0 -
核对检查:
执行docker ps,务必确认PORTS列中清楚显示了0.0.0.0:80->80/tcp映射规则。
-

- 彻底删除残缺容器:
bash docker rm -f my-frontend
- 重新执行完整的端口映射启动命令:
bash docker run -d -p 80:80 --name my-frontend --restart always competition-frontend:1.0
- 核对检查:
执行 docker ps,务必确认 PORTS 列中清楚显示了 0.0.0.0:80->80/tcp 映射规则。
外链图片转存中...(img-AZHV15vN-1787535683382)