1105-容器技术与Docker入门
title: 【Docker入门】容器技术发展史 | Docker架构与安装 | Docker镜像与容器管理全流程详解
date: 2026-11-05
categories:
- Docker
- 容器技术
tags: - Docker
- 容器
- Cgroups
- Namespace
- Docker镜像
- Docker容器
前言
本文详细梳理了容器技术的发展历程、Docker的核心架构、从环境搭建到镜像/容器管理的完整实践流程。内容覆盖容器发展史、Docker架构解析、CentOS 7 上安装 Docker、镜像仓库配置、镜像管理命令、容器生命周期管理等核心知识点。
一、容器技术介绍
1.1 容器发展史
早期隔离思想
这一阶段是操作系统级虚拟化萌芽,各BSD、商业Unix各自实现隔离,但没有统一Linux原生方案。
-
1979 年:Unix chroot() 系统调用。Unix V7 引入
chroot,修改进程根目录,实现文件系统隔离。仅做目录隔离,没有CPU、内存、网络隔离,是容器最早的技术原型。root 破解密码
/dev/centos/root /mnt/sysroot
mount -o rw,remount /mnt/sysroot
chroot /mnt/sysroot/
-
1998 年 FreeBSD Jails。FreeBSD 推出 Jails,在 chroot 基础上增加进程、网络隔离,可以在一台主机运行多个独立"虚拟系统",面向服务隔离,是现代容器思想重要实践。
-
2000 年 Solaris Zones。Solaris Zones,操作系统级虚拟化,CPU/内存/网络/文件系统完整隔离,Oracle 商用操作系统容器方案。
Linux 内核关键技术
Namespace 做隔离,Cgroups 做资源限制,两大基石全部就位,Linux 容器底层能力完备。
| 时间 | 技术 | 作用 |
|---|---|---|
| 2002 | PID Namespace | 进程ID隔离,容器内部拥有独立PID编号 |
| 2003 | Network Namespace | 网络栈隔离,每个容器独立网卡、IP、路由表 |
| 2004‑2006 | IPC、Mount Namespace | 进程间通信隔离;挂载点隔离 |
| 2007 | Cgroups | Google工程师开发,CPU/内存/IO/网络带宽资源限制 |
| 2008 | User Namespace | 用户UID/GID隔离,容器内部root不等于宿主机root |
LXC 容器诞生
- 2008:LXC(Linux Containers)项目启动。基于 Namespace + Cgroups 封装,世界上第一个完整 Linux 用户态容器工具。痛点:没有镜像机制,配置复杂,分发困难。
- 2010:CloudFoundry Warden。VMware 推出 Warden,容器管理服务,做资源隔离与实例生命周期管理。
- 2013 dotCloud 内部项目孵化 Docker。dotCloud 是一家 PaaS 云厂商,内部做容器工具,解决 LXC 镜像、打包分发痛点。
Docker 爆发
- 2013‑06:Docker 0.1 正式对外发布。基于 LXC,核心创新:镜像分层、Dockerfile、镜像仓库、统一工具链。
- 2014‑06:Docker 1.0 正式版发布,生产可用。Docker Hub 公共镜像仓库大规模使用。
- 2014 年 7 月:Docker 切换 libcontainer。抛弃 LXC,自研 libcontainer,直接调用 Linux 系统调用。
- 2015‑06:OCI 开放容器基金会成立。Linux 基金会主导,制定容器镜像规范、容器运行时规范。
Kubernetes 崛起
- 2015‑07:Kubernetes 1.0 发布。Google 开源 K8s,基于 Borg 经验,容器集群编排。
- 2016:runc 正式发布。OCI 标准运行时,libcontainer 改名 runc。
- 2016:containerd 项目诞生。Docker 拆分出 containerd,高级容器运行时。
- 2017:Kubernetes 进入 CNCF。K8s 移交 CNCF 托管,成为容器编排事实标准。
云原生生态成熟
- 2019:Kubernetes 1.24 正式移除 dockershim。containerd 成为 K8s 默认容器运行时。
- 2020‑2023:Podman + Buildah 普及。红帽 Podman,无守护进程容器工具。
- 2024‑2026:WebAssembly 容器、轻量容器兴起。
极简时间轴
| 时间 | 里程碑事件 | 核心价值 |
|---|---|---|
| 1979 | Unix chroot | 文件系统隔离原型 |
| 1998 | FreeBSD Jails | 完整 OS 级隔离雏形 |
| 2007 | Linux Cgroups 合入内核 | 资源限制基石 |
| 2008 | LXC 项目诞生 | 第一个 Linux 容器工具 |
| 2013 | Docker 发布 | 镜像+Dockerfile,容器大众化 |
| 2015 | OCI 成立;K8s 1.0 | 标准化 + 集群编排时代开启 |
| 2016 | runc、containerd | 分层容器运行时架构 |
| 2017 | K8s 移交 CNCF | K8s 成为编排事实标准 |
| 2022 | K8s 彻底移除 dockershim | containerd 成为 K8s 默认运行时 |
| 2023 至今 | Wasm 容器、安全容器 | 轻量、强隔离新方向 |
1.2 什么是容器?
容器是操作系统级虚拟化技术,在同一台宿主机操作系统之上,把应用程序以及它的依赖库、配置文件、环境变量打包在一起,实现相互隔离的运行环境。
传统的虚拟化技术(VMWare, KVM, Xen)目标是创建完整的虚拟机,需要安装整个操作系统(几十 GB)。而容器共享同一个 Host OS,体积更小、启动更快。

