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原生方案。

  1. 1979 年:Unix chroot() 系统调用。Unix V7 引入 chroot,修改进程根目录,实现文件系统隔离。仅做目录隔离,没有CPU、内存、网络隔离,是容器最早的技术原型。

    root 破解密码

    /dev/centos/root /mnt/sysroot

    mount -o rw,remount /mnt/sysroot

    chroot /mnt/sysroot/

  2. 1998 年 FreeBSD Jails。FreeBSD 推出 Jails,在 chroot 基础上增加进程、网络隔离,可以在一台主机运行多个独立"虚拟系统",面向服务隔离,是现代容器思想重要实践。

  3. 2000 年 Solaris Zones。Solaris Zones,操作系统级虚拟化,CPU/内存/网络/文件系统完整隔离,Oracle 商用操作系统容器方案。

Linux 内核关键技术

Namespace 做隔离,Cgroups 做资源限制,两大基石全部就位,Linux 容器底层能力完备。

时间技术作用
2002PID Namespace进程ID隔离,容器内部拥有独立PID编号
2003Network Namespace网络栈隔离,每个容器独立网卡、IP、路由表
2004‑2006IPC、Mount Namespace进程间通信隔离;挂载点隔离
2007CgroupsGoogle工程师开发,CPU/内存/IO/网络带宽资源限制
2008User 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 容器、轻量容器兴起。

极简时间轴

时间里程碑事件核心价值
1979Unix chroot文件系统隔离原型
1998FreeBSD Jails完整 OS 级隔离雏形
2007Linux Cgroups 合入内核资源限制基石
2008LXC 项目诞生第一个 Linux 容器工具
2013Docker 发布镜像+Dockerfile,容器大众化
2015OCI 成立;K8s 1.0标准化 + 集群编排时代开启
2016runc、containerd分层容器运行时架构
2017K8s 移交 CNCFK8s 成为编排事实标准
2022K8s 彻底移除 dockershimcontainerd 成为 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确保不同容器之间的兼容性和可移植性
容器 runtimelxc、runc、rkt跟操作系统 kernel 紧密协作,为容器提供运行环境
容器管理工具lxd、docker engine、rkt cli对内与 runtime 交互,对外为用户提供 CLI
容器定义工具docker image、dockerfile、ACI允许用户定义容器的内容和属性
RegistryDocker Registry、Docker Hub、Quay.io集中存放镜像文件的仓库
容器 OSCoreOS、atomic、ubuntu core专门运行容器的操作系统,体积更小、启动更快

容器平台技术

容器编排引擎

基于容器的应用一般采用微服务架构:应用被划分为不同组件,以服务形式运行在各自容器中,通过 API 对外提供服务。每个组件运行多个容器组成集群,动态创建、迁移和销毁。

编排包括容器管理、调度、集群定义和服务发现等。

主流编排引擎:

  • Docker Swarm:Docker 开发的容器编排引擎
  • Kubernetes:Google 领导开发的开源容器编排引擎,支持 Docker 和 CoreOS 容器
  • Mesos + Marathon:通用集群资源调度平台
容器管理平台
类型平台特点
开源免费Rancher轻量级 K8s 管理平台,支持多集群
开源免费OpenShiftRed Hat 企业级 K8s 发行版
开源免费KubeSphere青云开源,可视化界面降低 K8s 门槛
商业云AWS EKS / Azure AKS / 阿里云 ACK托管 K8s 服务,无缝对接各自云生态
轻量工具Portainer超轻量容器管理 UI,支持 Docker 和 K8s
开发工具Docker Desktop内置 K8s,适合开发者本地测试
IDE 工具LensK8s 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 请求,把镜像下载到本地 Images
  • docker push:可以把本地做好的镜像上传到仓库

完整交互流程

1. 用户在 Client 执行 docker run nginx,将请求发送给 Docker daemon
2. daemon 访问 Registry 镜像仓库,下载 nginx 镜像,保存到本机 Images
3. daemon 读取本地 nginx 镜像,创建容器需要的网络、存储等资源,运行 Container 容器

2.3 Docker 版本演进

阶段时间版本格式重要版本
语义化 1.x2013‑2017‑02主.次.补丁0.1(首发)、1.0(生产可用)、1.12(Swarm+healthcheck)、1.13(1.x最后版本)
日历版 CE/EE2017‑03 ~ 2022‑06YY.MM.Patch20.10(经典稳定版,存量环境大量使用)、22.06(日历版终点)
回归语义化2023‑02 至今主.次.补丁23.0(默认 BuildKit)、24.0/25.0(生产推荐)

三、搭建学习环境

3.1 实验环境

组件选型
操作系统CentOS 7(最小化安装)
容器 runtimerunc
管理工具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 命令后台操作流程

  1. 检查本地是否存在指定镜像,不存在就从公有仓库下载
  2. 利用镜像创建一个容器,并启动该容器
  3. 分配文件系统,在只读镜像层外面挂载一层可读写层
  4. 从宿主主机网桥接口中桥接一个虚拟接口到容器中
  5. 从网桥地址池配置一个 IP 地址给容器
  6. 执行用户指定的应用程序
  7. 执行完毕后容器被自动终止

常用示例

# 运行单次命令
[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 exportsave 保存镜像及元数据,export 只保存容器文件系统
attach vs execattach 共享主进程终端,exec 打开新终端(推荐 exec)
stop vs killstop 先 SIGTERM 后 SIGKILL(优雅),kill 直接 SIGKILL(暴力)

课后练习建议

  1. ✅ 在 CentOS 7 上完整走一遍 Docker 安装流程
  2. ✅ 配置国内镜像加速器,验证加速效果
  3. ✅ 练习 search、pull、run、ls、tag、push 等完整镜像生命周期
  4. ✅ 练习 create、start、run、exec、stop、kill、rm 等完整容器生命周期
  5. ✅ 对比 docker save/load 和 docker export/import 的差异
  6. ✅ 搭建 C/S 分离架构,远程管理 Docker

📌 下节课预告:Docker 网络管理、数据卷、Dockerfile 镜像构建、Compose 编排


版权声明:本文为学习笔记整理,技术内容参考 Docker 官方文档及课堂讲授,转载请注明出处。

Logo

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

更多推荐