Docker 是一组平台即服务(PaaS)的产品。它基于操作系统层级的虚拟化技术,将软件与其依赖项打包为容器。托管容器的软件称为 Docker 引擎。Docker 能够帮助开发者在轻量级容器中自动部署应用程序,并使得不同容器中的应用程序彼此隔离,高效工作。该服务有免费和高级版本。它于2013年首次发布,由 Docker, Inc. 开发。

什么是 Docker

Docker 是一个开源的容器化平台,允许开发者封装他们的应用程序及其所有依赖项到一个标准化的单元中,这个单元被称为容器。容器可以在任何支持 Docker 的环境中运行,从而确保应用程序的可移植性一致性

image-20250415095400817

Docker 的优势

Docker 作为一种开源的容器化平台,具有多方面的优势,以下是其主要特点的详细分析:

  • ‌轻量级与高效‌

    Docker 容器相比传统虚拟机更加轻量,因为它们共享操作系统内核,无需运行完整的操作系统。这使得容器的启动和关闭速度更快,资源占用更少,同时在同一台主机上可以运行更多容器,显著提高了资源利用率。

  • ‌可移植性与跨平台性‌

    Docker 容器可以在任何支持 Docker 的平台上运行,包括物理机、虚拟机和云环境。这种跨平台性使得应用程序可以轻松迁移,无需进行大量配置和修改,确保了环境的一致性。

  • ‌快速部署与迭代‌

    Docker 将应用程序及其依赖项打包成一个独立的容器,使得开发人员可以快速部署、测试和调试应用程序。同时,Docker 支持快速迭代和版本控制,便于回滚或升级。

  • ‌环境一致性‌

    Docker 容器确保了开发、测试和生产环境的一致性,消除了环境差异对应用程序的影响,从而提高了应用的可靠性和稳定性。

  • ‌简化配置与管理‌ Docker 通过镜像的方式进行部署,简化了配置和管理过程。同时,Docker 提供了强大的管理工具,便于监控和管理容器,使其成为一种高效且易于使用的平台。

  • ‌良好的隔离性‌ Docker 容器之间相互独立,每个容器都有自己的文件系统、进程空间和网络空间,确保了应用程序的安全性和稳定性,避免了相互干扰。

  • ‌可扩展性与灵活性‌ Docker 容器可以轻松进行水平扩展,根据需求快速添加或删除容器,满足不同规模的应用程序需求,使其成为一种灵活且可扩展的部署方式。

  • ‌丰富的社区与生态系统‌ Docker 拥有庞大的开源社区和丰富的生态系统,提供了大量插件、工具和文档资源,便于开发者使用。同时,Docker 与其他技术(如 Kubernetes )紧密集成,扩展了其功能和应用场景。

综上所述,Docker 的优势在于其轻量高效、跨平台、快速部署、环境一致性、简化管理、隔离性、可扩展性以及强大的社区支持,使其成为现代应用开发和部署的理想选择。

Docker 的结构