容器 vs 虚拟机对比
| 特性 | 容器 | 虚拟机 |
|---|---|---|
| 启动速度 | 秒级 | 分钟级 |
| 性能 | 接近原生 | 较弱 |
| 内存代价 | 很小 | 较多 |
| 硬盘使用 | 一般为 MB | 一般为 GB |
| 运行密度 | 单机支持上千个容器 | 一般几十个 |
| 隔离性 | 安全隔离 | 完全隔离 |
| 迁移性 | 优秀 | 一般 |
1.3 容器解决的问题
软件开发面临着服务多样 + 环境多样的挑战,各种服务和环境通过排列组合产生了一个 N×M 的大矩阵。
聪明的技术人员从传统的运输行业找到了答案。
几十年前,运输业面临着类似问题:货物类型不同、交通工具不同,装卸成本高、货物易损坏。集装箱的发明解决了这个难题——任何货物都放到各自的集装箱中,标准集装箱可以被高效地装卸、重叠和长途运输。
Docker 将集装箱思想运用到软件打包上,为代码提供了基于容器的标准化运输系统。"集装箱"和"容器"对应的英文单词都是 “Container”。
1.4 容器的优势
| 角色 | 优势 | 核心价值 |
|---|---|---|
| 开发人员 | Build Once, Run Anywhere | 环境隔离和可重复性,只需创建一次运行环境 |
| 运维人员 | Configure Once, Run Anything | 消除开发、测试、生产环境的不一致性 |
1.5 容器生态系统
容器核心技术
| 分类 | 关键技术 | 说明 |
|---|---|---|
| 容器规范 | OCI runtime spec / image format spec | 确保不同容器之间的兼容性和可移植性 |
| 容器 runtime | lxc、runc、rkt | 跟操作系统 kernel 紧密协作,为容器提供运行环境 |
| 容器管理工具 | lxd、docker engine、rkt cli | 对内与 runtime 交互,对外为用户提供 CLI |
| 容器定义工具 | docker image、dockerfile、ACI | 允许用户定义容器的内容和属性 |
| Registry | Docker Registry、Docker Hub、Quay.io | 集中存放镜像文件的仓库 |
| 容器 OS | CoreOS、atomic、ubuntu core | 专门运行容器的操作系统,体积更小、启动更快 |
容器平台技术
容器编排引擎
基于容器的应用一般采用微服务架构:应用被划分为不同组件,以服务形式运行在各自容器中,通过 API 对外提供服务。每个组件运行多个容器组成集群,动态创建、迁移和销毁。
编排包括容器管理、调度、集群定义和服务发现等。
主流编排引擎:
- Docker Swarm:Docker 开发的容器编排引擎
- Kubernetes:Google 领导开发的开源容器编排引擎,支持 Docker 和 CoreOS 容器
- Mesos + Marathon:通用集群资源调度平台
容器管理平台
| 类型 | 平台 | 特点 |
|---|---|---|
| 开源免费 | Rancher | 轻量级 K8s 管理平台,支持多集群 |
| 开源免费 | OpenShift | Red Hat 企业级 K8s 发行版 |
| 开源免费 | KubeSphere | 青云开源,可视化界面降低 K8s 门槛 |
| 商业云 | AWS EKS / Azure AKS / 阿里云 ACK | 托管 K8s 服务,无缝对接各自云生态 |
| 轻量工具 | Portainer | 超轻量容器管理 UI,支持 Docker 和 K8s |
| 开发工具 | Docker Desktop | 内置 K8s,适合开发者本地测试 |
| IDE 工具 | Lens | K8s IDE,可视化管理 K8s 集群 |
容器支持技术
| 分类 | 代表方案 | 作用 |
|---|---|---|
| 容器网络 | docker network、flannel、weave、calico | 管理容器间的连通性和隔离性 |
| 服务发现 | etcd、consul、zookeeper | 保存微服务最新信息(IP、端口),提供查询 |
| 监控 | docker ps/top/stats、sysdig、cAdvisor | 监控容器运行状态 |
| 数据管理 | Flocker | 保证持久化数据动态迁移 |
| 日志管理 | docker logs、logspout | 日志收集和路由 |
| 安全性 | OpenSCAP | 对容器镜像进行扫描,发现潜在漏洞 |
二、Docker 介绍
2.1 Docker 简介
Docker 是基于 Go 语言实现的开源容器项目,诞生于 2013 年年初,最初发起者是 dotCloud 公司。
- Docker 提供了各种容器管理工具,可以更简单明了地管理和使用容器
- Docker 引入分层文件系统构建和高效的镜像机制,极大地提升了用户体验
可以将 Docker 容器理解为一种轻量级的沙盒(sandbox)。每个容器内运行着一个应用,不同容器相互隔离,容器之间可以通过网络互相通信。

