摘要

软件迭代部署过程中,开发环境、测试环境与生产环境之间的环境异构性是导致配置漂移与运行异常的核心诱因。Docker 作为开源的应用容器引擎,通过操作系统级虚拟化技术将应用程序及其完整依赖环境封装为轻量级、可移植的容器镜像,实现了代码与运行环境的一体化交付。本文系统阐述了 Docker 的技术演进、核心特性及 C/S 架构模型,深入剖析了镜像、容器与仓库三者的层次关系与协作机制,并在此基础上完整归纳了 Docker 服务生命周期、镜像管理及容器操作的核心命令语义与跨平台差异。研究表明,Docker 的沙箱隔离机制与极低性能开销,为跨环境软件部署提供了一种标准化、高可用的技术方案。

关键词:Docker;容器化;镜像;容器;仓库;配置漂移;操作语义


1. 引言

在现代软件工程实践中,项目迭代部署通常涉及三套核心环境:开发环境(Development Environment)测试环境(Testing Environment)生产环境(Production Environment)。三套环境分别面向开发人员、测试人员与运维人员,其用途、访问权限与运行规则存在本质差异,构成了企业项目上线的标准流程。

然而,这套看似规范的流程在实际执行中频繁遭遇环境水土不服问题。典型场景包括:开发人员在本地开发环境(如 JDK 8)中验证通过的代码,在测试服务器(如 JDK 7)上因运行环境版本不兼容而出现未知缺陷,甚至无法启动。此类因跨环境差异导致的程序异常,本质上属于配置漂移(Configuration Drift) 现象——即同一套代码在不同环境中因依赖库、操作系统或运行时参数的差异而产生不一致的行为表现 [1]。

解决该问题的核心思路在于环境一致性交付:不再单独交付代码,而是将代码与完整的运行环境整体打包,确保部署目标无论处于测试阶段还是生产阶段,均能获得与开发本地完全一致的运行上下文。实现该目标的关键技术即为容器化(Containerization),而 Docker 作为当前业界主流的容器引擎,已成为构建标准化交付流程的核心工具。


2. Docker 技术原理与核心概念

2.1 技术定义与演进

Docker 是一款基于 Go 语言开发的开源应用容器引擎,最初由 DotCloud 公司于 2013 年推出,后因技术生态迅速扩展,公司正式更名为 Docker Inc。从容器技术的本质来看,Docker 并非传统意义上的硬件虚拟化(Hardware Virtualization),而是基于 Linux 内核的 cgroups(控制组)namespaces(命名空间) 实现的操作系统级虚拟化(OS-level Virtualization) [2]。

Docker 的核心定义可概括为:将应用程序及其所需的全部依赖环境(包括操作系统基础库、运行时、配置文件等)打包为一个轻量级、可移植的容器。该容器可在任意主流 Linux 服务器上运行、迁移与部署,全程无需适配服务器本地环境,从而从根源上规避环境差异带来的兼容性风险。

2.2 核心特性

(1)沙箱隔离机制(Sandbox Isolation)

在同一台物理主机上,Docker 可同时运行多个容器实例,各容器之间通过内核命名空间实现进程、网络、文件系统的逻辑隔离。即使某一容器因异常而崩溃或宕机,亦不会影响其他容器的正常运行。

(2)轻量级与快速启动

与传统虚拟机技术相比,Docker 容器无需加载完整的客户机操作系统,仅封装项目所需的必要环境与依赖,因此资源占用极小,镜像体积通常为 MB 级别,容器的创建与启动可在秒级完成。

2.3 版本体系

自 2017 年 3 月(17.03 版本)起,Docker 正式划分为两大版本分支:

  • CE 社区版(Community Edition):完全免费且开源,包含 Docker 全部核心功能,适用于个人学习、中小型项目及基础开发场景;
  • EE 企业版(Enterprise Edition):付费版本,在 CE 核心功能基础上增加了企业级安全管控、镜像签名、技术支持等增值功能。

3. Docker 架构模型

Docker 采用经典的 客户端/服务器(Client/Server, C/S)架构,整体可划分为三层四大组件。

3.1 架构总览

