Docker入门

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 密钥与软件源

  1. 创建密钥目录并下载官方密钥:

    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
  2. 写入 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 配置(推荐)

  1. 设置开机自启并启动 Docker:

    Bash

    复制代码
    sudo systemctl enable docker
    sudo systemctl start docker
  2. 将当前用户加入 docker 组(避免每次敲命令都要加 sudo):

    Bash

    复制代码
    sudo usermod -aG docker $USER
    newgrp docker
  3. 测试是否安装成功:

    Bash

    复制代码
    docker run hello-world

如果终端打印出 Hello from Docker!,说明你的 Ubuntu 22.04 已经配置好 Docker 与 Docker Compose 了。

三、在Windows上进行打包项目

在当前 IDEA 界面右侧的 Maven 面板中即可直接执行打包:

方法一:使用图形界面(推荐,最直观)

  1. 在右侧窗口找到 Lifecycle 这一项,点击左侧的小箭头展开它。
  2. 展开后会看到 cleanvalidatecompiletestpackage 等选项。
  3. 双击 clean(清理之前的缓存与构建产物)。
  4. 等下方控制台执行完后,再双击 package(执行打包)。
  5. 看到控制台输出 BUILD SUCCESS 后,打开左侧项目目录树的 target 文件夹,里面就会生成打包好的 .jar 文件。

小技巧(跳过测试):

如果打包时不想执行单元测试以防报错,可以先点击 Maven 面板上方工具栏带有蓝色闪电图标 的按钮(Toggle 'Skip Tests' Mode),然后再双击 package

方法二:使用底部终端命令

  1. 点击 IDEA 底部工具栏的 Terminal(终端)。

  2. 输入以下命令并回车:

    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

  1. 在项目下新建一个文件夹(例如命名为 backend-docker)。
  2. target 目录下的 competition-hub-backend-0.0.1-SNAPSHOT.jar 复制到该文件夹中,并将其重命名为 app.jar(方便后续维护)。
  3. 在该文件夹中新建一个名为 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/ 目录下。

具体操作:

  1. 打开你的 Ubuntu 终端。

  2. 假设你的 backend-docker 文件夹在 Windows 的 D:\backend-docker,你可以直接把它复制到 Ubuntu 的桌面上(假设桌面文件夹存在,或者直接放当前用户目录下):

    bash 复制代码
    # 将 D 盘的 backend-docker 复制到 Ubuntu 当前用户的 home 目录下
    cp -r /mnt/d/backend-docker ~/
  3. 然后进入该目录即可:

    bash 复制代码
    cd ~/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 的地址)。

具体操作:

  1. Windows 中打开终端(CMD 或 PowerShell)。

  2. 使用 cd 命令进入你存放 backend-docker 文件夹的上一级目录。

  3. 输入以下命令传输整个文件夹(注意替换为你自己的虚拟机账号和真实 IP):

    bash 复制代码
    # scp -r 文件夹 用户名@虚拟机IP:目标路径
    scp -r backend-docker pfr@192.168.155.100:~/Desktop/
  4. 第一次连接会提示 Are you sure you want to continue connecting (yes/no)?,输入 yes 并回车。

  5. 随后终端会提示你输入 Ubuntu 的密码,输入密码时屏幕不会有任何显示,盲敲完密码回车即可。看到进度条即代表传输成功。

方法 B:使用 Xftp / MobaXterm / FinalShell 等可视化工具

如果你觉得敲命令太麻烦,可以下载一个可视化的 SFTP 客户端(比如免费的 XftpFinalShell)。

具体操作:

  1. 打开 Xftp,点击"新建连接"。
  2. 主机(Host) 填入 Ubuntu 虚拟机的 IP 地址,协议 选择 SFTP端口 默认为 22
  3. 输入你 Ubuntu 的用户名和密码进行连接。
  4. 连接成功后,左边是你的 Windows 文件,右边是你的 Ubuntu 文件。你只需要直接用鼠标把左边的 backend-docker 文件夹拖拽到右边的目录里即可。
方法 C:使用 VMware/VirtualBox 自带的"共享文件夹"功能

虚拟机的设置中通常允许你将 Windows 的某个文件夹与 Ubuntu 共享。

具体操作(以 VMware 为例):

  1. 在 VMware 中,右键你的 Ubuntu 虚拟机 -> 设置 (Settings)。
  2. 切换到"选项 (Options)"选项卡 -> 共享文件夹 (Shared Folders)。
  3. 选择"总是启用 (Always enabled)",然后点击"添加 (Add)",把 Windows 上的 backend-docker 文件夹添加进来。
  4. 启动 Ubuntu,你通常可以在 /mnt/hgfs/ 目录下找到这个共享文件夹,直接在 Ubuntu 里访问或复制即可。

第三步:在 Ubuntu 中构建镜像并运行