2.2 Docker 架构
Docker 采用 C/S(客户端/服务端)架构,整体由三大部分组成:

Docker 客户端 (Client)
Client 客户端是我们日常执行 docker 命令的终端,是用户交互入口。客户端本身不直接做容器创建工作,只是把指令发送给 Docker Daemon。
典型命令:
docker build:构建镜像docker pull:从远程镜像仓库拉取镜像docker run:基于本地镜像创建并启动容器
Docker 宿主机 (Docker Host)
宿主机上运行核心组件 Docker daemon,是整个 Docker 架构的服务端。包含两大资源:
Images 镜像
镜像是只读的模板,相当于容器的安装包/模板,包含应用程序、依赖库、配置文件。
- 可通过
docker build本地构建生成 - 可通过
docker pull从 Registry 远程仓库下载 - 采用分层存储,多个镜像可以共享底层,节约磁盘
- 镜像本身只读,不能直接运行镜像,必须基于镜像实例化为容器
Containers 容器
容器是镜像的运行实例。
docker run命令在镜像之上增加一层可读写层,生成容器- 一台宿主机可以同时运行多个容器
- 容器拥有独立隔离环境,本质是宿主机上受 Namespace、Cgroups 管控的进程
- 容器内产生的数据写在读写层,镜像本身不会被修改;容器删除后读写层数据默认丢失
Registry 镜像仓库
远程镜像仓库用来存放、分发 Docker 镜像(例如 Docker Hub)。
docker pull:daemon 向 registry 请求,把镜像下载到本地 Imagesdocker push:可以把本地做好的镜像上传到仓库
完整交互流程
1. 用户在 Client 执行 docker run nginx,将请求发送给 Docker daemon
2. daemon 访问 Registry 镜像仓库,下载 nginx 镜像,保存到本机 Images
3. daemon 读取本地 nginx 镜像,创建容器需要的网络、存储等资源,运行 Container 容器
2.3 Docker 版本演进
| 阶段 | 时间 | 版本格式 | 重要版本 |
|---|---|---|---|
| 语义化 1.x | 2013‑2017‑02 | 主.次.补丁 | 0.1(首发)、1.0(生产可用)、1.12(Swarm+healthcheck)、1.13(1.x最后版本) |
| 日历版 CE/EE | 2017‑03 ~ 2022‑06 | YY.MM.Patch | 20.10(经典稳定版,存量环境大量使用)、22.06(日历版终点) |
| 回归语义化 | 2023‑02 至今 | 主.次.补丁 | 23.0(默认 BuildKit)、24.0/25.0(生产推荐) |
三、搭建学习环境
3.1 实验环境
| 组件 | 选型 |
|---|---|
| 操作系统 | CentOS 7(最小化安装) |
| 容器 runtime | runc |
| 管理工具 | Docker Engine |
3.2 安装 Docker
环境准备
搭建本地 DVD 仓库
[root@docker ~]# mkdir /dvd
[root@docker ~]# cp /etc/fstab /etc/fstab.bak
[root@docker ~]# echo '/dev/sr0 /dvd iso9660 defaults 0 0'>> /etc/fstab
[root@docker ~]# mount /dvd
mount: /dev/sr0 写保护,将以只读方式挂载
[root@docker ~]# ls /dvd
CentOS_BuildTag EULA images LiveOS repodata RPM-GPG-KEY-CentOS-Testing-7
EFI GPL isolinux Packages RPM-GPG-KEY-CentOS-7 TRANS.TBL
⚠️ 如果提示"在 /dev/sr0 上找不到媒体",需要编辑虚拟机关联对应 ISO 文件。
# 配置本地 yum 仓库
[root@docker ~]# mkdir /etc/yum.repos.d/bak
[root@docker ~]# mv /etc/yum.repos.d/*repo /etc/yum.repos.d/bak
[root@docker ~]# vim /etc/yum.repos.d/dvd.repo
[dvd]
name=local repo from dvd
baseurl=file:///dvd
gpgcheck=0
[root@docker ~]# yum clean all
[root@docker ~]# yum makecache
配置防火墙
# 防火墙不能关闭,部分容器服务需要防火墙的 NAT 功能
[root@docker ~]# systemctl enable firewalld.service --now
[root@docker ~]# firewall-cmd --set-default-zone=trusted
配置 Docker 仓库
[root@docker ~]# cat > /etc/yum.repos.d/docker-ce.repo <<'EOF'
[docker-ce-stable]
name=Docker CE Stable - $basearch
baseurl=https://mirrors.huaweicloud.com/docker-ce/linux/centos/7/$basearch/stable
enabled=1
gpgcheck=0
EOF
All-in-One 部署
安装软件
[root@docker ~]# yum install -y docker-ce
[root@docker ~]# systemctl enable docker.service --now
配置镜像加速
目前无法从 docker.io 仓库直接下载镜像,需要通过国内镜像加速服务器下载:
[root@docker ~]# mkdir -p /etc/docker
[root@docker ~]# tee /etc/docker/daemon.json <<'EOF'
{
"insecure-registries": ["hub.laoma.cloud"],
"registry-mirrors": ["http://hub.laoma.cloud","https://docker.m.daocloud.io"]
}
EOF
[root@docker ~]# systemctl restart docker