层次组件功能定位
交互层Docker Client接收用户命令并转发至服务端
服务核心层Docker Host承载容器运行的物理或虚拟宿主机
服务核心层Docker Daemon常驻后台的核心服务进程,负责资源调度
资源仓库层Registry镜像的集中存储与分发中心

在这里插入图片描述

3.2 Docker Host 与核心资源

Docker Host 指安装了 Docker 程序的整台服务器,涵盖本地主机(Local Host)与远程主机(Remote Host)两种场景。Host 内部包含两类核心资源:镜像(Image)容器(Container)

镜像(Image) 是一种静态的、只读的模板(Template),相当于面向对象范式中的"类(Class)"。其内部封装了操作系统基础层、依赖库、配置及应用程序代码,本身不直接运行,仅作为创建容器的模板存在。

容器(Container) 是镜像的动态运行实例,相当于面向对象范式中的"对象(Object)"。容器在镜像的只读层之上附加了一个可写层(Writable Layer),为应用程序提供独立的隔离运行环境。镜像具有唯一性与可复用性,而容器具有多实例性——一个镜像可衍生出多个相互隔离的容器实例。

3.3 仓库体系(Registry)

仓库是用于持久化保存镜像文件的远程服务端,分为两类:

  • 公共仓库:以 Docker Hub 为代表的官方仓库,镜像资源丰富、开源免费,但服务器位于海外,国内访问可能存在网络延迟;
  • 私有仓库(Private Registry):企业或团队在内网自建,用于存放项目私有镜像,具备安全性高、传输速度快的特点。

3.4 Docker Daemon 与工作流程

Docker Daemon 是运行在 Host 内部的后台核心服务进程,开机自启、常驻后台,其核心职责包括:

  1. 监听并接收 Client 发来的所有 Docker 命令;
  2. 管理本机镜像的拉取(Pull)、构建(Build)与存储;
  3. 全权负责容器的创建、启动、停止、删除及资源调度。

标准工作流程如下:

  1. 用户在 Client 端输入 Docker 命令(如 docker run);
  2. Client 将请求发送至本机 Docker Daemon;
  3. Daemon 检测本地 Host 是否存在目标镜像,若不存在则从 Registry 拉取;
  4. Daemon 基于本地镜像在 Host 环境中创建并启动容器,完成服务运行。

4. Docker 核心操作语义

Docker 的操作命令围绕三大对象展开:服务(Daemon)镜像(Image)容器(Container)。以下按功能分类完整阐述其核心命令语义。

4.1 服务生命周期管理

Docker 服务进程的生命周期由操作系统的初始化系统(init system)管理。不同操作系统与初始化系统的命令集存在差异。

4.1.1 Linux(systemd 体系)

适用于 CentOS 7+、Ubuntu 16.04+ 等采用 systemd 作为初始化系统的发行版。systemd 是 Linux 内核启动后运行的第一个总管进程(PID 为 1),负责挂载文件系统、启动网络及各类后台服务。

操作命令
启动服务systemctl start docker
停止服务systemctl stop docker
重启服务systemctl restart docker
查看状态systemctl status docker
开机自启systemctl enable docker
禁用自启systemctl disable docker

若提示权限不足,可在命令前追加 sudo

4.1.2 Linux(SysV init 体系)

适用于未采用 systemd 的旧版 Linux 发行版。

操作命令
启动服务sudo service docker start
停止服务sudo service docker stop
重启服务sudo service docker restart
查看状态sudo service docker status
开机自启sudo chkconfig docker onsudo update-rc.d docker defaults
4.1.3 macOS 系统

macOS 上 Docker 以 Docker Desktop 应用形式运行。

方式一:Docker Desktop CLI(推荐,要求 Docker Desktop 4.37+)

操作命令
启动docker desktop start
停止docker desktop stop
重启docker desktop restart
查看状态docker desktop status

在这里插入图片描述
在这里插入图片描述

方式二:传统系统命令(适用于任意版本)

操作命令
启动open -a Docker
停止osascript -e 'quit app "Docker"'pkill -SIGHUP -f /Applications/Docker.app
查看状态docker info(测试连通性,需 Docker 已运行)
开机自启系统设置 → 通用 → 登录项,手动添加 Docker.app
4.1.4 Windows 系统