Docker 中,结构通常指的是如何组织和构建你的应用程序或服务以使其能够在 Docker 容器中运行。一个好的 Docker 结构可以帮助你更有效地管理你的应用程序,使其易于扩展、部署和维护。Docker 结构一般包含如下方面:

  • 镜像(Image

    镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件等。所有的应用,直接打包 docker 镜像,就可以直接跑起来。镜像可以用来创建容器。

  • 容器(Container

    容器是从镜像创建的运行实例。容器是独立的、轻量级的,并且可以包含几乎所有应用程序运行所需的环境。与直接在物理机上运行相比,容器提供了更高的资源隔离和更少的资源消耗。

  • Dockerfile

    一个文本文件,包含了创建 Docker 镜像的所有命令。通过编写 Dockerfile,开发者可以定义镜像的内容和行为。

  • Docker Hub

    一个云端的 Docker 镜像库,用户可以从中拉取公共镜像或上传自己的镜像。

Docker 平台提供了运行和管理容器的能力,但不包含具体的应用程序。 Docker 镜像是具体应用程序的封装,包含了应用程序运行所需的一切内容。 Docker 容器是镜像的运行实例,提供了一个独立的运行环境。

安装 Docker 后,Docker 本身是一个平台或工具,它提供了运行容器的能力。但要运行具体的应用程序或服务,需要使用 Docker 镜像。

Docker 安装

在之前的学习中,我们了解了一些 Docker 的基本概念。下面,我们将要讲解如何进行 Docker 的安装。

注意:本次安装环境为 CentOS7

检查系统内容

Docker 要求 CentOS 系统的内核版本高于 3.8 ,首先来验证你的 CentOS 版本是否支持 Docker

uname -a
image-20250416161709477

可以看到,我们的内核版本为:3.10。本身为 x86_64 的内核,满足需求。

卸载旧版本

如果你的系统中已经安装过旧版本的 Docker ,那么我们就需要卸载掉它。

  1. 删除 docker 引擎

    yum remove docker \
               docker-client \
               docker-client-latest \
               docker-common \
               docker-latest \
               docker-latest-logrotate \
               docker-logrotate \
               docker-engine
    image-20250416164416409
  2. 删除 docker 目录

    rm -rf /var/lib/docker

    这个命令会删除 Docker 引擎及其依赖的软件包和文件。

  3. 清理 yum 缓存

    # 清理所有缓存
    sudo yum clean all
    
    # 专门清理Docker仓库的元数据缓存
    sudo yum --enablerepo=docker-ce-stable clean metadata

    作用:清理过时的元数据缓存,避免因缓存导致的校验和不匹配问题。

  4. 查看是否有遗漏

    yum list installed | grep docker
    # 如果有,则删除
    yum remove xxxxxxxxxx

安装 Docker

下来,我们来安装 Docker ,我们会使用 yum 来管理 Docker

  1. 安装 yum 相关工具

    安装需要的软件包, yum-util 提供 yum-config-manager 功能,另外两个是 devicemapper 驱动依赖的。

    yum install -y yum-utils \
               device-mapper-persistent-data \
               lvm2 --skip-broken
  2. 配置国内源(可选)

    建议:国外镜像一般很难访问,建议配置国内云镜像。

    清华云:

    # 删除现有Docker仓库配置
    sudo rm -f /etc/yum.repos.d/docker*.repo
    
    # 添加清华镜像源
    sudo yum-config-manager --add-repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
    
    # 替换为国内镜像地址
    sudo sed -i 's|https://download.docker.com|https://mirrors.tuna.tsinghua.edu.cn/docker-ce|g' /etc/yum.repos.d/docker-ce.repo

    阿里云:

    # 删除错误配置
    sudo rm -f /etc/yum.repos.d/docker*.repo
    
    # 添加阿里云镜像源
    sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

    官方云:

    # 设置官方的源 如果国内云的源提示安装时有问题需要切换回官方源
    yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

    三种方式选择其中的一种即可。

  3. 查看 Docker 的列表

    可以查看所有仓库中所有docker版本,并选择特定版本安装

    [root@VM-16-15-centos ~]# yum list docker-ce --showduplicates | sort -r
    This system is not registered with an entitlement server. You can use subscription-manager to register.
                  : subscription-manager
    Loading mirror speeds from cached hostfile
    Loaded plugins: fastestmirror, langpacks, product-id, search-disabled-repos,
    docker-ce.x86_64            3:26.1.4-1.el7                      docker-ce-stable
    docker-ce.x86_64            3:26.1.3-1.el7                      docker-ce-stable
    docker-ce.x86_64            3:26.1.2-1.el7                      docker-ce-stable
    docker-ce.x86_64            3:26.1.1-1.el7                      docker-ce-stable
    docker-ce.x86_64            3:26.1.0-1.el7                      docker-ce-stable
    docker-ce.x86_64            3:26.0.2-1.el7                      docker-ce-stable
    docker-ce.x86_64            3:26.0.1-1.el7                      docker-ce-stable
    docker-ce.x86_64            3:26.0.0-1.el7                      docker-ce-stable
    docker-ce.x86_64            3:25.0.5-1.el7                      docker-ce-stable
    docker-ce.x86_64            3:25.0.4-1.el7                      docker-ce-stable
    docker-ce.x86_64            3:25.0.3-1.el7                      docker-ce-stable
    docker-ce.x86_64            3:25.0.2-1.el7                      docker-ce-stable
    docker-ce.x86_64            3:25.0.1-1.el7                      docker-ce-stable
    docker-ce.x86_64            3:25.0.0-1.el7                      docker-ce-stable
    docker-ce.x86_64            3:24.0.9-1.el7                      docker-ce-stable
    docker-ce.x86_64            3:24.0.8-1.el7                      docker-ce-stable
    docker-ce.x86_64            3:24.0.7-1.el7                      docker-ce-stable
    docker-ce.x86_64            3:24.0.6-1.el7                      docker-ce-stable
    docker-ce.x86_64            3:24.0.5-1.el7                      docker-ce-stable
    docker-ce.x86_64            3:24.0.4-1.el7                      docker-ce-stable
    docker-ce.x86_64            3:24.0.3-1.el7                      docker-ce-stable
    docker-ce.x86_64            3:24.0.2-1.el7                      docker-ce-stable
    docker-ce.x86_64            3:24.0.1-1.el7                      docker-ce-stable
    docker-ce.x86_64            3:24.0.0-1.el7                      docker-ce-stable
    docker-ce.x86_64            3:23.0.6-1.el7                      docker-ce-stable
    docker-ce.x86_64            3:23.0.5-1.el7                      docker-ce-stable
    docker-ce.x86_64            3:23.0.4-1.el7                      docker-ce-stable
    docker-ce.x86_64            3:23.0.3-1.el7                      docker-ce-stable
    docker-ce.x86_64            3:23.0.2-1.el7                      docker-ce-stable
    docker-ce.x86_64            3:23.0.1-1.el7                      docker-ce-stable
    docker-ce.x86_64            3:23.0.0-1.el7                      docker-ce-stable
    docker-ce.x86_64            3:20.10.9-3.el7                     docker-ce-stable
    docker-ce.x86_64            3:20.10.8-3.el7                     docker-ce-stable
    docker-ce.x86_64            3:20.10.7-3.el7                     docker-ce-stable
    docker-ce.x86_64            3:20.10.6-3.el7                     docker-ce-stable
    docker-ce.x86_64            3:20.10.5-3.el7                     docker-ce-stable
    docker-ce.x86_64            3:20.10.4-3.el7                     docker-ce-stable
    docker-ce.x86_64            3:20.10.3-3.el7                     docker-ce-stable
    docker-ce.x86_64            3:20.10.24-3.el7                    docker-ce-stable
    docker-ce.x86_64            3:20.10.2-3.el7                     docker-ce-stable
    docker-ce.x86_64            3:20.10.23-3.el7                    docker-ce-stable
    docker-ce.x86_64            3:20.10.22-3.el7                    docker-ce-stable
    docker-ce.x86_64            3:20.10.21-3.el7                    docker-ce-stable
    docker-ce.x86_64            3:20.10.20-3.el7                    docker-ce-stable
    docker-ce.x86_64            3:20.10.19-3.el7                    docker-ce-stable
    docker-ce.x86_64            3:20.10.18-3.el7                    docker-ce-stable
    docker-ce.x86_64            3:20.10.17-3.el7                    docker-ce-stable
    docker-ce.x86_64            3:20.10.16-3.el7                    docker-ce-stable
    docker-ce.x86_64            3:20.10.15-3.el7                    docker-ce-stable
    docker-ce.x86_64            3:20.10.14-3.el7                    docker-ce-stable
    docker-ce.x86_64            3:20.10.1-3.el7                     docker-ce-stable
    docker-ce.x86_64            3:20.10.13-3.el7                    docker-ce-stable
    docker-ce.x86_64            3:20.10.12-3.el7                    docker-ce-stable
    docker-ce.x86_64            3:20.10.11-3.el7                    docker-ce-stable
    docker-ce.x86_64            3:20.10.10-3.el7                    docker-ce-stable
    docker-ce.x86_64            3:20.10.0-3.el7                     docker-ce-stable
    docker-ce.x86_64            3:19.03.9-3.el7                     docker-ce-stable
    docker-ce.x86_64            3:19.03.8-3.el7                     docker-ce-stable
    docker-ce.x86_64            3:19.03.7-3.el7                     docker-ce-stable
    docker-ce.x86_64            3:19.03.6-3.el7                     docker-ce-stable
    docker-ce.x86_64            3:19.03.5-3.el7                     docker-ce-stable
    docker-ce.x86_64            3:19.03.4-3.el7                     docker-ce-stable
    docker-ce.x86_64            3:19.03.3-3.el7                     docker-ce-stable
    docker-ce.x86_64            3:19.03.2-3.el7                     docker-ce-stable
    docker-ce.x86_64            3:19.03.15-3.el7                    docker-ce-stable
    docker-ce.x86_64            3:19.03.14-3.el7                    docker-ce-stable
    docker-ce.x86_64            3:19.03.1-3.el7                     docker-ce-stable
    docker-ce.x86_64            3:19.03.13-3.el7                    docker-ce-stable
    docker-ce.x86_64            3:19.03.12-3.el7                    docker-ce-stable
    docker-ce.x86_64            3:19.03.11-3.el7                    docker-ce-stable
    docker-ce.x86_64            3:19.03.10-3.el7                    docker-ce-stable
    docker-ce.x86_64            3:19.03.0-3.el7                     docker-ce-stable
    docker-ce.x86_64            3:18.09.9-3.el7                     docker-ce-stable
    docker-ce.x86_64            3:18.09.8-3.el7                     docker-ce-stable
    docker-ce.x86_64            3:18.09.7-3.el7                     docker-ce-stable
    docker-ce.x86_64            3:18.09.6-3.el7                     docker-ce-stable
    docker-ce.x86_64            3:18.09.5-3.el7                     docker-ce-stable
    docker-ce.x86_64            3:18.09.4-3.el7                     docker-ce-stable
    docker-ce.x86_64            3:18.09.3-3.el7                     docker-ce-stable
    docker-ce.x86_64            3:18.09.2-3.el7                     docker-ce-stable
    docker-ce.x86_64            3:18.09.1-3.el7                     docker-ce-stable
    docker-ce.x86_64            3:18.09.0-3.el7                     docker-ce-stable
    docker-ce.x86_64            18.06.3.ce-3.el7                    docker-ce-stable
    docker-ce.x86_64            18.06.2.ce-3.el7                    docker-ce-stable
    docker-ce.x86_64            18.06.1.ce-3.el7                    docker-ce-stable
    docker-ce.x86_64            18.06.0.ce-3.el7                    docker-ce-stable
    docker-ce.x86_64            18.03.1.ce-1.el7.centos             docker-ce-stable
    docker-ce.x86_64            18.03.0.ce-1.el7.centos             docker-ce-stable
    docker-ce.x86_64            17.12.1.ce-1.el7.centos             docker-ce-stable
    docker-ce.x86_64            17.12.0.ce-1.el7.centos             docker-ce-stable
    docker-ce.x86_64            17.09.1.ce-1.el7.centos             docker-ce-stable
    docker-ce.x86_64            17.09.0.ce-1.el7.centos             docker-ce-stable
    docker-ce.x86_64            17.06.2.ce-1.el7.centos             docker-ce-stable
    docker-ce.x86_64            17.06.1.ce-1.el7.centos             docker-ce-stable
    docker-ce.x86_64            17.06.0.ce-1.el7.centos             docker-ce-stable
    docker-ce.x86_64            17.03.3.ce-1.el7                    docker-ce-stable
    docker-ce.x86_64            17.03.2.ce-1.el7.centos             docker-ce-stable
    docker-ce.x86_64            17.03.1.ce-1.el7.centos             docker-ce-stable
    docker-ce.x86_64            17.03.0.ce-1.el7.centos             docker-ce-stable
    Available Packages
  4. 安装 docker-compose-plugin

    # 更新yum缓存
    sudo yum makecache
    
    # 安装docker-compose-plugin
    sudo yum install -y docker-compose-plugin
  5. 安装 Docker

    这里安装时,会默认安装最新的一个。

    yum install docker-ce
  6. 启动 Docker

    # 启动 docker
    systemctl start docker
    # 停止 docker
    systemctl stop docker
    # 查看 docker 状态
    systemctl status docker
  7. 验证是否安装成功

    docker -v

    如果出现这个效果:

    image-20250416173055311

    代表安装成功!

配置 Docker 加速器

在中国使用 Docker 时,经常会遇到网络访问速度慢的问题,尤其是当需要从国外服务器拉取镜像时。为了解决这个问题,通常有两种方法被广泛采用:

  • 使用国内镜像
  • 配置 Docker 加速器。

这两者虽然目的相同(都是为了加速 Docker 镜像的下载速度),但在实现方式和使用场景上有所不同。刚才我们已经使用国内镜像加速了我们的 Docker ,下来我们也可以选择加速器的方式来加快 Docker 的下载速度。

  1. 修改 Docker 的配置文件

    Docker 使用 /etc/docker/daemon.json 文件来配置守护进程。如果这个文件不存在,你可以创建它。

    {
       "registry-mirrors": [
           "https://docker.m.daocloud.io",
          "https://docker.xuanyuan.me", 
          "https://docker.1ms.run",
          "https://dockerproxy.com",
          "https://hub-mirror.c.163.com"
         ]
    }

    以上是几大常见的国内 Docker 镜像源等,需要注意的是 docker 的国内镜像因为某些魔法原因会出现无法访问的情况,这时候需要在百度中自行更改镜像路径。

  2. 重启 Docker 服务

    # 重新加载配置文件
    systemctl daemon-reload
  3. 重启 docker

    systemctl restart docker 
  4. 验证镜像源配置

    docker info
  5. 如果能看到:

    image-20250421102812286

    代表 Docker 加速器配置完毕!

两种方式的区别:

  • 国内镜像:直接使用国内的镜像仓库地址,适用于需要特定镜像且希望快速获取的场景。需要用户手动指定仓库地址。
  • Docker 加速器:通过配置 Docker daemon 来改变默认的镜像下载源,适用于希望全局加速所有 Docker 镜像下载的场景。配置一次后,对所有镜像生效,无需手动指定仓库地址。

选择哪种方式取决于你的具体需求:如果你只需要加速特定几个镜像的下载,使用国内镜像可能更直接;如果你希望全局加速所有 Docker 操作的速度,配置 Docker 加速器可能更方便。

开启虚拟机远程访问

Docker 默认只监听本地 Unix Socket/var/run/docker.sock),要允许远程连接,需修改其启动配置,添加 TCP 监听端口(推荐用 2375,生产环境建议配 TLS 加密,测试阶段可先开放)。

找到 Dockersystemd 配置文件(通常是 /etc/systemd/system/docker.service.d/override.conf,若没有则新建),添加 TCP 监听参数:

[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
  • -H tcp://0.0.0.0:2375:表示 Docker 监听所有网卡的 2375 端口,允许远程连接;
  • -H unix:///var/run/docker.sock:保留本地 Unix Socket 支持,避免影响本地 Docker 操作。

[!IMPORTANT]

如果保存文件时提醒:

img

根本原因是当前用户没有权限写入 /etc/systemd/system/docker.service.d/override.conf 文件。这个路径属于系统级配置目录,普通用户无权直接编辑。

使用 sudo 提权编辑

sudo mkdir -p /etc/systemd/system/docker.service.d
sudo vim /etc/systemd/system/docker.service.d/override.conf

输入上边的内容后,保存即可。

重新加载文件并重启 docker

sudo systemctl daemon-reload  # 重载 systemd 配置
sudo systemctl restart docker  # 重启 Docker 服务

验证是否成功

curl http://127.0.0.1:2375/info  # 若返回 JSON 格式的 Docker 信息,说明配置成功

Idea 中配置远程连接

打开 IDEA 设置:Settings -> Build, Execution, Deployment -> Docker

image-20260721165701662

点击 + 号添加新配置,选择 TCP socket

image-20260721170138974

红框中输入你的 docker 所在虚拟机的 IP。点击确定即可。

如果成功,会在这里看到服务器中 docker 的相关信息。

image-20260721170305838

至此,我们的 docker 就可以在 Idea 中查看到了。

[!WARNING]

docker 连接问题

如果 docker 今天配置的时候,是正确能够远程连接的,但是到了第二天突然连接不上。有可能是 docker 出现了凌乱错误。请按照如下顺序执行操作:

  1. 服务器内部自测

    请在服务器终端执行以下命令,确认 Docker API 是否真的能响应 HTTP 请求:

    curl http://localhost:2375/version

    如果返回 JSON 数据(如 {"Version":"...", "ApiVersion":"..."}):说明 Docker 配置完全正确。

  2. 验证防火墙是否开启

    systemctl status firewalld

    查看防火墙是否关闭,如果是云服务器,要查看2375端口号是否放开。

  3. 验证 Docker 是否在监听 2375 端口

    netstat -tlnp | grep 2375

    你应该看到类似输出:

    tcp        0      0 0.0.0.0:2375            0.0.0.0:*               LISTEN      1234/dockerd
  4. iptables 规则冲突

    即使你关闭了 firewalldDocker 安装时会直接修改底层的 iptables 规则。有时候,DockerNAT 表或 Filter 表规则会意外拦截外部对 2375 的访问。

    尝试临时清空 iptables 规则测试(注意:这会重置所有网络规则,生产环境慎用,但在排查问题时很有效):

    # 备份当前规则(以防万一)
    iptables-save > /tmp/iptables.bak
    
    # 清空所有规则
    iptables -F
    iptables -X
    iptables -t nat -F
    iptables -t nat -X
    iptables -t mangle -F
    iptables -t mangle -X
    
    # 重启 Docker(Docker 启动时会自动重建它需要的规则)
    systemctl restart docker

    重启后,再次在本地 IDEA 点击连接。如果成功了,说明就是之前的 iptables 规则乱了。

Docker 常见命令

Docker 是一个开源的容器化平台,它允许开发者打包、分发和运行应用程序在任何环境中。Docker 使用容器来封装应用程序,使其与系统环境隔离,从而确保应用程序在任何地方都能以相同的方式运行。

以下是一些 Docker 的常见命令,这些命令可以帮助你管理 Docker 容器和镜像。

基础命令

  1. 启动 Docker

    systemctl start docker
  2. 关闭 Docker

    systemctl stop docker
  3. 重启 Docker

    systemctl restart docker
  4. 设置开机自启动

    systemctl enable docker
  5. 查看 Docker 运行状态

    systemctl status docker
  6. 查看 Docker 版本号信息

    docker version
    docker --version
    docker -v
  7. 查看 Docker 信息

    docker info
  8. 帮助命令

    # 所有帮助信息
    docker help 
    docker --help
    # 具体命令的帮助信息
    docker 
    <command> help

镜像命令

镜像名称

镜像的名称组成:

  • 镜像名称一般分为两个部分组成:respository : tag
  • 在未指定 tag 时,默认是 latest ,代表最新版本的镜像。
image-20250418161220099

镜像命令

常见的镜像操作命令如图:

image-20250418161347516
  1. 列出所有镜像

    docker images
  2. 拉取镜像

    # 拉取最新镜像
    docker pull respository
    # 拉取指定版本镜像
    docker pull respository:tag
  3. 推送镜像

    # 推送镜像到服务器
    docker push respository
    docker push respository:tag
  4. 删除镜像

    # 删除镜像 可以根据镜像名,也可以根据镜像ID
    docker rmi 镜像名|镜像ID
    # 强制删除镜像
    docker rmi -f 镜像名|镜像ID
    docker image rm 镜像名|镜像ID  
    # 删除多个镜像 其镜像名或镜像ID用空格隔开即可 
    docker rmi -f 镜像名|镜像ID 镜像名|镜像ID 镜像名|镜像ID ...
    # 删除全部镜像,-a 意思为显示全部, -q 意思为只显示ID
    docker rmi -f $(docker images -aq)  

    注意:镜像没有被任何容器使用才可以删除。

  5. 压缩和解压缩镜像

    # 保存镜像为一个压缩包 以 .tar 结尾
    docker save -o 保存的目标文件名称 镜像名|镜像ID
    # 加载压缩包为镜像
    docker load -i 文件名
  6. 搜索镜像

    Docker Hub 中搜索镜像,这个就算配置了国内镜像也没用,所以可能会有网络问题。

    docker search [options] term

    options 参数说明:

    • --automated : 只列出 automated build 类型的镜像;
    • --no-trunc : 显示完整的镜像描述;
    • -f 列出指定条件的镜像。

    注意:需要配置外网访问方式,search 操作仍然会从 Docker Hub 中获取资源。

  7. 给镜像打标签

    Docker 中,给镜像打标签是一个非常常见的操作,它可以帮助你更好地组织和管理你的镜像。标签通常用于区分同一镜像的不同版本或者用途。

    # 给本地的镜像打上新的标签
    docker image tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
    image-20250421113539096

容器管理命令

  1. 新建容器

    docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]

    在这个语法中,OPTIONS 包含了一些参数,用于配置控制容器的各种方面。IMAGE 是要使用的 Docker 镜像。COMMAND 是在容器内执行的命令,ARG 是该命令的参数。

    OPTIONS 中的一些参数:

    • -d:后台运行容器。
    • --name NAME:为容器指定名称。
    • -p HOST:CONTAINER:端口映射。
    • -v HOST_PATH:CONTAINER_PATH:挂载卷。
    • -e ENV_VAR=VALUE:设置环境变量。
    • --rm:容器停止后自动删除。

    在新建容器后会启动该容器。

  2. 查看容器

    docker ps [OPTIONS]

    这个命令用于列出容器。默认情况下,它只显示正在运行的容器。

    OPTIONS 中的一些参数:

    • -a:显示所有容器(包括已停止的)。
    • -q:静默模式,仅显示容器 ID。
    • --format:使用 Go 模板自定义输出格式。
    • `-n `:显示最近创建的 n 个容器。
    • -s:显示文件大小(磁盘占用)。
  3. 生命周期管理

    用于管理容器的运行状态。

    docker stop [OPTIONS] 容器名 [容器名...]
    docker start [OPTIONS] 容器名 [容器名...]
    docker restart [OPTIONS] 容器名 [容器名...]
    • stop:优雅地停止一个或多个正在运行的容器。
    • start:启动一个或多个已经停止的容器。
    • restart:重启一个或多个容器(相当于先执行 stop 再执行 start)。
    # 30秒后停止容器mysql_8
    docker stop -i 30 mysql_8
    # 以后台方式启动mysql_8
    docker start -d mysql_8
    # 30秒后重新启动容器mysql_8
    docker restart -i 30 mysql_8
  4. 日志查看

    用于排查容器内应用的问题。

    docker logs [OPTIONS] 容器名
    • -f:实时跟踪日志输出(类似 tail -f)。
    • `–tail `:仅显示日志的最后 N 行。
    • -t:显示日志的时间戳。
  5. 删除容器

    删除容器中的应用

    docker rm [OPTIONS] 容器名
    • -f, --force
      • 作用:强制移除正在运行或暂停的容器。
      • 底层机制:Docker 会先向容器进程发送 SIGKILL 信号强制终止进程,然后立即删除容器文件系统2。
      • ⚠️ 警告:此操作不会等待容器优雅退出,可能会导致容器内未保存的数据丢失、临时文件残留或应用状态异常。生产环境中建议先使用 docker stop 停止容器,再进行删除26。
    • -v, --volumes
      • 作用:在删除容器的同时,一并清理与该容器关联的匿名卷(Anonymous Volumes)4。
      • ⚠️ 警告:此参数不会删除命名卷(Named Volumes)或挂载的宿主机目录(Bind Mounts)2。如果匿名卷中存有重要数据,加上此参数会导致数据被永久清除。
    • -l, --link
      • 作用:移除指定的容器网络连接(Link),而不是删除容器本身4。
      • 使用场景:主要用于清理在默认桥接网络下,通过 --link 参数建立的容器间网络依赖关系。
    # 删除单个容器
    docker rm <容器名称或ID>
    # 强制删除正在运行的容器
    docker rm -f <容器名称或ID>
    # 删除所有已停止的容器
    docker container prune

以上的命令我们都会在部署软件中着重练习。

Docker 中部署软件

我们根据刚才的容器管理命令,来启动常用的几个软件。

部署 MySQL

MySQL 是一个广泛使用的开源关系型数据库管理系统。通过 Docker 部署 MySQL8 可以快速搭建一个可移植、可扩展的数据库环境。下来我们将介绍如何使用 Docker 部署 MySQL8,并讲解如何根据需求配置 MySQL

  1. 拉取镜像

    docker pull mysql:8.0.27

    这里,我们拉取 mysql8 版本的镜像。

  2. 查看镜像

    docker images
  3. 创建本地配置

    为了确保数据在容器删除后不会丢失,你可以将 MySQL 的数据目录挂载到宿主机的某个目录上。

    • 创建数据目录

      在本地目录下创建一个数据目录 data

      mkdir -p /opt/workspace/docker/mysql/data
    • 创建配置文件

      在本地目录下创建一个 my.cnf 文件

      vim /opt/workspace/docker/mysql/my.cnf

      代码如下:

      [mysqld]
      # === 基础与路径配置 ===
      # 设置默认字符集为 utf8mb4,完美支持中文和 Emoji 表情
      character-set-server=utf8mb4
      collation-server=utf8mb4_unicode_ci
      
      # === 性能优化配置 ===
      # InnoDB 缓冲池大小,建议设置为服务器可用内存的 50%-70%(此处以 1G 为例)
      innodb_buffer_pool_size=1G
      # 最大并发连接数,根据业务需求调整(每个连接约占 2M 内存)
      max_connections=1000
      # 非交互和交互连接的超时时间(秒),避免空闲连接长期占用资源
      wait_timeout=3600
      interactive_timeout=3600
      # 禁用 DNS 反向解析,加快连接速度并避免 DNS 故障导致的连接延迟
      skip-name-resolve
      
      # === 日志配置 ===
      # 开启慢查询日志,记录执行超过 1 秒的 SQL,便于后期优化
      slow_query_log=1
      long_query_time=1
      
      # === 安全与兼容配置 ===
      # 兼容旧版应用(如旧版 JDBC 驱动或 Python 2.x)
      default_authentication_plugin=mysql_native_password
      # 限制导入导出文件的路径,增强安全性(MySQL 8.0 默认开启此安全策略)
      secure_file_priv=/var/lib/mysql-files
      
      [client]
      # 客户端默认字符集
      default-character-set=utf8mb4
      
      [mysql]
      # 命令行客户端默认字符集
      default-character-set=utf8mb4
      image-20250517192750582
  4. 创建容器

    docker run \
        -d \
        -p 3306:3306 \
        --name docker_mysql_8 \
        --restart=always \
        -e MYSQL_ROOT_PASSWORD='a123456' \
        -v /opt/workspace/docker/mysql/my.cnf:/etc/my.cnf \
        -v /opt/workspace/docker/mysql/data:/var/lib/mysql \
        -v /opt/workspace/docker/mysql/logs:/var/log/mysql \
        mysql:8.0.27

    语句解释:

    • docker run:创建容器并运行
    • -p 3306:3306:将宿主机的 3306 端口映射到容器内的 3306 端口上
    • --name docker_mysql_8:给容器起了一个名称
    • -e MYSQL_ROOT_PASSWORD:设置 root 用户的初始密码
    • -d:以后台方式运行
    • -v:将本地配置文件挂载到容器中,分别挂载配置文件数据文件
    • mysql:8:镜像名称
  5. 检查是否启动成功

    # 查看正在运行的容器
    docker ps
    # 查看所有的容器
    docker ps -a

    如果出现如下效果:

    image-20250506151844624

    一个小问题

    如果 Mysql 启动后很快就掉线了,有可能是权限或者日志的问题,执行如下操作即可。

    • 检查数据目录权限

      ls -ld /opt/workspace/docker/mysql/data
    • 创建日志目录

      sudo mkdir -p /opt/workspace/docker/mysql/log && sudo chown -R 999:999 /opt/workspace/docker/mysql/log
    • 清理数据目录

      sudo rm -rf /opt/workspace/docker/mysql/data/*
    • 重新启动容器

      docker run -d -p 3306:3306 --name docker_mysql_8 -e MYSQL_ROOT_PASSWORD='a123456' -v /sql/my.cnf:/etc/my.cnf -v /opt/workspace/docker/mysql/data:/var/lib/mysql -v /opt/workspace/docker/mysql/log:/var/log/mysql mysql:8.0.27
  6. 进入 mysql 容器

    docker exec -it <容器名称> bash
    image-20250506152128132

部署 Redis

作为内存数据库,Redis 在处理大型数据集时提供高可用性和吞吐量。Docker 容器化可实现 Redis 部署的高效水平扩展,从而促进大数据工作负载的管理。

  1. 拉取镜像

    # 拉取最新镜像
    docker pull redis
  2. 查看镜像

    docker images
  3. 创建宿主机目录

    # 分别创建了 data 和 conf 目录
    mkdir -p {data,conf}
    image-20250517200024210
  4. 挂载配置文件

    在刚才创建的目录 conf 下,创建挂载 redis 持久化的文件 redis.conf,填入以下内容。

    protected-mode no
    
    port 6379
    
    tcp-backlog 511
    #redis密码 强烈建议设置复杂一些
    requirepass guanwei     
    
    timeout 0
    
    tcp-keepalive 300
    
    daemonize no
    
    supervised no
    
    pidfile /var/run/redis_6379.pid
    
    loglevel notice
    
    logfile ""
    
    databases 30
    
    always-show-logo yes
    
    save 900 1
    save 300 10
    save 60 10000
    
    stop-writes-on-bgsave-error yes
    
    rdbcompression yes
    
    rdbchecksum yes
    
    dbfilename dump.rdb
    
    dir ./
    
    replica-serve-stale-data yes
    
    replica-read-only yes
    
    repl-diskless-sync no
    
    repl-disable-tcp-nodelay no
    
    replica-priority 100
    
    lazyfree-lazy-eviction no
    lazyfree-lazy-expire no
    lazyfree-lazy-server-del no
    replica-lazy-flush no
    
    appendonly yes
    
    appendfilename "appendonly.aof"
    
    no-appendfsync-on-rewrite no
    
    auto-aof-rewrite-percentage 100
    auto-aof-rewrite-min-size 64mb
    
    aof-load-truncated yes
    
    aof-use-rdb-preamble yes
    
    lua-time-limit 5000
    
    slowlog-max-len 128
    
    notify-keyspace-events ""
    
    hash-max-ziplist-entries 512
    hash-max-ziplist-value 64
    
    list-max-ziplist-size -2
    
    list-compress-depth 0
    
    set-max-intset-entries 512
    
    zset-max-ziplist-entries 128
    zset-max-ziplist-value 64
    
    hll-sparse-max-bytes 3000
    
    stream-node-max-bytes 4096
    stream-node-max-entries 100
    
    activerehashing yes
    
    hz 10
    
    dynamic-hz yes
    
    aof-rewrite-incremental-fsync yes
    
    rdb-save-incremental-fsync yes
  5. 创建容器

    docker run -itd \
     --name docker_redis_latest \
     --restart=always \
     --log-opt max-size=100m \
     --log-opt max-file=2 \
     -p 6379:6379 
     -v /opt/workspace/docker/redis/conf/redis.conf:/etc/redis/redis.conf 
     -v /opt/workspace/docker/redis/data:/data  \
     redis:latest \
     redis-server /etc/redis/redis.conf \
     --appendonly yes  \
     --requirepass guanwei

    注意:

    • 如果出错,将 \ 删除后执行。
    • -v 后边挂载的是本机目录。

    参数解析:

    • 【 –restart=always】 开机启动,失败也会一直重启
    • 【–log-opt max-size=100m】意味着一个容器日志大小上限是100M
    • 【–log-opt max-file=2】意味着一个容器有2个日志,分别是id+.json、id+1.json
    • 【-p 6379:6379】 将宿主机6379端口与容器内6379端口进行映射
    • 【-v】 将宿主机目录或文件与容器内目录或文件进行挂载映射
    • 【-itd】
      • i:以交互模式运行容器,通常与 -t 同时使用
      • t:为容器重新分配一个伪输入终端,通常与 -i 同时使用
      • d:表示后台启动 redis
    • 【–name】 给容器命名
    • 【–appendonly yes】 开启redis 持久化
    • 【–requirepass guanwei】 建议设置密码,并且将密码设置为高强度复杂
    • 【redis-server /etc/redis/redis.conf】 以配置文件启动 redis,加载容器内的 conf 文件
  6. 检查是否启动成功

    docker ps
    image-20250521114957677
  7. 查看容器日志

    也可以通过查看日志的方式检查是否启动成功。

    docker logs -f docker_redis_latest
    image-20250521120500633
  8. 通过客户端访问

    docker exec -it docker_redis_latest redis-cli
    image-20250521143305283
  9. 远程访问

    通过本机的 redis 客户端或者连接工具进行访问。记得要关闭防火墙并允许远程访问。

Dockerfile

Dockerfile 是一个用于构建 Docker 容器镜像的纯文本文件。它包含了一系列指令和配置,用于描述如何组装一个 Docker 容器的运行环境。通过 Dockerfile,你可以自动化地构建镜像,实现基础设施即代码(IaC),确保在不同的机器或平台上都能复现相同的应用环境。

Dockerfile 的默认文件名就是 Dockerfile(无扩展名)。编写完成后,通常使用 docker build 命令来读取其中的指令并自动生成镜像。

作用

  1. 定义镜像构建步骤‌:Dockerfile 包含从基础镜像开始到最终镜像完成的所有指令,让构建过程透明化、可追溯 。
  2. 实现环境一致性‌:把应用程序及其依赖打包成标准化镜像,解决”在我这能跑,到你那却不行”的问题 。
  3. 支持自动化和版本管理‌:文件可存入 Git,配合 docker build 命令一键生成,适合团队协作和 CI/CD 流程 。
  4. 提高构建效率‌:利用分层缓存机制,只重建变更的步骤,大幅提升构建速度 。‌‌

文件结构

Dockerfile 的基本文件语法结构非常直观,它本质上是一个纯文本文件,由一行行的命令语句组成。

一般而言,Dockerfile 的结构自上而下可分为四个主要部分:

  1. 基础镜像信息

    必须以 FROM 指令开头(除了解析器指令或 ARG 指令)。它用于指定构建新镜像时所基于的底层操作系统或运行环境。

    FROM ubuntu:22.04
  2. 维护者信息

    用于声明该镜像的创建者或维护团队。早期使用 MAINTAINER 指令,现在官方更推荐使用 LABEL 指令以键值对的形式添加元数据。

    LABEL maintainer="your_email@example.com"
  3. 镜像操作指令

    这是 Dockerfile 的核心部分,包含一系列用于配置运行环境的命令。例如使用 WORKDIR 设置工作目录,使用 COPYADD 复制文件,使用 RUN 安装依赖,以及使用 ENV 设置环境变量等。

    WORKDIR /app
    COPY package.json /app
    RUN npm install
  4. 容器启动时的执行指令

    定义当容器被启动时,默认要运行的主程序或命令。通常使用 CMDENTRYPOINT 指令。

    CMD ["node", "app.js"]

将上述四个部分组合起来,一个典型的 Dockerfile 语法结构如下:

# ==========================================
# 第一部分:基础镜像信息(构建阶段)
# ==========================================
# 使用官方的 JDK 作为构建基础镜像
FROM maven:3.9-eclipse-temurin-17 AS builder

# ==========================================
# 第二部分:维护者信息
# ==========================================
LABEL maintainer="java_dev <java_dev@company.com>"
LABEL description="Java Spring Boot Application"

# ==========================================
# 第三部分:镜像操作指令(构建阶段)
# ==========================================
# 1. 设置工作目录
WORKDIR /build

# 2. 先复制 pom.xml,利用 Docker 缓存机制
# (当代码修改但依赖未变时,Docker 会跳过下面的依赖下载步骤)
COPY pom.xml .
RUN mvn dependency:go-offline -B

# 3. 复制源代码并执行打包命令
COPY src ./src
RUN mvn package -DskipTests

# ==========================================
# 第一部分:基础镜像信息(运行阶段)
# ==========================================
# 使用轻量级的 JRE 镜像作为最终运行环境
FROM eclipse-temurin:17-jre-alpine

# ==========================================
# 第二部分:维护者信息(运行阶段)
# ==========================================
LABEL maintainer="java_dev <java_dev@company.com>"

# ==========================================
# 第三部分:镜像操作指令(运行阶段)
# ==========================================
# 1. 设置运行环境的工作目录
WORKDIR /app

# 2. 从上一个阶段(builder)复制构建好的 jar 包
COPY --from=builder /build/target/*.jar app.jar

# 3. 声明 Spring Boot 默认端口
EXPOSE 8080

# 4. 设置 JVM 环境变量(可选,方便外部调整)
ENV JAVA_OPTS="-Xms256m -Xmx512m"

# ==========================================
# 第四部分:容器启动时的执行指令
# ==========================================
# 容器启动时运行 Java 应用
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]

结合四大结构的详细解析:

  1. 第一部分(基础镜像): 这里使用了两次 FROM。第一次 FROM maven... 用于编译打包,第二次 FROM eclipse-temurin:17-jre-alpine 用于实际运行JRE-Alpine 镜像只有几十 MB,比包含完整 JDK 的镜像小得多。
  2. 第二部分(维护者信息): 使用 LABEL 为镜像打上了作者和描述标签。在生产环境中,这有助于团队追踪镜像的责任人。
  3. 第三部分(镜像操作指令)
    • 缓存优化:在 Java 项目中,pom.xml 的变动频率远低于 src 代码。因此先 COPY pom.xml 并执行 mvn dependency:go-offline,再 COPY src。这样每次修改代码重新构建时,就不需要重新下载几百 MBMaven 依赖。
    • 跨阶段复制COPY --from=builder 是核心语法,它把第一阶段编译好的 .jar 包直接“偷”到了第二阶段的轻量级镜像中,丢弃了所有源码和 Maven 构建工具。
  4. 第四部分(启动指令): 使用 ENTRYPOINT 配合环境变量 $JAVA_OPTS。这样在启动容器时,如果宿主机内存发生变化,可以通过 -e JAVA_OPTS="-Xmx1g" 动态调整 JVM 内存,而不需要重新构建镜像。

在实际编写时,遵循这种从上到下的逻辑结构,不仅能让 Dockerfile 易于阅读,还能帮助 Docker 更好地利用构建缓存,提升镜像的构建效率。

构建与运行

编写好上述 Dockerfile 后,可以使用以下命令:

# 构建镜像
docker build -t my-java-app:1.0 .

# 运行容器(并自定义 JVM 内存参数)
docker run -d -p 8080:8080 -e JAVA_OPTS="-Xmx1g" --name java-container my-java-app:1.0

部署单应用 Jar

针对 SpringBoot3 项目在 CentOS 7.9 服务器上的部署需求,我们量身定制了一套基于 Docker 多阶段构建(Multi-stage builds)的容器化方案。由于 SpringBoot3 强制要求 Java 17 运行环境,且当前项目属于无数据库等外部依赖的轻量级服务,采用多阶段构建能够完美契合这一场景。

该方案将应用的编译打包生产运行环境彻底分离,不仅通过统一的构建镜像保证了开发与生产环境的一致性,还有效剔除了冗余的源码和构建工具。

最终,部署在云服务器上的镜像体积可大幅压缩至 100MB 左右,不仅节省了存储空间,更显著提升了镜像拉取与容器启动的速度。

  1. dockerfile 编写

    IDEA 项目根目录下创建一个名为 Dockerfile 的文件(无扩展名,注意大小写),内容如下:

    # --- 第一阶段:构建环境 (Builder) ---
    # 使用 Maven + JDK 17 镜像进行编译和打包
    FROM maven:3.8.5-openjdk-17 AS builder
    
    # 设置工作目录为容器内的 /app
    # WORKDIR 的作用:Dockerfile 中的 WORKDIR /app 指令的意思是:“在容器内部创建一个叫 /app 的文件夹,并把这里作为后续所有命令(如 COPY, RUN)的工作目录。”
    WORKDIR /app
    
    # 1. 复制父级 pom.xml 到容器(用于解析父工程依赖)
    #    注意:构建上下文是 'docker/' 目录,所以父 pom.xml 就在上下文根目录
    COPY pom.xml /app/pom.xml
    
    # 2. 复制当前子模块的 pom.xml 到 ./docker-simple/ 目录
    COPY docker-simple/pom.xml /app/docker-simple/pom.xml
    
    # 3. 下载依赖(利用 Docker 缓存层加速构建)
    #    只要 pom.xml 没变,这一步就会直接使用缓存
    RUN mvn dependency:go-offline -pl docker-simple -am -B
    
    # 4. 复制源代码
    COPY docker-simple/src /app/docker-simple/src
    
    # 5. 执行打包命令
    #    -pl docker-simple : 指定只构建 docker-simple 模块
    #    -am             : 同时构建它依赖的其他模块(如果有)
    #    -DskipTests     : 跳过测试以加快构建速度
    RUN mvn clean package -pl docker-simple -am -DskipTests -B
    
    # --- 第二阶段:运行环境 (Runner) ---
    # 使用轻量级的 JRE 17 镜像运行应用
    FROM eclipse-temurin:17-jre-alpine
    
    # 设置工作目录
    WORKDIR /app
    
    # 从构建阶段复制打好的 jar 包
    # 注意:Maven 默认会将产物输出在对应的模块目录下
    COPY --from=builder /app/docker-simple/target/*.jar app.jar
    
    # 暴露端口(根据你的 application.properties 配置修改,默认为 8080)
    EXPOSE 8080
    
    # 启动命令
    ENTRYPOINT ["java", "-jar", "app.jar"]

    注意:

    • docker 是父项目的名称
    • docker-simple 是子项目的名称
  2. 将项目上传到服务器中

    这个没什么好说的,使用 ftp 上传即可。注意:将项目打成压缩包后上传,记得上传的是父项目。

  3. 在服务器中构建镜像

    进入上传后的目录中(父项目所在目录),解压后执行:

    docker build -f docker-simple/Dockerfile -t my-springboot-app:1.0 .

    注意:docker-simple 是子项目名称。

    image-20260723172831158

    正在下载相关依赖中,注意网络即可。

    [!NOTE]

    Maven 下载过慢

    如果出现如下情况:

    image-20260723174101252

    maven 从中央仓库中获取资源,速度比较慢。将 Maven 的中央仓库替换为阿里云镜像,能显著提升依赖下载速度。你只需要在 Docker 构建过程中,将自定义的 settings.xml 文件复制到容器内 Maven 的配置目录即可。

    1. 停止下载

      需要停止目前的操作,Ctrl+C 就能停止了。如果快要下载好了,就不需要更换源了。

    2. 创建配置文件

      在你的项目根目录(即 docker/ 文件夹)下,创建一个名为 settings.xml 的文件,内容如下:

      
      <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
                                    https://maven.apache.org/xsd/settings-1.0.0.xsd">
    aliyunmaven * 阿里云公共仓库 https://maven.aliyun.com/repository/public

    
    3. 修改 `Dockerfile`
    
       在你的 `docker/docker-simple/Dockerfile` 中,找到 `RUN mvn dependency:go-offline ...` 这一行之前,添加一行 `COPY` 指令,将你的 `settings.xml` 复制到容器内 Maven 的配置目录 `/root/.m2/settings.xml`。
    
       ```dockerfile
       # ... 前面的指令保持不变 ...
    
       # 复制自定义的 Maven settings.xml (使用阿里云镜像)
       COPY settings.xml /root/.m2/settings.xml
    
       # 3. 下载依赖(利用 Docker 缓存层加速构建)
       #    只要 pom.xml 没变,这一步就会直接使用缓存 这样就能使用刚才下载的东西了(用原来的也行)
       RUN mvn dependency:go-offline -pl docker-simple -am -B
    
       # ... 后面的指令保持不变 ...

    完成以上三步后,重新执行 docker build 命令,你会发现依赖下载速度会有质的飞跃!

  4. 查看构建情况

    image-20260723181106634

    输入 docker images 查看镜像情况:

    image-20260723181312958
  5. 运行镜像

    构建完成后,运行容器并将云服务器的 8080 端口映射出来:

    docker run -d \
      --name springboot-container \
      -p 8080:8080 \
      -e JAVA_OPTS="-Xms256m -Xmx512m" \
      --restart=always \
      my-springboot-app:1.0
  6. 浏览器中测试

    image-20260723181442988

部署多应用

如果我们的 SpringBoot 中使用了 MySQLRedisRockerMQ 等其他应用,而这些应用我们也准备放到 docker 中部署启动。

如何去做

很简单,我们可以在 docker 中分别启动其他的镜像,然后我们 SpringBoot 以上边的步骤上传—>构建–>启动即可。

一定切记一件事情,不要将我们所需的应用都构建一个镜像中。

Docker 的最佳实践中,我们遵循“一个容器只做一件事”Single Responsibility Principle)的原则。我们以 Redis + SpringBoot 为例。

[!WARNING]

为什么不建议把 Redis 和 Spring Boot 打包在一起?

  1. 数据丢失风险(最致命)Docker 容器是“易失”的。如果你把 Redis 和应用打包在一起,一旦应用崩溃重启、或者你更新了代码重新部署容器,Redis 里的所有缓存和数据都会瞬间消失
  2. 资源争抢Java 应用是内存大户,Redis 也是。如果它们挤在一个容器里,Java 堆内存溢出(OOM)时可能会直接把 Redis 进程杀掉,导致整个服务不可用。
  3. 扩展性差:未来如果你的应用需要集群部署(比如开 3 个副本),难道你要启动 3 个 Redis 吗?这会导致数据不一致。通常我们需要的是“多个应用”连接“同一个 Redis”。

如何访问

我分别启动两个 docker 应用,这两个应用都在同一个 docker 中,我在 springbootapplication.yml 中的 redishost 应该写什么?localhost?

绝对不能写 localhost127.0.0.1 这是 Docker 新手最容易踩的坑。

Docker 中,每个容器都是一个完全隔离的微型 Linux 系统。如果你的 Spring Boot 容器里写了 localhost,它寻找的是自己(Java容器)内部,而不是 Redis 容器,这必然会导致 Connection refused(拒绝连接)。

我们可以使用创建一个虚拟局域网的方式,把两个容器连在一起。在同一个自定义网络中,容器可以通过服务名/容器名互相访问。

image-20260724162328541
  1. 创建一个自定义网络

    docker network create my-network

    my-network 就是我们创建的新网络名称。

  2. 启动 Redis 容器,加入该网络

    docker run -d --name my-redis --network my-network -p 6379:6379 redis:7-alpine

    使用参数 --network 指定加入的网络。

  3. 配置 application.yml

    spring:
      data:
        redis:
          host: my-redis  # ✅ 直接写 Redis 容器的名字!
          port: 6379

    这里书写 Redis 的容器名称。

  4. 启动 SpringBoot 容器,加入同一个网络

    docker run -d --name my-app --network my-network -p 8080:8080 my-springboot-app:1.0

    启动 SpringBoot 容器时也加入刚才的网路。

这样,两个容器就组成了一个新的局域网。同理的是如果使用 Mysql 等其他服务时,步骤也是这样的。

By admin

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注