Docker镜像定制实战:从配置Yum源到部署Nginx服务
这类 Docker 基础操作,最核心的价值不是记住命令,而是理解“镜像”和“容器”这两个核心概念在实际操作中如何联动。很多人学 Docker 卡在第一步,就是因为把镜像当成了虚拟机镜像,把容器当成了虚拟机,思路一错,后面配置、安装、部署全乱套。这篇文章不讲大道理,直接围绕“定制简单镜像”和“在容器内配置 Yum 仓库并安装服务”这两个具体任务,拆解每一步的操作逻辑和背后的原因。目标是让你在普通 Linux 环境下,能独立完成从编写 Dockerfile 到运行一个自定义服务的完整流程,并理解每一步为什么这么做,以及出了问题该往哪个方向排查。1. 先理清核心概念:镜像、容器与 Yum 仓库的关系在动手之前,必须把三个关键对象的关系摆正,这是后续所有操作不跑偏的基础。1.1 镜像是模板,容器是实例你可以把Docker 镜像理解为一个只读的模板或者一套“装机 U 盘”。这个 U 盘里包含了操作系统(如 CentOS、Ubuntu 的精简版)、预装的软件、环境变量和配置文件。镜像是静态的、分层的,它本身不能运行。Docker 容器则是根据这个镜像“启动”出来的一个独立运行环境,或者说是一个“正在运行的进程”。容器拥有自己的文件系统、网络、进程空间。你对容器内部所做的任何修改(比如安装软件、写入文件),默认都只存在于这个容器生命周期内,不会影响原始的镜像。一个常见的误区是,把容器当成一个完整的、持久的虚拟机来用。实际上,容器的设计初衷是无状态和可丢弃的。你的应用代码和持久化数据,应该通过卷(Volume)或绑定挂载(Bind Mount)放在容器外部管理。1.2 容器内的 Yum 仓库:为什么要单独配置?默认的 Docker 官方镜像(如centos:7)为了保持最小体积,通常不包含完整的yum仓库配置,或者其配置的源地址可能因为网络原因无法访问。这就导致了一个典型问题:你启动一个 CentOS 容器,进去直接yum install nginx,很可能会因为网络超时或找不到仓库而失败。因此,“为容器配置 Yum 仓库”这个操作,通常有两种场景:在 Dockerfile 中配置:为了构建一个包含了特定服务的自定义镜像。这样,基于此镜像启动的任何容器,都自带了可用的 Yum 源和预装的服务。在正在运行的容器中临时配置:用于调试、测试或快速验证某个软件在特定基础环境下的兼容性。我们接下来的操作会覆盖第一种场景,这是更规范、更可复用的做法。1.3 任务拆解:我们要做什么?根据标题,我们的实操路径很清晰:定制简单镜像:编写一个 Dockerfile,以某个官方镜像(如 CentOS)为基础,在其中完成我们的定制化操作。在镜像构建过程中配置 Yum 仓库:在 Dockerfile 里,将 Yum 源替换为国内访问速度更快的镜像源(如阿里云、清华源)。在镜像构建过程中安装部署服务:使用配置好的 Yum 仓库,安装我们需要的服务(例如 Nginx、Vim、Net-tools 等),并做好基础配置。基于自定义镜像运行容器:验证服务在容器内是否能够正常运行。2. 环境准备与 Dockerfile 核心语法在写第一行 Dockerfile 之前,先确保你的环境能跑起来。2.1 宿主机环境检查Docker 可以运行在 Linux、macOS 和 Windows 上。对于学习而言,我建议使用 Linux 环境(物理机、虚拟机或云服务器均可),能避开很多桌面版的兼容性问题。在宿主机上执行以下检查:# 1. 检查内核版本(Linux 要求内核 3.10 以上) uname -r # 2. 检查 Docker 是否已安装及版本 docker --version # 3. 运行一个测试容器,验证 Docker 引擎工作正常 docker run hello-world如果docker --version报错,你需要先安装 Docker。在 CentOS 7 上,一个比较稳妥的安装步骤如下:# 卸载旧版本(如果有) sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine # 安装必要的依赖包 sudo yum install -y yum-utils # 添加 Docker 的官方 Yum 仓库(这里使用阿里云镜像加速) sudo yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 安装 Docker Engine sudo yum install -y docker-ce docker-ce-cli containerd.io # 启动 Docker 服务并设置开机自启 sudo systemctl start docker sudo systemctl enable docker # 将当前用户加入 docker 组,避免每次使用 sudo(操作后需