Windows 上 Docker 同样以 Docker Desktop 应用运行,并注册为系统服务。

方式一:Docker Desktop CLI(推荐,需 Docker Desktop 4.39+)

操作命令
启动docker desktop start
停止docker desktop stop
重启docker desktop restart
查看状态docker desktop status

方式二:PowerShell 服务命令(需管理员权限)

操作命令
启动Start-Service -Name "com.docker.service"
停止Stop-Service -Name "com.docker.service"
重启Restart-Service -Name "com.docker.service"
查看状态Get-Service com.docker.service
开机自启Set-Service com.docker.service -StartupType Automatic
禁用自启Set-Service com.docker.service -StartupType Disabled

方式三:CMD 的 net 命令(需管理员权限)

操作命令
启动net start com.docker.service
停止net stop com.docker.service
查看状态sc query com.docker.service
开机自启sc config com.docker.service start= auto(等号后须有空格)

使用服务命令前,请确认 Docker Desktop 的服务名称确为 com.docker.service,不同版本可能存在差异。


4.2 镜像管理

4.2.1 查看本地镜像
命令说明
docker images列出所有本地镜像(最常用)
docker image lsimages 的现代等效命令,功能相同
docker images -a列出所有镜像(包含中间层临时镜像)
docker images -q仅显示镜像 ID,常用于脚本批量操作
4.2.2 搜索远程镜像
命令说明
docker search nginx搜索 Docker Hub 上名称包含 nginx 的镜像
docker search nginx --limit 5只显示前 5 条结果
docker search --filter stars=100 nginx只显示收藏数大于 100 的镜像

docker search 返回的结果不会展示全部可用 tag 版本。如需了解某镜像支持的具体版本标签,需访问 hub.docker.com 查询。

