Docker 是一组平台即服务(PaaS)的产品。它基于操作系统层级的虚拟化技术,将软件与其依赖项打包为容器。托管容器的软件称为 Docker 引擎。Docker 能够帮助开发者在轻量级容器中自动部署应用程序,并使得不同容器中的应用程序彼此隔离,高效工作。该服务有免费和高级版本。它于2013年首次发布,由 Docker, Inc. 开发。
什么是 Docker
Docker 是一个开源的容器化平台,允许开发者封装他们的应用程序及其所有依赖项到一个标准化的单元中,这个单元被称为容器。容器可以在任何支持 Docker 的环境中运行,从而确保应用程序的可移植性和一致性。

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

可以看到,我们的内核版本为:3.10。本身为 x86_64 的内核,满足需求。
卸载旧版本
如果你的系统中已经安装过旧版本的 Docker ,那么我们就需要卸载掉它。
-
删除
docker引擎yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
-
删除
docker目录rm -rf /var/lib/docker这个命令会删除
Docker引擎及其依赖的软件包和文件。 -
清理
yum缓存# 清理所有缓存 sudo yum clean all # 专门清理Docker仓库的元数据缓存 sudo yum --enablerepo=docker-ce-stable clean metadata作用:清理过时的元数据缓存,避免因缓存导致的校验和不匹配问题。
-
查看是否有遗漏
yum list installed | grep docker # 如果有,则删除 yum remove xxxxxxxxxx
安装 Docker
下来,我们来安装 Docker ,我们会使用 yum 来管理 Docker 。
-
安装
yum相关工具安装需要的软件包,
yum-util提供yum-config-manager功能,另外两个是devicemapper驱动依赖的。yum install -y yum-utils \ device-mapper-persistent-data \ lvm2 --skip-broken -
配置国内源(可选)
建议:国外镜像一般很难访问,建议配置国内云镜像。
清华云:
# 删除现有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三种方式选择其中的一种即可。
-
查看
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 -
安装
docker-compose-plugin# 更新yum缓存 sudo yum makecache # 安装docker-compose-plugin sudo yum install -y docker-compose-plugin -
安装
Docker这里安装时,会默认安装最新的一个。
yum install docker-ce -
启动
Docker# 启动 docker systemctl start docker # 停止 docker systemctl stop docker # 查看 docker 状态 systemctl status docker -
验证是否安装成功
docker -v如果出现这个效果:

代表安装成功!
配置
Docker加速器在中国使用
Docker时,经常会遇到网络访问速度慢的问题,尤其是当需要从国外服务器拉取镜像时。为了解决这个问题,通常有两种方法被广泛采用:
- 使用国内镜像
- 配置
Docker加速器。这两者虽然目的相同(都是为了加速
Docker镜像的下载速度),但在实现方式和使用场景上有所不同。刚才我们已经使用国内镜像加速了我们的Docker,下来我们也可以选择加速器的方式来加快Docker的下载速度。
修改
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的国内镜像因为某些魔法原因会出现无法访问的情况,这时候需要在百度中自行更改镜像路径。重启
Docker服务# 重新加载配置文件 systemctl daemon-reload重启 docker
systemctl restart docker验证镜像源配置
docker info如果能看到:
代表
Docker加速器配置完毕!两种方式的区别:
- 国内镜像:直接使用国内的镜像仓库地址,适用于需要特定镜像且希望快速获取的场景。需要用户手动指定仓库地址。
- Docker 加速器:通过配置
Docker daemon来改变默认的镜像下载源,适用于希望全局加速所有Docker镜像下载的场景。配置一次后,对所有镜像生效,无需手动指定仓库地址。选择哪种方式取决于你的具体需求:如果你只需要加速特定几个镜像的下载,使用国内镜像可能更直接;如果你希望全局加速所有
Docker操作的速度,配置Docker加速器可能更方便。
开启虚拟机远程访问
Docker 默认只监听本地 Unix Socket(/var/run/docker.sock),要允许远程连接,需修改其启动配置,添加 TCP 监听端口(推荐用 2375,生产环境建议配 TLS 加密,测试阶段可先开放)。
找到 Docker 的 systemd 配置文件(通常是 /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]
如果保存文件时提醒:
根本原因是当前用户没有权限写入
/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。

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