强烈建议在 Linux 中将项目存放在用户主目录的专用文件夹下,而不是堆在桌面。

  1. 整理项目目录:

    bash 复制代码
    cd ~
    mkdir projects
    mv ~/Desktop/backend-docker ~/projects/
    cd ~/projects/backend-docker

    确保当前目录下包含 app.jarDockerfile。特别注意,如果在构建时提示找不到 target 目录,请修改 Dockerfile,将 COPY target/xxx.jar app.jar 改为简单的 COPY app.jar app.jar

  2. 配置国内镜像加速(解决基础镜像拉取失败问题):

    如果你在构建时遇到 server misbehaving 报错或拉取超时,请配置加速器:

    bash 复制代码
    sudo 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

  3. 构建 Docker 镜像:

    bash 复制代码
    docker build -t competition-backend:1.0 .

    (注意末尾的 . 代表当前目录)

    构建成功的标志如下:

  4. 启动容器:

    注意: 如果你的 Spring Boot 真实启动端口是 8099,映射时也必须对应,例如 -p 8099:8099

    bash 复制代码
    docker run -d -p 8099:8099 --name my-backend competition-backend:1.0

第四步:验证后端是否运行成功

  1. 查看实时运行日志:

    bash 复制代码
    docker logs -f my-backend

    (看到 Spring Boot 的 Banner 和 Started ... Application in ... seconds 说明启动成功)

  2. 查看当前运行的容器状态:

    bash 复制代码
    docker ps

🎉 至此,后端项目部署完毕!在 Windows 主机的浏览器或 Postman 中访问 http://<虚拟机IP>:8099/api/... 即可测试接口。


五、Docker 容器运维与高频踩坑对策(实战总结)

在实际服务器运维和日常开发中,容器重启、端口冲突和异常退出是最常见的核心问题,以下为经典实战场景及解决对策:

1. 虚拟机/服务器重启后,容器找不到了?

  • 常见现象:
    虚拟机重启后,执行 docker ps 发现列表空空如也,网页无法访问。
  • 原因剖析:
    Docker 容器在系统关机后默认进入 Exited(停止)状态,并不会自动销毁,但默认也不会自动恢复运行。
  • 排坑对策:
    1. 查看所有容器(包括已停止的):

      bash 复制代码
      docker ps -a
    2. 一键唤醒已有容器(千万不要重复使用 docker run ,否则会报名字冲突):

      bash 复制代码
      docker start my-backend my-frontend
    3. 一劳永逸(配置开机自动启动):

      bash 复制代码
      docker update --restart always my-backend my-frontend

      (配置后,只要虚拟机开机或 Docker 守护进程启动,容器就会自动秒级自启)


2. 端口冲突与"无端口映射的残缺空壳容器"陷阱

  • 常见现象:

    1. 启动容器时报错:failed to bind host port 0.0.0.0:80/tcp: address already in use
    2. 容器显示 Up 状态,但外部浏览器输入 IP 永远提示"拒绝连接(CONNECTION_REFUSED)",查看 docker ps 时发现容器的 PORTS 这一列是完全空白的
  • 原因剖析:

    1. Ubuntu 系统重启后,系统自带的原生服务(如 Apache2)可能开机自启霸占了 80 端口。
    2. 在端口被占用时执行 docker run,Docker 在报错中断前可能已经创建了一个没有绑定成功端口的"残缺空壳容器" 。此时如果直接用 docker start 启动它,它依然没有任何端口映射能力,外界流量无法流入。
  • 排坑对策(标准修复 3 步法):

    1. 彻底关闭并禁用占用端口的原生服务:

      bash 复制代码
      sudo systemctl stop apache2
      sudo systemctl disable apache2   # 禁用开机自启
    2. 彻底删除残缺容器:

      bash 复制代码
      docker rm -f my-frontend
    3. 重新执行完整的端口映射启动命令:

      bash 复制代码
      docker run -d -p 80:80 --name my-frontend --restart always competition-frontend:1.0
    4. 核对检查:
      执行 docker ps,务必确认 PORTS 列中清楚显示了 0.0.0.0:80->80/tcp 映射规则。

  1. 彻底删除残缺容器:

bash docker rm -f my-frontend

  1. 重新执行完整的端口映射启动命令:

bash docker run -d -p 80:80 --name my-frontend --restart always competition-frontend:1.0

  1. 核对检查:

执行 docker ps,务必确认 PORTS 列中清楚显示了 0.0.0.0:80->80/tcp 映射规则。

外链图片转存中...(img-AZHV15vN-1787535683382)

相关推荐
SCandL1521 小时前
k8s工作原理
linux·运维·服务器
其实防守也摸鱼1 小时前
如何使用自动化教育SRC漏洞挖掘系统--AutoHunter
运维·网络·人工智能·学习·安全·web安全·自动化
weixin_444579301 小时前
Rockylinux 与 K8s 的安装
linux·云原生·容器·kubernetes
Allen_LVyingbo1 小时前
面向电子病历的批量语义分析自动化工具:从设计到实战(上)
运维·人工智能·机器学习·语言模型·自然语言处理·自动化·健康医疗
Interview Aid1121 小时前
Akuna OA 题目拆解|三题思路复盘
linux·运维·算法·面试·职场和发展
qq21084629531 小时前
Ubuntu 磁盘空间清理实战:从 Docker 到 VirtualBox 的完整指南
linux·ubuntu·docker
蒲锘1 小时前
DevOps 项目阶段笔记二:Docker Engine + cri-dockerd
笔记·docker·devops
小无名呀1 小时前
Docker的使用
运维·docker·容器
张洛闻Eren1 小时前
云原生k8s【第五课】:资源配额与限制
运维·数据库·云原生·kubernetes·k8s·github