4.2.3 拉取镜像
命令说明
docker pull nginx拉取 nginx 镜像(默认 latest 标签)
docker pull nginx:1.25拉取指定版本的镜像
docker pull ubuntu:22.04拉取指定操作系统版本的镜像
docker pull myregistry.com/myapp:v1从私有仓库拉取镜像
4.2.4 删除镜像
命令说明
docker rmi nginx删除名为 nginx 的镜像(标签为 latest
docker rmi nginx:1.25删除指定标签的镜像
docker rmi -f 镜像ID强制删除(即使有容器正在使用,也会强制移除,谨慎使用)
docker image rm 镜像IDrmi 的等效命令
docker rmi $(docker images -q)删除所有本地镜像(极度危险,执行前请确认)

重要约束:不同标签可以指向同一个镜像 ID(如 redis:latestredis:5.0 可能共享同一实体)。若直接用 ID 删除,系统会提示该镜像还有其他标签引用,无法彻底删除;此时必须使用 镜像名:tag 的形式先删除标签,当镜像无任何标签引用时,实体文件才会被真正删除。

4.2.5 镜像清理综合用法
场景推荐命令
清理悬空镜像(Dangling Images)docker image prune(需输入 y 确认)
清理所有未使用的镜像docker image prune -a
组合操作(拉取并运行)docker run -d nginx(若本地无镜像,会自动拉取,无需单独 pull

4.3 容器管理

4.3.1 创建与启动容器

docker run [参数] 镜像名 [容器内命令] 是容器管理中最核心的命令,常用参数语义如下:

参数语义
-d后台运行(Detached),将容器与当前宿主机终端生命周期解耦,终端关闭或按 Ctrl+C 不会影响容器运行
-i--interactive保持容器进程的标准输入(STDIN)处于开放状态,使容器具备接收外部输入的基础条件;该参数仅保证输入通道就绪,不保证数据正在传输
-t--tty为容器进程分配伪终端,提供具备完整终端语义的虚拟交互界面,将输入输出包装为符合终端规范的格式
-it组合使用,进入容器交互式命令行;若无客户端连接,容器通常会自动关闭,-i 可维持容器持续运行
-p 宿主机端口:容器端口端口映射,使外部网络可访问容器内部服务
-v 宿主机目录:容器内目录数据卷挂载,实现宿主机与容器间的数据持久化共享
--name 容器名字自定义容器名称,便于后续操作引用
-e KEY=VALUE设置环境变量(如 MySQL 的 root 密码)
--restart=always配置容器随 Docker 服务重启或宿主机开机而自动启动

参数行为辨析-i-t 的功能具有本质差异。-i 修改的是进程 I/O 初始化配置,强制 Docker Daemon 在创建容器时将 STDIN 关联到活跃管道而非空设备;-t 则负责提供虚拟终端界面。二者组合方可实现完整的交互式终端体验。-d 将容器进程交由 Daemon 直接托管于后台,执行后终端立即失去控制权。

4.3.2 查看容器
命令说明
docker ps列出当前运行中的容器
docker ps -a列出所有容器(含已停止状态),日常排查建议必加 -a
4.3.3 进入容器
命令说明行为特征
docker exec -it 容器名 /bin/bash日常调试首选在容器内新开终端会话,执行 exit 退出后,容器主进程不受影响,继续保持运行
docker attach 容器名直接连接到容器主进程执行 exit 退出后,容器会直接停止运行(主进程结束),生产环境应谨慎使用

建议:除非特殊情况,应永远优先使用 docker exec

4.3.4 启停与删除容器
操作核心命令使用场景与提醒
启动容器docker start 容器名用于启动之前 createstop 过的容器
停止容器docker stop 容器名优雅退出(Graceful Shutdown),向进程发送 SIGTERM 信号,给予保存数据的时间;若无法停止,再用 docker kill
删除容器docker rm 容器名删除已停止的容器
强制删除docker rm -f 容器名直接删除正在运行的容器(不推荐,最好先停再删)
查看容器信息docker inspect 容器名查看底层 JSON 配置(IP、挂载、环境变量等)
查看容器日志docker logs 容器名查看容器运行日志,用于排查报错
4.3.5 典型实操场景

场景一:交互式创建并进入容器

docker run -it --name=c1 centos:7 /bin/bash

该命令以交互模式创建名为 c1 的 CentOS 7 容器,并直接进入其 Bash 终端。通过 exit 退出后,容器自动关闭。
在这里插入图片描述

场景二:后台创建并持久运行

docker run -id --name=c1 centos:7 /bin/bash

该命令以分离模式(-d)创建容器,不立即进入终端。后续可通过 docker exec -it c1 /bin/bash 进入容器完成操作,执行 exit 后容器不会自动关闭,继续保持后台运行。

在这里插入图片描述


5. 结论

本文系统分析了软件部署中的环境异构性问题,阐述了 Docker 容器技术的基本原理、C/S 架构模型及核心操作语义。Docker 通过镜像-容器的模板-实例机制、沙箱隔离及轻量级虚拟化,实现了代码与运行环境的一体化打包交付,有效消除了开发、测试与生产环境之间的配置漂移。其基于 Daemon 的集中式资源管理,配合 Registry 仓库的分发能力,为现代 DevOps 实践中的持续集成与持续部署(CI/CD)提供了标准化的技术基础。

未来研究可进一步关注 Docker 在 Kubernetes 编排体系下的集群调度策略、容器运行时安全加固机制,以及容器镜像的层存储(Layered Storage)优化技术。


参考文献

[1] HOXMEIER J A. Software Quality and IS Project Manager Competencies: An Exploratory Study[J]. Information Systems Management, 2000, 17(2): 19-26.

[2] FELTER W, FERREIRA A, RAJAMONY R, et al. An Updated Performance Comparison of Virtual Machines and Linux Containers[C]//2015 IEEE International Symposium on Performance Analysis of Systems and Software (ISPASS). IEEE, 2015: 171-172.

[3] MERKEL D. Docker: Lightweight Linux Containers for Consistent Development and Deployment[J]. Linux Journal, 2014, 2014(239): 2.

[4] BERNSTEIN D. Containers and Cloud: From LXC to Docker to Kubernetes[J]. IEEE Cloud Computing, 2014, 1(3): 81-84.

[5] TURNBULL J. The Docker Book: Containerization is the New Virtualization[M]. James Turnbull, 2014.


Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