红框中输入你的 docker 所在虚拟机的 IP。点击确定即可。
如果成功,会在这里看到服务器中 docker 的相关信息。

至此,我们的 docker 就可以在 Idea 中查看到了。
[!WARNING]
docker连接问题如果
docker今天配置的时候,是正确能够远程连接的,但是到了第二天突然连接不上。有可能是docker出现了凌乱错误。请按照如下顺序执行操作:
服务器内部自测
请在服务器终端执行以下命令,确认
Docker API是否真的能响应HTTP请求:curl http://localhost:2375/version如果返回 JSON 数据(如
{"Version":"...", "ApiVersion":"..."}):说明Docker配置完全正确。验证防火墙是否开启
systemctl status firewalld查看防火墙是否关闭,如果是云服务器,要查看2375端口号是否放开。
验证
Docker是否在监听 2375 端口netstat -tlnp | grep 2375你应该看到类似输出:
tcp 0 0 0.0.0.0:2375 0.0.0.0:* LISTEN 1234/dockerd
iptables规则冲突即使你关闭了
firewalld,Docker安装时会直接修改底层的iptables规则。有时候,Docker的NAT表或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 容器和镜像。
基础命令
-
启动
Dockersystemctl start docker -
关闭
Dockersystemctl stop docker -
重启
Dockersystemctl restart docker -
设置开机自启动
systemctl enable docker -
查看
Docker运行状态systemctl status docker -
查看
Docker版本号信息docker version docker --version docker -v -
查看
Docker信息docker info -
帮助命令
# 所有帮助信息 docker help docker --help # 具体命令的帮助信息 docker <command> help
镜像命令
镜像名称
镜像的名称组成:
- 镜像名称一般分为两个部分组成:
respository:tag。 - 在未指定
tag时,默认是latest,代表最新版本的镜像。

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

-
列出所有镜像
docker images -
拉取镜像
# 拉取最新镜像 docker pull respository # 拉取指定版本镜像 docker pull respository:tag -
推送镜像
# 推送镜像到服务器 docker push respository docker push respository:tag -
删除镜像
# 删除镜像 可以根据镜像名,也可以根据镜像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)注意:镜像没有被任何容器使用才可以删除。
-
压缩和解压缩镜像
# 保存镜像为一个压缩包 以 .tar 结尾 docker save -o 保存的目标文件名称 镜像名|镜像ID # 加载压缩包为镜像 docker load -i 文件名 -
搜索镜像
从
Docker Hub中搜索镜像,这个就算配置了国内镜像也没用,所以可能会有网络问题。docker search [options] termoptions参数说明:--automated: 只列出automated build类型的镜像;--no-trunc: 显示完整的镜像描述;-f: 列出指定条件的镜像。
注意:需要配置外网访问方式,
search操作仍然会从Docker Hub中获取资源。 -
给镜像打标签
在
Docker中,给镜像打标签是一个非常常见的操作,它可以帮助你更好地组织和管理你的镜像。标签通常用于区分同一镜像的不同版本或者用途。# 给本地的镜像打上新的标签 docker image tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
容器管理命令
-
新建容器
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:容器停止后自动删除。
在新建容器后会启动该容器。
-
查看容器
docker ps [OPTIONS]这个命令用于列出容器。默认情况下,它只显示正在运行的容器。
OPTIONS中的一些参数:-a:显示所有容器(包括已停止的)。-q:静默模式,仅显示容器 ID。--format:使用 Go 模板自定义输出格式。- `-n `:显示最近创建的 n 个容器。
-s:显示文件大小(磁盘占用)。
-
生命周期管理
用于管理容器的运行状态。
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 -
日志查看
用于排查容器内应用的问题。
docker logs [OPTIONS] 容器名-f:实时跟踪日志输出(类似tail -f)。- `–tail `:仅显示日志的最后 N 行。
-t:显示日志的时间戳。
-
删除容器
删除容器中的应用
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。
-
拉取镜像
docker pull mysql:8.0.27这里,我们拉取
mysql8版本的镜像。 -
查看镜像
docker images -
创建本地配置
为了确保数据在容器删除后不会丢失,你可以将
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
-
-
创建容器
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:镜像名称
-
检查是否启动成功
# 查看正在运行的容器 docker ps # 查看所有的容器 docker ps -a如果出现如下效果:

一个小问题
如果
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
-
-
进入
mysql容器docker exec -it <容器名称> bash
部署 Redis
作为内存数据库,Redis 在处理大型数据集时提供高可用性和吞吐量。Docker 容器化可实现 Redis 部署的高效水平扩展,从而促进大数据工作负载的管理。
-
拉取镜像
# 拉取最新镜像 docker pull redis -
查看镜像
docker images -
创建宿主机目录
# 分别创建了 data 和 conf 目录 mkdir -p {data,conf}
-
挂载配置文件
在刚才创建的目录
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 -
创建容器
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
- i:以交互模式运行容器,通常与
- 【–name】 给容器命名
- 【–appendonly yes】 开启redis 持久化
- 【–requirepass guanwei】 建议设置密码,并且将密码设置为高强度复杂
- 【redis-server /etc/redis/redis.conf】 以配置文件启动
redis,加载容器内的conf文件
- 如果出错,将
-
检查是否启动成功
docker ps
-
查看容器日志
也可以通过查看日志的方式检查是否启动成功。
docker logs -f docker_redis_latest
-
通过客户端访问
docker exec -it docker_redis_latest redis-cli
-
远程访问
通过本机的
redis客户端或者连接工具进行访问。记得要关闭防火墙并允许远程访问。
Dockerfile
Dockerfile 是一个用于构建 Docker 容器镜像的纯文本文件。它包含了一系列指令和配置,用于描述如何组装一个 Docker 容器的运行环境。通过 Dockerfile,你可以自动化地构建镜像,实现基础设施即代码(IaC),确保在不同的机器或平台上都能复现相同的应用环境。
Dockerfile 的默认文件名就是 Dockerfile(无扩展名)。编写完成后,通常使用 docker build 命令来读取其中的指令并自动生成镜像。
作用
- 定义镜像构建步骤:
Dockerfile包含从基础镜像开始到最终镜像完成的所有指令,让构建过程透明化、可追溯 。 - 实现环境一致性:把应用程序及其依赖打包成标准化镜像,解决”在我这能跑,到你那却不行”的问题 。
- 支持自动化和版本管理:文件可存入
Git,配合docker build命令一键生成,适合团队协作和CI/CD流程 。 - 提高构建效率:利用分层缓存机制,只重建变更的步骤,大幅提升构建速度 。
文件结构
Dockerfile 的基本文件语法结构非常直观,它本质上是一个纯文本文件,由一行行的命令语句组成。
一般而言,Dockerfile 的结构自上而下可分为四个主要部分:
-
基础镜像信息
必须以
FROM指令开头(除了解析器指令或ARG指令)。它用于指定构建新镜像时所基于的底层操作系统或运行环境。FROM ubuntu:22.04 -
维护者信息
用于声明该镜像的创建者或维护团队。早期使用
MAINTAINER指令,现在官方更推荐使用LABEL指令以键值对的形式添加元数据。LABEL maintainer="your_email@example.com" -
镜像操作指令
这是
Dockerfile的核心部分,包含一系列用于配置运行环境的命令。例如使用WORKDIR设置工作目录,使用COPY或ADD复制文件,使用RUN安装依赖,以及使用ENV设置环境变量等。WORKDIR /app COPY package.json /app RUN npm install -
容器启动时的执行指令
定义当容器被启动时,默认要运行的主程序或命令。通常使用
CMD或ENTRYPOINT指令。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"]
结合四大结构的详细解析:
- 第一部分(基础镜像):
这里使用了两次
FROM。第一次FROM maven...用于编译打包,第二次FROM eclipse-temurin:17-jre-alpine用于实际运行。JRE-Alpine镜像只有几十 MB,比包含完整JDK的镜像小得多。 - 第二部分(维护者信息):
使用
LABEL为镜像打上了作者和描述标签。在生产环境中,这有助于团队追踪镜像的责任人。 - 第三部分(镜像操作指令):
- 缓存优化:在
Java项目中,pom.xml的变动频率远低于src代码。因此先COPY pom.xml并执行mvn dependency:go-offline,再COPY src。这样每次修改代码重新构建时,就不需要重新下载几百MB的Maven依赖。 - 跨阶段复制:
COPY --from=builder是核心语法,它把第一阶段编译好的.jar包直接“偷”到了第二阶段的轻量级镜像中,丢弃了所有源码和Maven构建工具。
- 缓存优化:在
- 第四部分(启动指令):
使用
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 左右,不仅节省了存储空间,更显著提升了镜像拉取与容器启动的速度。
-
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是子项目的名称
-
将项目上传到服务器中
这个没什么好说的,使用
ftp上传即可。注意:将项目打成压缩包后上传,记得上传的是父项目。 -
在服务器中构建镜像
进入上传后的目录中(父项目所在目录),解压后执行:
docker build -f docker-simple/Dockerfile -t my-springboot-app:1.0 .注意:
docker-simple是子项目名称。
正在下载相关依赖中,注意网络即可。
[!NOTE]
Maven下载过慢如果出现如下情况:

是
maven从中央仓库中获取资源,速度比较慢。将Maven的中央仓库替换为阿里云镜像,能显著提升依赖下载速度。你只需要在Docker构建过程中,将自定义的settings.xml文件复制到容器内Maven的配置目录即可。-
停止下载
需要停止目前的操作,
Ctrl+C就能停止了。如果快要下载好了,就不需要更换源了。 -
创建配置文件
在你的项目根目录(即
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">
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命令,你会发现依赖下载速度会有质的飞跃! -
-
查看构建情况

输入
docker images查看镜像情况:
-
运行镜像
构建完成后,运行容器并将云服务器的 8080 端口映射出来:
docker run -d \ --name springboot-container \ -p 8080:8080 \ -e JAVA_OPTS="-Xms256m -Xmx512m" \ --restart=always \ my-springboot-app:1.0 -
浏览器中测试

部署多应用
如果我们的 SpringBoot 中使用了 MySQL、Redis 、RockerMQ 等其他应用,而这些应用我们也准备放到 docker 中部署启动。
如何去做
很简单,我们可以在 docker 中分别启动其他的镜像,然后我们 SpringBoot 以上边的步骤上传—>构建–>启动即可。
一定切记一件事情,不要将我们所需的应用都构建一个镜像中。
在 Docker 的最佳实践中,我们遵循“一个容器只做一件事”(Single Responsibility Principle)的原则。我们以 Redis + SpringBoot 为例。
[!WARNING]
为什么不建议把 Redis 和 Spring Boot 打包在一起?
- 数据丢失风险(最致命):
Docker容器是“易失”的。如果你把Redis和应用打包在一起,一旦应用崩溃重启、或者你更新了代码重新部署容器,Redis里的所有缓存和数据都会瞬间消失。- 资源争抢:
Java应用是内存大户,Redis 也是。如果它们挤在一个容器里,Java堆内存溢出(OOM)时可能会直接把Redis进程杀掉,导致整个服务不可用。- 扩展性差:未来如果你的应用需要集群部署(比如开 3 个副本),难道你要启动 3 个
Redis吗?这会导致数据不一致。通常我们需要的是“多个应用”连接“同一个Redis”。
如何访问
我分别启动两个 docker 应用,这两个应用都在同一个 docker 中,我在 springboot 的 application.yml 中的 redis 的 host 应该写什么?localhost?
绝对不能写 localhost 或 127.0.0.1! 这是 Docker 新手最容易踩的坑。
在 Docker 中,每个容器都是一个完全隔离的微型 Linux 系统。如果你的 Spring Boot 容器里写了 localhost,它寻找的是自己(Java容器)内部,而不是 Redis 容器,这必然会导致 Connection refused(拒绝连接)。
我们可以使用创建一个虚拟局域网的方式,把两个容器连在一起。在同一个自定义网络中,容器可以通过服务名/容器名互相访问。

-
创建一个自定义网络
docker network create my-networkmy-network就是我们创建的新网络名称。 -
启动
Redis容器,加入该网络docker run -d --name my-redis --network my-network -p 6379:6379 redis:7-alpine使用参数
--network指定加入的网络。 -
配置
application.ymlspring: data: redis: host: my-redis # ✅ 直接写 Redis 容器的名字! port: 6379这里书写
Redis的容器名称。 -
启动
SpringBoot容器,加入同一个网络docker run -d --name my-app --network my-network -p 8080:8080 my-springboot-app:1.0启动
SpringBoot容器时也加入刚才的网路。
这样,两个容器就组成了一个新的局域网。同理的是如果使用 Mysql 等其他服务时,步骤也是这样的。