其他加速站点:华为加速 https://09def58152000fc00ff0c00057bad7e0.mirror.swr.myhuaweicloud.com
验证安装
# 查看 Docker 版本
[root@docker ~]# docker --version
Docker version 26.1.3, build b72abbb
# 运行第一个容器
[root@docker ~]# docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete
Digest: sha256:e7c70bb24b462baa86c102610182e3efcb12a04854e8c582838d92970a09f323
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
过程分析: ① 从 Docker Hub 下载 hello-world 镜像 → ② 启动 hello-world 容器
# 运行第二个容器 - Apache HTTP Server
[root@docker ~]# docker run -d -p 80:80 httpd
Unable to find image 'httpd:latest' locally
latest: Pulling from library/httpd
852e50cd189d: Pull complete
...
817f24cca3514568f9b7a7cac6f183734077fb74caf4c62502acd2a4d0d29520
过程分析: ① 从 Docker Hub 下载 httpd 镜像 → ② 启动 httpd 容器,并将容器的 80 端口映射到 Host 的 80 端口
验证 HTTP 服务:
[root@docker ~]# ip -br a
ens33 UP 10.1.8.130/24
[root@docker ~]# curl 10.1.8.130
<html><body><h1>It works!</h1></body></html>
✅ 可以访问容器的 http 服务了,第一个容器运行成功!
C/S 分离部署
Server 端
# 安装软件
[root@docker ~]# dnf install -y docker-ce
# 配置服务,允许远程连接
[root@docker ~]# vim /usr/lib/systemd/system/docker.service
# 在 ExecStart 参数中最后添加 -H tcp://0.0.0.0:2375
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375
[root@docker ~]# systemctl daemon-reload
[root@docker ~]# systemctl enable docker.service --now
# 验证端口监听
[root@docker ~]# lsof -i :2375
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
dockerd 2565 root 3u IPv6 76021 0t0 TCP *:2375 (LISTEN)
Client 端
# 只安装 CLI 工具
[root@client ~]# dnf install -y docker-ce-cli
# 远程运行容器
[root@client ~]# docker -H 10.1.8.130 run hello-world
Hello from Docker!
...
# 查看远程镜像
[root@client ~]# docker -H 10.1.8.130 images
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd latest 0a30f4c29d25 2 weeks ago 138MB
hello-world latest bf756fb1ae65 11 months ago 13.3kB
💡 Client 只做管理,image 和 container 都存储在 Server 端。
3.3 Docker 对 Windows 的支持
Docker Engine 可通过 Docker Desktop 在 Windows、macOS 和 Linux 系统上使用。Windows 版本的 Docker Desktop 需要在 WSL(Windows Subsystem for Linux) 或 Hyper-V 两种架构上运行。
详情参考:https://docs.docker.com/desktop/setup/install/windows-install/
四、Docker 镜像管理
Docker 镜像类似于虚拟机镜像,可以理解为一个只读的模板。镜像是创建 Docker 容器的基础。
4.1 search - 查找镜像
[root@docker ~]# docker search --help
Usage: docker search [OPTIONS] TERM
Options:
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print search using a Go template
--limit int Max number of search results (default 25)
--no-trunc Don't truncate output
查询镜像有哪些版本
Docker 本身没有直接查看远程仓库镜像所有版本的命令,可以通过以下方式实现:
方法 1:使用 curl 调用 Docker Hub API(推荐)
# 查询官方镜像版本(注意加 library/ 前缀)
curl -s "https://registry.hub.docker.com/v2/repositories/library/nginx/tags/" | jq '.results[].name'
# 查询非官方镜像版本
curl -s "https://registry.hub.docker.com/v2/repositories/bitnami/mysql/tags/" | jq '.results[].name'
方法 2:通过 Docker Hub 网页端查看
访问 https://hub.docker.com/ 搜索镜像,进入详情页点击 Tags 标签。
查询 Harbor 仓库镜像版本
# 查询项目清单
curl -s "http://hub.laoma.cloud/api/v2.0/projects" | jq -r '.[].name'
# 查询项目下有哪些镜像
curl -s "http://hub.laoma.cloud/api/v2.0/projects/library/repositories" | jq -r '.[].name'
# 查询特定镜像标签
curl -s "http://hub.laoma.cloud/api/v2.0/projects/library/repositories/nginx/artifacts" | jq -r '.[].tags[].name' | sort -V
# 带认证查询
curl -s -u student:Student123 "http://hub.laoma.cloud/api/v2.0/projects/library/repositories/nginx/artifacts" | jq -r '.[].tags[].name' | sort -V
4.2 pull - 获取镜像
镜像加速配置
(见上文 3.2 节"配置镜像加速")
获取镜像
镜像标准命名格式:服务器地址:端口/分类/镜像名:tag
[root@docker ~]# docker image pull centos:8
Using default tag: latest
latest: Pulling from library/centos
3c72a8ed6814: Pull complete
Digest: sha256:76d24f3ba3317fa945743bb3746fbaf3a0b752f10b10376960de01da70685fbd
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest
下载过程中可以看到镜像由若干层(layer)组成。当不同镜像包含相同层时,本地仅存储一份,减小存储空间。
直接从镜像服务器下载
[root@docker ~]# docker image pull registry.access.redhat.com/ubi8
4.3 ls - 查看本地镜像列表
[root@docker ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd latest 958373fdd7e8 4 months ago 148MB
hello-world latest 74cc54e27dc4 4 months ago 10.1kB
centos 8 5d0da3dc9764 3 years ago 231MB
# 只显示仓库名和标签
[root@docker ~]# docker image ls --format "{{.Repository}}:{{.Tag}}"
💡 tag 用于标明镜像不同版本。一个镜像可以有多个 TAG,占用本地实际空间只有一个镜像。
4.4 tag - 镜像打标签
[root@docker ~]# docker image tag centos:8 myos
[root@docker ~]# docker image tag centos:8 myos:v1
[root@docker ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd latest 958373fdd7e8 4 months ago 148MB
hello-world latest 74cc54e27dc4 4 months ago 10.1kB
centos 8 5d0da3dc9764 3 years ago 231MB
myos latest 5d0da3dc9764 3 years ago 231MB
myos v1 5d0da3dc9764 3 years ago 231MB
Tag 使用最佳实践
假设发布了镜像 myimage 的 v1.9.1 版本,可以打上四个 tag:1.9.1、1.9、1 和 latest。
过一段时间发布 v1.9.2,打上 1.9.2 的 tag,并将 1.9、1 和 latest 从 v1.9.1 移到 v1.9.2。
之后 v2.0.0 发布,打上 2.0.0、2.0 和 2 的 tag,并将 latest 移到 v2.0.0。
这种方案让用户选择非常灵活:
| Tag | 含义 |
|---|---|
| myimage:1 | 始终指向 1.x 分支中最新的镜像 |
| myimage:1.9 | 始终指向 1.9.x 中最新的镜像 |
| myimage:latest | 始终指向所有版本中最新的镜像 |
| myimage:1.9.1 | 使用特定版本 |
4.5 inspect - 查看本地镜像详细信息
[root@docker ~]# docker image inspect myos
[
{
"Id": "sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6",
"RepoTags": ["centos:8", "myos:latest", "myos:v1"],
"Architecture": "amd64",
"Os": "linux",
"Size": 231268856,
...
}
]
# 过滤特定字段
[root@docker ~]# docker image inspect myos -f '{{.Architecture}}'
amd64
[root@docker ~]# docker image inspect myos -f '{{.Os}}'
linux
4.6 history - 查看本地镜像分层信息
[root@docker ~]# docker image history myos
IMAGE CREATED CREATED BY SIZE COMMENT
5d0da3dc9764 3 years ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 3 years ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 3 years ago /bin/sh -c #(nop) ADD file:805cb5e15fb6e0bb0… 231MB
# 不压缩输出行
[root@docker ~]# docker image history myos --no-trunc
4.7 rm - 删除本地镜像
通过标签删除
[root@docker ~]# docker image rm myos
Untagged: myos:latest
[root@docker ~]# docker image rm myos:v1
Untagged: myos:v1
[root@docker ~]# docker image rm centos:8
Untagged: centos:8
Deleted: sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6
Deleted: sha256:74ddd0ec08fa43d09f32636ba91a0a3053b02cb4627c35051aff89f853606b59
💡 当同一个镜像拥有多个标签时,删除指定标签只是移除标签,不影响镜像文件。删除最后一个标签才会真正删除镜像。
通过 ID 删除镜像
[root@docker ~]# docker image rm 958373fdd7e8
Untagged: httpd:latest
Deleted: sha256:958373fdd7e8d15f3df0c9927bcb7d3b565afc6e3ebb1c141defd5341a72fb13
...
4.8 prune - 修剪本地镜像
[root@docker ~]# docker image prune -a <<< "y"
WARNING! This will remove all images without at least one container associated to them.
...
Total reclaimed space: 117.7MB
💡 被容器使用的镜像不会被删除。
4.9 save - 保存本地镜像为文件
镜像默认存储在 /var/lib/docker/overlay2,通过文件系统层面拷贝操作复杂。使用 save 命令可以将本地镜像保存为单个文件,方便分享。
[root@docker ~]# docker save httpd -o httpd.tar
[root@docker ~]# docker save httpd hello-world -o images.tar
[root@docker ~]# ls *tar
httpd.tar images.tar
4.10 load - 将本地镜像文件导入本地
# 删除本地镜像(-f 强制删除正在使用的镜像)
[root@docker ~]# docker image rm httpd hello-world:latest -f
# 导入镜像
[root@docker ~]# docker image load -i images.tar
Loaded image: httpd:latest
Loaded image: hello-world:latest
[root@docker ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd latest 958373fdd7e8 4 months ago 148MB
hello-world latest 74cc54e27dc4 4 months ago 10.1kB
4.11 push - 将本地镜像推送到服务器
登录 Docker Hub
[root@docker ~]# docker login
Login with your Docker ID to push and pull images from Docker Hub.
Username: mage16196
Password:
Login Succeeded
⚠️ docker.io 站点目前可能无法访问,会因登录超时失败。
推送镜像
上传的镜像格式:username/image:tag
[root@docker ~]# docker image tag hello-world:latest mage16196/myhello
[root@docker ~]# docker image push mage16196/myhello
The push refers to repository [docker.io/mage16196/myhello]
9c27e219663c: Layer already exists
latest: digest: sha256:90659bf80b44ce6be8234e6ff90a1ac34acbeb826903b02cfa0da11c82cbc042 size: 525
五、Docker 容器管理
容器是镜像的运行实例,可以启动、停止、删除,彼此相互隔离。
5.1 ls - 查看容器列表
# 查看运行中的容器
[root@docker ~]# docker container ls
# 查看所有容器(包括已停止的)
[root@docker ~]# docker container ls -a
# 按状态过滤
[root@docker ~]# docker container ls -f status=exited
5.2 create - 创建容器
[root@docker ~]# docker container create centos:8
12ea7f12e5999922e84ee79fba022b78cb438a842918497d657020dbd5d4e892
# 创建时指定名称和主机名
[root@docker ~]# docker container create -it --name myos -h myos centos:8
90b76d97b57602ca273ea7b120ea187dcd0dc46c1b4f273ddb2f4fdb51a97256
5.3 start - 启动容器
# 后台启动
[root@docker ~]# docker container start 12ea7f1
# 前台启动并附加终端
[root@docker ~]# docker container start -ai myos
[root@myos /]# ls
bin etc lib lost+found mnt proc run srv tmp var
dev home lib64 media opt root sbin sys usr
[root@myos /]# exit
exit
5.4 top - 查看容器中运行的进程
[root@docker ~]# docker container start be05a7c31635
[root@docker ~]# docker container top be05a7c31635
UID PID PPID C STIME TTY TIME CMD
root 3439 3419 0 12:17 ? 00:00:00 httpd -DFOREGROUND
33 3464 3439 0 12:17 ? 00:00:00 httpd -DFOREGROUND
5.5 stats - 实时查看容器状态
# 查看所有运行容器
[root@docker ~]# docker container stats
# 查看特定容器
[root@docker ~]# docker container stats be05a7c31635
# 只拉取一次结果(不持续刷新)
[root@docker ~]# docker container stats --no-stream
# 自定义输出格式
[root@docker ~]# docker container stats --format '{{.Container}}\t{{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}'
5.6 inspect - 查看容器详细信息
# 输出完整 JSON 格式信息
[root@docker ~]# docker container inspect be05a7c31635
# 过滤特定字段
[root@docker ~]# docker container inspect be05a7c31635 -f '{{.State.Pid}}'
3439
[root@docker ~]# docker container inspect be05a7c31635 -f '{{.NetworkSettings.Networks.bridge.IPAddress}}'
172.17.0.2
5.7 run - 创建并启动容器
docker container run 相当于先 create 容器,再 start 容器。
run 命令后台操作流程
- 检查本地是否存在指定镜像,不存在就从公有仓库下载
- 利用镜像创建一个容器,并启动该容器
- 分配文件系统,在只读镜像层外面挂载一层可读写层
- 从宿主主机网桥接口中桥接一个虚拟接口到容器中
- 从网桥地址池配置一个 IP 地址给容器
- 执行用户指定的应用程序
- 执行完毕后容器被自动终止
常用示例
# 运行单次命令
[root@docker ~]# docker container run centos:8 echo hello world
hello world
# 交互式运行(不指定命令时使用镜像 Cmd 定义)
[root@docker ~]# docker container run -it centos:8
[root@81dcdde75726 /]# exit
exit
💡 运行 bash 的容器,exit 后自动处于 Exited 状态——容器中的主进程退出,容器也就没有继续运行的必要了。
后台运行(-d 选项)
容器以守护态(Daemonized)形式在后台运行:
[root@docker ~]# docker run -d centos:8 sh -c 'while true;do echo sleep 5;sleep 5;done'
5bd4eb2e348b818b5495a0d80d7f53c9cda8ce2ea8579514b30b216fb439d7ae
临时运行(–rm 选项)
执行完命令后自动删除该容器:
[root@docker ~]# docker container run --name test --rm centos:8 echo hello world
hello world
# 容器执行完自动删除
自动重启(–restart 选项)
# 对比测试:test1 默认策略,test2 使用 always 策略
[root@docker ~]# docker container run --name test1 -it centos:8
[root@e35a8bef9ac2 /]# exit
exit
[root@docker ~]# docker container run --name test2 -it --restart=always centos:8
[root@345564ac9405 /]# exit
exit
# 结果:test1 退出后保持 Exited;test2 退出后自动重启
[root@docker ~]# docker container ls -a|grep test[12]
345564ac9405 centos:8 "/bin/bash" 15 seconds ago Up 11 seconds test2
e35a8bef9ac2 centos:8 "/bin/bash" 46 seconds ago Exited (0) 44 seconds ago test1
5.8 logs - 查看容器日志
# 查看容器日志
[root@docker ~]# docker logs 5bd4eb2e
# 动态跟踪日志(类似 tail -f)
[root@docker ~]# docker logs -f 5bd4eb2e
5.9 进入容器
attach - 关联容器
[root@docker ~]# docker container attach 5bd4eb2e348b
sleep 5
sleep 5
sleep 5
⚠️ attach 的缺点:
- 对于后台运行、没有标准输入的容器,只能关联标准输出
- 多个窗口 attach 同一个容器时,所有窗口同步显示
- 某个窗口因命令阻塞时,其他窗口无法操作
exec - 在容器内执行新命令(推荐)
[root@docker ~]# docker container exec -it 5bd4eb2e348b bash
[root@5bd4eb2e348b /]# echo hello
hello
[root@5bd4eb2e348b /]# exit
exit
✅ 通过 exec 命令对容器执行操作是最为推荐的方式——在不影响容器内其他应用的前提下与容器进行交互。
5.10 停用容器
stop - 停止容器
先发送 SIGTERM 信号,10 秒内未终止则发送 SIGKILL:
[root@docker ~]# docker container stop test2
test2
kill - 杀死容器
直接发送 KILL 信号:
[root@docker ~]# docker container kill be05a7c31635
be05a7c31635
# 容器退出码 137 = 128 + 9 (SIGKILL)
5.11 restart - 重启容器
# 相当于先 stop 再 start;如果容器已 exited,直接 start
[root@docker ~]# docker container restart be05a7c31635
be05a7c31635
5.12 pause / unpause - 暂停与恢复容器
# 暂停容器
[root@docker ~]# docker container pause 5bd4eb2e348b
5bd4eb2e348b
[root@docker ~]# docker container ls -a|grep 5bd4eb2e348b
5bd4eb2e348b centos:8 "sh -c 'while true;d…" Up 14 minutes (Paused) nervous_visvesvaraya
# 恢复容器
[root@docker ~]# docker container unpause 5bd4eb2e348b
5bd4eb2e348b
5.13 删除容器
rm - 删除容器
# 默认只能删除处于终止/退出状态的容器
[root@docker ~]# docker container rm test1
test1
# 运行中的容器需要加 -f 强制删除
[root@docker ~]# docker container rm -f myos
myos
prune - 裁剪所有已停止容器
[root@docker ~]# docker container prune -f
Deleted Containers:
81f2fe1fb19435752a010db4c4224d44f2289f630bad7568b5ea6880d053879e
...
Total reclaimed space: 22B
5.14 export / import - 导出导入容器
export - 导出容器文件系统
[root@docker ~]# docker container export be05a7c31635 -o myhttpd.tar
💡 不管容器是否运行,都可以导出。
import - 导入为镜像
[root@docker ~]# docker image import myhttpd.tar myweb:v1
sha256:3e1b9eef3b1c1c902881be5ea017164fd5a665bcd1fff2c51b7e5ecdb3828ca1
[root@docker ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
myweb v1 3e1b9eef3b1c 11 seconds ago 134MB
save vs export 对比
| 命令 | 输入/输出 | 特点 |
|---|---|---|
docker image save | 镜像 → tar | 保存所有元数据和历史记录,可用 docker image load 导入 |
docker container export | 容器 → tar | 丢失所有元数据和历史记录,仅保存容器当时状态,用 docker image import 导入 |
❌
docker container export导出的文件不能用docker image load导入,会报错:open /var/lib/docker/tmp/docker-import-xxx/bin/json: no such file or directory
六、常用命令速查表
镜像管理
| 命令 | 说明 |
|---|---|
docker search <关键词> | 搜索 Docker Hub 镜像 |
docker image pull <镜像名:tag> | 拉取镜像 |
docker image ls | 查看本地镜像列表 |
docker image tag <源> <目标> | 为镜像打标签 |
docker image inspect <镜像> | 查看镜像详细信息 |
docker image history <镜像> | 查看镜像分层历史 |
docker image rm <镜像> | 删除镜像 |
docker image prune -a | 清理所有未使用镜像 |
docker image save <镜像> -o <文件> | 保存镜像为 tar 文件 |
docker image load -i <文件> | 从 tar 文件导入镜像 |
docker login | 登录镜像仓库 |
docker image push <镜像> | 推送镜像到仓库 |
容器管理
| 命令 | 说明 |
|---|---|
docker container ls -a | 查看所有容器 |
docker container create <镜像> | 创建容器 |
docker container start <容器> | 启动容器 |
docker container run <镜像> | 创建并启动容器 |
docker container top <容器> | 查看容器内进程 |
docker container stats <容器> | 查看容器资源使用 |
docker container inspect <容器> | 查看容器详细信息 |
docker logs <容器> | 查看容器日志 |
docker container exec -it <容器> bash | 进入容器(推荐方式) |
docker container attach <容器> | 关联容器标准输入输出 |
docker container stop <容器> | 停止容器(优雅停机) |
docker container kill <容器> | 杀死容器(强制停止) |
docker container restart <容器> | 重启容器 |
docker container pause <容器> | 暂停容器 |
docker container unpause <容器> | 恢复容器 |
docker container rm <容器> | 删除容器 |
docker container prune | 清理所有已停止容器 |
docker container export <容器> -o <文件> | 导出容器文件系统 |
七、总结与思考
容器核心知识图谱
容器技术
├── 底层技术
│ ├── Namespace(隔离)
│ │ ├── PID Namespace
│ │ ├── Network Namespace
│ │ ├── Mount Namespace
│ │ ├── IPC Namespace
│ │ └── User Namespace
│ └── Cgroups(资源限制)
├── 核心组件
│ ├── 镜像(只读模板,分层存储)
│ └── 容器(镜像运行实例,可读写层)
├── Docker 架构
│ ├── Client(命令行)
│ ├── Daemon(服务端)
│ └── Registry(镜像仓库)
└── 生态系统
├── 规范(OCI)
├── 运行时(runc、containerd)
├── 编排(Kubernetes、Swarm)
└── 平台(Rancher、OpenShift、Portainer)
关键概念辨析
| 概念 | 关系 |
|---|---|
| 镜像 vs 容器 | 镜像是只读模板,容器是运行实例(相当于类 vs 对象) |
| save vs export | save 保存镜像及元数据,export 只保存容器文件系统 |
| attach vs exec | attach 共享主进程终端,exec 打开新终端(推荐 exec) |
| stop vs kill | stop 先 SIGTERM 后 SIGKILL(优雅),kill 直接 SIGKILL(暴力) |
课后练习建议
- ✅ 在 CentOS 7 上完整走一遍 Docker 安装流程
- ✅ 配置国内镜像加速器,验证加速效果
- ✅ 练习 search、pull、run、ls、tag、push 等完整镜像生命周期
- ✅ 练习 create、start、run、exec、stop、kill、rm 等完整容器生命周期
- ✅ 对比
docker save/load和docker export/import的差异 - ✅ 搭建 C/S 分离架构,远程管理 Docker
📌 下节课预告:Docker 网络管理、数据卷、Dockerfile 镜像构建、Compose 编排
版权声明:本文为学习笔记整理,技术内容参考 Docker 官方文档及课堂讲授,转载请注明出处。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐



所有评论(0)