Docker 实用命令手册:包含Docker简介与常用命令

文章目录

容器技术发展史

软件部署环境的一致性问题一直困扰着开发与运维团队。在容器技术诞生之前,业界主要依赖物理机部署和虚拟机(VM)技术。虚拟机通过 Hypervisor 层虚拟化完整的硬件和操作系统,虽然实现了强隔离,但也带来了极高的系统开销和漫长的启动时间。

容器技术的核心思想是"操作系统级虚拟化"。早期的探索可以追溯到 1979 年 Unix V7 中的 chroot,它实现了文件系统层面的隔离。随后,2000 年的 FreeBSD Jails 和 2008 年的 LXC(Linux Containers)进一步发展了这一理念。LXC 首次将 Linux 内核的 Namespaces(命名空间隔离)和 Cgroups(控制组资源限制)结合起来,实现了进程级别的轻量级隔离。然而,LXC 的配置极为繁琐,缺乏标准化的应用打包机制。直到 2013 年,dotCloud 公司开源了 Docker,它在 LXC 的基础上创新性地引入了镜像(Image)机制,彻底标准化了应用的交付和部署流程,标志着现代化容器时代的正式开启。

编排与容器的技术演进之路

随着容器的大规模落地,单机部署显然无法满足企业级高可用和微服务架构的需求。这催生了容器编排技术的激烈角逐。早期,Docker 公司推出了自家的 Swarm 集群编排工具,而 Apache 则主推 Mesos。最终,由 Google 开源的 Kubernetes(K8s)凭借其强大的声明式 API 和优秀的架构设计赢得了这场编排之战。

在这个演进过程中,容器底层标准也发生了巨变。为了打破 Docker 一家独大的局面,社区推动成立了 OCI(开放容器倡议),制定了镜像标准(Image Specification)和运行时标准(Runtime Specification)。Kubernetes 随后引入了 CRI(容器运行时接口),并在后续版本中正式弃用了对 Docker 引擎的直接依赖(移除了 dockershim),转而直接对接遵循 OCI 标准的 Containerd 或 CRI-O。这意味着,虽然 Docker 在开发者桌面端依然占据统治地位,但在现代生产级 K8s 集群中,更为轻量解耦的底层组件已经接管了容器的生命周期。
现代 CRI 标准架构
gRPC CRI 接口
管理
调用符合 OCI 标准的运行时
Kubelet
Containerd / CRI-O
Containerd-shim
Runc
Linux Kernel namespaces & cgroups
早期架构
内置
Kubelet
Dockershim
Docker Daemon

Docker 简介

什么是虚拟化、容器化?

  • 物理机:实际的服务器或者计算机。相对于虚拟机而言的对实体计算机的称呼。物理
    机提供给虚拟机以硬件环境,有时也称为"寄主"或"宿主"。
  • 虚拟化:是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。在一台计算机上
    同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都
    可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率。
  • 容器化:容器化是一种虚拟化技术 ,又称操作系统层虚拟化(Operating system level
    virtualization),这种技术将操作系统内核虚拟化,可以允许用户空间软件实例
    (instances)被分割成几个独立的单元,在内核中运行,而不是只有一个单一实例运
    行。这个软件实例,也被称为是一个容器(containers)。对每个实例的拥有者与用户
    来说,他们使用的服务器程序,看起来就像是自己专用的。容器技术是虚拟化的一种。
    docker 是现今容器技术的事实标准。

为什么要虚拟化、后又有容器化?

  1. 极致轻量,资源利用率再上台阶
    容器无完整操作系统的额外开销,镜像大小普遍为 MB 级,启动速度为秒级甚至毫秒级,一台物理机可承载数百上千个容器,资源利用率比虚拟化再提升 30% 以上,硬件成本进一步降低。
  2. 彻底解决环境一致性问题
    容器的核心是一次构建,到处运行。它将业务代码、运行环境(JDK/Python/Node 等)、依赖库、配置文件全部打包成一个不可变的标准化镜像,开发、测试、预发、生产全流程使用同一个镜像,彻底消灭环境差异导致的部署问题。
  3. 完美适配微服务与 DevOps 体系
    微服务架构下,一个系统会拆分为数十上百个独立迭代的服务,容器可与 CI/CD 流水线无缝集成:代码提交后自动构建镜像、自动测试、自动部署,业务交付周期从天级缩短到分钟级甚至秒级,是敏捷开发、持续交付的核心载体。
  4. 标准化运维,大幅降低复杂度
    容器遵循 OCI 开放标准,无论业务是何种语言开发,打包成镜像后,部署、启动、停止、日志采集、监控告警的方式完全统一,运维人员无需再关心每个业务的底层运行环境,运维效率实现质的飞跃。
  5. 强大的弹性伸缩与自愈能力
    配合 Kubernetes 编排系统,容器可根据业务的 CPU / 内存使用率、QPS 流量,实现秒级自动扩缩容 ------ 高峰期自动新增容器承接流量,低谷期自动缩减容器释放资源,兼顾稳定性与成本;同时具备自愈能力,容器异常自动重启,节点故障自动将容器调度到健康节点,保障业务高可用。
  6. 更细粒度的资源管控
    基于 Cgroups 技术,可精准限制每个容器的 CPU、内存、磁盘 IO、网络带宽,避免业务间互相抢占资源,资源管控的粒度和灵活度远高于虚拟机。

Docker 是一个开源的应用容器引擎,基于 Go 语言开发。它允许开发者将应用程序及其所有的依赖库、配置文件打包在一个标准化、轻便且可移植的镜像中。由于容器共享宿主机的操作系统内核,它避开了虚拟机启动客户机操作系统的庞大开销,使得应用的启动时间从分钟级缩减到毫秒级。Docker 的核心愿景是"Build, Ship, and Run Any App, Anywhere",它彻底打破了"在我的机器上明明可以运行"的开发魔咒。

常见虚拟化实现

  1. 主机虚拟化(虚拟机)实现
    主机虚拟化的原理是通过在物理服务器上安装一个虚拟化层来实现。这个虚拟化层可以在物理服务器和客户操作系统之间建立虚拟机,使得它们可以独立运行。
    从软件框架的角度上,根据虚拟化层是直接位于硬件之上还是在一个宿主操作系统之上,将虚拟化划分为 Type1 和 Type2
  • Type1 类的 Hypervisor(Hypervisor 是一种系统软件,它充当计算机硬件和虚拟机之间的中介,负责有效地分配和利用由各个虚拟机使用的硬件资源,这些虚拟机在物理主机上单独工作,因此,Hypervisor 也称为虚拟机管理器)直接运行在硬件之上,没有宿主操作系统,Hypervisor 直接控制硬件资源和客户机。典型框架为 Xen、Vmware ESX。

  • Type2 类的 Hypervisor 运行在一个宿主操作系统之上(如 Vmware Workstation),Hypervisor 作为宿主操作系统中的一个应用程序,客户机就是在宿主操作系统上的一个进程。

Type 2 Hypervisor
HARDWARE
HOST OS
HYPERVISOR
GUEST OS
GUEST OS
GUEST OS
Type 1 Hypervisor
HARDWARE
HYPERVISOR
GUEST OS
GUEST OS
GUEST OS

容器虚拟化实现原理

容器虚拟化,有别于主机虚拟化,是操作系统层的虚拟化。通过 namespace 进行程序的隔离,加上 cgroups 进行资源的控制,以此来进行虚拟化。

什么是Namespace(命名空间)?

namespace 是 Linux 内核用来隔离内核资源的方式。通过 namespace 可以让一些进程只能看到与自己相关的一部分资源,而另外一些进程也只能看到与它们自己相关的资源,这两拨进程根本就感觉不到对方的存在。具体的实现方式是把一个或多个进程的相关资源指定在同一个 namespace 中。

Linux namespaces 是对全局系统资源的一种封装隔离,使得处于不同 namespace 的进程拥有独立的全局系统资源,改变一个 namespace 中的系统资源只会影响当前 namespace 里的进程,对其他 namespace 中的进程没有影响。

Linux 提供了多个 API 用来操作 namespace,它们是 clone()setns()unshare() 函数,为了确定隔离的到底是哪项 namespace,在使用这些 API 时,通常需要指定一些调用参数:CLONE_NEWIPCCLONE_NEWNETCLONE_NEWNSCLONE_NEWPIDCLONE_NEWUSERCLONE_NEWUTSCLONE_NEWCGROUP。如果要同时隔离多个 namespace,可以使用 | (按位或)组合这些参数。

namespace 系统调用参数 被隔离的全局系统资源 引入内核版本
UTS CLONE_NEWUTS 主机名和域名 2.6.19
IPC CLONE_NEWIPC 信号量、消息队列和共享内存 - 进程间通信 2.6.19
PID CLONE_NEWPID 进程编号 2.6.24
Network CLONE_NEWNET 网络设备、网络栈、端口等 2.6.29
Mount CLONE_NEWNS 文件系统挂载点 2.4.19
User CLONE_NEWUSER 用户和用户组 3.8

以上命名空间在容器环境下的隔离效果

  • UTS :每个容器能看到自己的 hostname,拥有独立的主机名和域名。
  • IPC :同一个 IPC namespace 的进程之间能互相通讯,不同的IPC namespace之间不能通信。
  • PID :每个 PID namespace 中的进程可以有其独立的 PID,每个容器可以有其 PID 为 1 的 root 进程。
  • Network :每个容器用有其独立的网络设备,IP 地址,IP 路由表,/proc/net 目录,端口号。
  • Mount:每个容器能看到不同的文件系统层次结构。
  • User :每个 container 可以有不同的 user 和 group id。

想想要如果我们要隔离两个进程需要怎么办?

  1. 首先容器进程与进程之间需要隔离,所以需要 PID 隔离
  2. 首先容器 A 进程不能读取容器 B 进程通讯内容需要隔离信号量等,所以需要 IPC 隔离
  3. 首先容器 A 进程不能读取容器 B 进程的文件,所以需要 Mount 隔离
  4. 首先容器 A 进程不能读取容器 B 进程的 socket,所以需要网络隔离、主机隔离
  5. Docker 允许用户在主机和容器间共享文件夹,同时不需要限制容器的访问权限,这就容易让容器突破资源限制。需要借助用户空间来完成用户之间的隔离。
空间隔离

什么是cgroups?

cgroups(Control Groups) 是 linux 内核提供的一种机制,这种机制可以根据需求把一系列系统任务及其子任务整合(或分隔)到按资源划分等级的不同组内,从而为系统资源管理提供一个统一的框架。简单说,cgroups 可以限制、记录任务组所使用的物理资源。本质上来说,cgroups 是内核附加在程序上的一系列钩子(hook),通过程序运行时对资源的调度触发相应的钩子以达到资源追踪和限制的目的

使用cgroups的目的: 其可以做到对 CPU、内存等资源实现精细化的控制,目前越来越火的轻量级容器 Docker 及 k8s 中的 pod,就使用了 cgroups 提供的资源限制能力来完成 CPU、内存等部分的资源控制。

cgroups 的用途:

  • Resource limitation:限制资源使用,例:内存使用上限/CPU 的使用限制
  • Prioritization:优先级控制,例:CPU 利用/磁盘 IO 吞吐
  • Accounting:一些审计或一些统计
  • Control:挂起进程/恢复执行进程
子系统 功能说明
blkio 对块设备的 IO 进行限制。
cpu 限制 CPU 时间片的分配
cpuacct 生成 cgroup 中的任务占用 CPU 资源的报告,与 cpu 挂载在同一目录。
cpuset 给 cgroup 中的任务分配独立的 CPU(多处理器系统) 和内存节点。
devices 限制设备文件的创建,和对设备文件的读写
freezer 暂停/恢复 cgroup 中的任务。
memory 对 cgroup 中的任务的可用内存进行限制,并自动生成资源占用报告。
perf_event 允许 perf 观测 cgroup 中的 task
net_cls cgroup 中的任务创建的数据报文的类别标识符,这让 Linux 流量控制器(tc 指令)可以识别来自特定 cgroup 任务的数据包,并进行网络限制。
hugetlb 限制使用的内存页数量。
pids 限制任务的数量。
rdma 限制 RDMA 资源(Remote Direct Memory Access,远程直接数据存取)

LXC 是什么?

LXC(LinuX Containers)Linux 容器,一种操作系统层虚拟化技术,为 Linux 内核容器功能的一个用户空间接口。它将应用软件系统打包成一个软件容器(Container),内含应用软件本身的代码,以及所需要的操作系统核心和库。透过统一的名字空间和共享 API 来分配不同软件容器的可用硬件资源,创造出应用程序的独立沙箱运行环境,使得 Linux 用户可以容易的创建和管理系统或应用容器。

Docker本质

Docker本质其实是LXC之类的增强版,它本身不是容器,而是容器的易用工具。容器是linux内核中的技术,Docker只是把这种技术在使用上简易普及了。Docker在早期的版本其核心就是LXC的二次封装发行版。

Docker是基于Go语言实现的一个开源项目,它的主要目标是Build、Ship and Run Any APP,Anywhere,即通过对应用的封装、分发、部署、运行等生命周期的管理,使得用户的应用及其运行环境能够做到"一次封装,到处运行"。

早期Docker利用LXC做容器管理引擎,但是在创建容器时,不再使用模板去安装生成,而是通过镜像技术( 把一个操作系统用户空间所需要使用到的组件事先编排好,并整体打包成一个文件,image文件),镜像文件集中放在一个仓库中。 当需要创建容器时,Docker调用LXC的工具lxc-create,但不再通过lxc的模板去安装,而是连接到镜像服务器上下载匹配的镜像文件,而后基于镜像启动容器。所以,Docker极大的简化了容器的使用难度。

Docker的引擎迭代

Docker早期是基于LXC容器管理引擎实现,当后来成熟之后,Docker自建了一个容器引擎叫libcontainer,后来CNCF的介入,Docker又研发了一个工业化标准的容器引擎runC,目前所使用的新版Docker,所使用的容器引擎就是RunC。

Docker和虚拟机的区别
传统虚拟机 Docker容器
磁盘占用 几个GB到几十个GB左右 几十MB到几百MB左右
CPU内存占用 虚拟操作系统非常占用CPU和内存,需要通过虚拟层调用占用率高 Docker引擎占用资源极低,直接作用于硬件资源占用少
启动速度 (从开机到运行项目)几分钟 (从开启容器到运行项目)几秒
安装管理 需要专门的运维技术 安装、管理方便
应用部署 手动部署,速度慢 体系化部署,可以自动化,速度快
隔离性 系统级别 进程级别
封装程度 打包整个操作系统 打包项目代码和依赖信息

Docker为什么比虚拟机资源利用率高,启动快?

docker有比虚拟机更少的抽象层。docker不需要Hypervisor实现硬件资源虚拟化 ,运行在docker容器上的程序直接使用的是实际物理机的硬件资源。因此在cpu、内存利用率上docker将会在效率上有明显的优势。Docker利用的是宿主机的内核,而不需要Guest OS,节省了Guest OS占用的资源

docker不需要Guest OS,创建一个容器时,不需要和虚拟机一样重新加载一个操作系统内核。从而避免引导、加载操作系统内核返回时耗时耗资源的过程,当新建一个虚拟机时,虚拟机软件需要加载Guest OS,返回新建过程是分钟级别的。而新建一个docker容器只需要几秒钟。

Docker 版本

Docker发展过程中衍生了以下版本,目前我们学习和使用提到的版本是docker-ce。

  • lxc:lxc是最早的linux容器技术,早期版本的docker直接使用lxc来实现容器的底层功能。虽然使用者相对较少,但lxc项目仍在持续开发演进中。
  • libcontainer:docker从0.9版本开始自行开发了libcontainer模块来作为lxc的替代品实现容器底层特性,并在1.10版本彻底去除了lxc。在1.11版本拆分出runc后,libcontainer也随之成为了runc的核心功能模块,runc后续变成了容器标准。
  • moby:moby是docker公司发起的开源项目,使用containerd作为运行时标准。事实上这个moby现在就是dockerd目前使用的开源项目名称,docker项目中的engine(dockerd)仓库现在就是从moby仓库fork而来的,使docker项目符合行业标准。https://mobyproject.org/
  • docker-ce:docker的社区版,CE指Community Edition。docker-ce中的组件来自于moby、containerd等其他项目。https://www.docker.com/pricing/
  • docker-ee:docker的收费版本,EE指Enterprise Edition。其基础组件来源和docker-ce是一样的,但附加了一些其他的组件和功能。https://www.docker.com/pricing/

Docker 架构

Docker 采用了经典的 C/S(客户端 - 服务器)架构模式。其内部运行机制高度模块化,主要由以下几个核心部分协同工作:

Docker Client(客户端)是用户与 Docker 交互的主要界面,负责接收用户的各种命令(如 build、pull、run 等),并通过 REST API 与后端的守护进程进行通信。Docker Daemon(守护进程,dockerd)运行在宿主机后台,是整个 Docker 架构的大脑。它负责监听 API 请求,并管理核心的基础对象,包括镜像、容器、网络和数据卷。
DOCKER_HOST Docker宿主机
Client 客户端

  1. 构建镜像并存储
  2. 拉取/推送镜像
    拉取镜像到本地
  3. 基于镜像创建启动容器
    提供镜像给守护进程
    Registry 远程镜像仓库
    Ubuntu 镜像
    Redis 镜像
    Nginx 镜像
    Images 本地镜像库
    Ubuntu 镜像
    Redis 镜像
    Containers 运行容器
    容器实例1
    容器实例2
    容器实例3
    容器实例4
    docker build
    docker pull
    docker run
    Docker daemon 守护进程

Docker 以标准化镜像为统一交付载体、轻量级隔离容器为运行单元,解决了传统应用开发、测试、部署全流程中环境不一致、资源利用率低、部署运维低效、应用隔离性差、跨环境迁移与版本管理回滚困难的核心痛点。

Docker 生态

Docker 早已超越了一个单纯的容器引擎,演变成为了一个庞大的研发生态。在桌面端,Docker Desktop 为跨平台(Windows/Mac)的开发者提供了开箱即用的容器环境。在镜像分发领域,官方构建了全球最大的公共镜像仓库 D ocker Hub,涵盖了几乎所有主流的基础软件。在应用编排层面,Docker Compose 成为单机多容器部署的事实标准。此外,Docker 还能无缝集成到各类 CI/CD 流水线(如 Jenkins、GitLab CI)中,成为现代 DevOps 流程运转的核心齿轮。

Docker 安装

在 Linux 服务器上安装 Docker 通常需要确保内核版本在 3.10 以上。为了保证安装的稳定性和后续拉取镜像的速度,国内环境通常需要配置镜像加速器。以下是在 CentOS/Ubuntu 系统中安装并配置 Docker 的标准流程演示:

bash 复制代码
# 1. 卸载旧版本(如果存在)
sudo apt-get purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras -y
#删除目录
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd

# 2. curl 命令安装
sudo apt-get update
sudo apt install curl -y
#创建 gpg key 目录
sudo mkdir -m 0755 -p /etc/apt/keyrings
#下载 gpg key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor --yes -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 3. #配置加载
sudo systemctl daemon-reload 
#启动服务
sudo systemctl start docker 
#开启启动
sudo systemctl enable docker
#查看服务状态
sudo systemctl status docker

如果因为Docker GPG 密钥验证失败导致软件源未生效,apt 找不到 Docker 安装包,所以 Docker 没装上,按以下步骤重新正确安装:

  • 清理旧的错误配置(关键一步)
bash 复制代码
# 1. 删除可能存在的旧 Docker GPG 密钥
sudo rm -f /etc/apt/keyrings/docker.gpg

# 2. 删除旧的 Docker 软件源文件
sudo rm -f /etc/apt/sources.list.d/docker.list

# 3. 更新一下 apt 缓存(清理状态)
sudo apt update
  • 重新正确配置 Docker 官方源
bash 复制代码
# 1. 确保安装了基础工具
sudo apt install curl gnupg lsb-release -y

# 2. 再次创建密钥目录(确保权限正确)
sudo mkdir -m 0755 -p /etc/apt/keyrings

# 3. 重新下载并导入 Docker 官方 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor --yes -o /etc/apt/keyrings/docker.gpg

# 4. 给密钥文件读权限(避免后续 apt 报错)
sudo chmod a+r /etc/apt/keyrings/docker.gpg

# 5. 重新添加 Docker 稳定版软件源(注意去掉了可能导致问题的转义符)
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  • 正式安装 Docker
bash 复制代码
# 1. 重新更新 apt 软件包缓存(这次应该不会有 GPG 报错了)
sudo apt update

# 2. 安装 Docker 全家桶
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
  • 验证安装并启动服务
bash 复制代码
# 1. 启动 Docker 服务
sudo systemctl start docker

# 2. 设置开机自启
sudo systemctl enable docker

# 3. 查看服务状态(应该显示 active (running))
sudo systemctl status docker

# 4. 最后验证 Docker 版本(确认安装成功)
sudo docker --version

Docker 镜像源修改

Docker 默认从官方镜像仓库(Docker Hub)拉取镜像,但该服务器位于国外,国内访问速度极慢 ,常出现拉取超时、失败的情况。配置国内镜像源(如阿里云、腾讯云、中科大等)可将下载速度从几 KB/s 提升至几 MB/s 甚至更快,大幅提高部署效率。

1:检查并创建配置文件

bash 复制代码
# 若文件不存在,先创建目录和文件
sudo mkdir -p /etc/docker
sudo touch /etc/docker/daemon.json

2:编辑配置文件

使用文本编辑器打开文件:

bash 复制代码
sudo nano /etc/docker/daemon.json
json 复制代码
{
  "registry-mirrors": [
    "https://hub-mirror.c.163.com",         // 网易镜像源
    "https://mirror.ccs.tencentyun.com",     // 腾讯云镜像源
    "https://xxxxxxxx.mirror.aliyuncs.com"  //阿里云个人镜像源
  ]
}

步骤 3:重启 Docker 服务

bash 复制代码
sudo systemctl daemon-reload  #重载配置
sudo systemctl restart docker #重启 Docker

步骤 4:验证配置是否生效

bash 复制代码
docker info
#若输出中包含以下内容,说明配置成功:
Registry Mirrors:
  https://docker.mirrors.ustc.edu.cn/
  https://hub-mirror.c.163.com/
  ...

Docker 目录修改

Docker 默认将所有镜像、容器、数据卷等数据存放在 /var/lib/docker 目录下,而这个目录通常位于系统盘(根分区 /)。镜像和容器体积会持续增长,很容易占满系统盘,导致系统无法正常运行。

有三种解决方案:

方案 操作方式 优点 缺点
方案1:直接挂载磁盘到 /var/lib/docker 安装前将大磁盘挂载到该目录 最原生、性能最好,无额外开销 需在安装 Docker 前操作,已安装后迁移较麻烦
方案2:软链接方式 先将数据迁移到新盘,再创建软链接指向 /var/lib/docker 操作简单,无需修改 Docker 配置 部分系统或工具可能不兼容软链接,存在潜在问题
方案3:修改 daemon.json 配置 通过 data-root 字段指定新目录 官方推荐,兼容性好,适合已安装后修改 需迁移原有数据,否则会丢失已下载的镜像和容器

当前按照第三种方法修改:

  1. 迁移原有数据
    直接修改 data-root 后,Docker 会把新数据写到新目录,但旧目录 /var/lib/docker 里的镜像、容器不会自动迁移 ,需要手动复制:

    bash 复制代码
    # 先停止 Docker
    sudo systemctl stop docker
    sudo systemctl stop docker.socket
    # 复制旧数据到新目录
    sudo rsync -av /var/lib/docker/ /data/docker/
    # 备份旧目录(避免数据丢失)
    sudo mv /var/lib/docker /var/lib/docker.bak
    # 创建 / 修改 Docker 配置文件
    sudo nano /etc/docker/daemon.json
    {
       "data-root": "/data/docker/",
       "registry-mirrors": [
       "https://hub-mirror.c.163.com",         // 网易镜像源
       "https://mirror.ccs.tencentyun.com",     // 腾讯云镜像源
       "https://xxxxxxxx.mirror.aliyuncs.com"  //阿里云个人镜像源
      ] 
    }
    # 重启docker
    sudo systemctl daemon-reload
    sudo systemctl start docker
  2. 配置验证
    重启 Docker 后,用 docker info 查看 Docker Root Dir 是否变为你设置的新路径:

    bash 复制代码
    docker info | grep "Docker Root Dir"
bash 复制代码
drw@VM-0-14-ubuntu:/data$ docker info | grep "Docker Root Dir"
Docker Root Dir: /data/docker
#如上输出代表更改成功!

Docker Registry(镜像仓库)

Registry 是专门用于存储和分发 Docker 镜像的服务端程序。最典型的代表是官方的 Docker Hub。然而,在企业的实际生产环境中,出于对核心业务代码的保密需求、内网传输效率的考量以及细粒度权限管控的需要,企业通常会搭建私有仓库。

镜像仓库 (Docker Registry) 负责存储、管理和分发镜像,并且提供了登录认证能力,建立了仓库的索引。镜像仓库管理多个 Repository, Repository 通过命名来区分。每个 Repository 包含一
个或多个镜像,镜像通过镜像名称和标签 (Tag)来区分

  • 镜像仓库(Registry):要从哪一个镜像仓库拉取镜像,通常通过 DNS 或 IP 地址来确
    定一个镜像仓库如 hub.docker.com;一个 Registry 中可以存在多个Repository,Repository 可分为"顶层仓库"和"用户仓库";·用户仓库名称格式为"用户名/仓库名"·每个仓库可以包含多个 Tag(标签),每个标签对应一个镜像
  • Repository: ·由某特定的 docker 镜像的所有迭代版本组成的镜像仓库
  • 镜像名称(name)+标签(tag):如 nginx:latest
  • 认证能力:提供用户注册,登录、登出能力
  • 索引:提供镜像的索引信息,方便检索

一个容器镜像包含了两个部分,元数据:由 dockerfile 构建出来的描述文件,这个描述文件会说这个容器镜像有多少层,每一层里面有什么内容,checksum 会记录下来,真正占有空间是blob。

仓库有公有私有之分:

(1)公有仓库:像阿里云、dockerhub 等放到公有网络上,不用登录就可以下载镜像,

供大家访问使用

(2)私有仓库:不对外开放,往往位于私有网络,只有公司内部人员可以使用。

按供应商和面向群体划分

镜像仓库工作机制

  1. 镜像仓库使用流程:
    • 通过 docker login 登录仓库
    • Docker pull 拉取需要的镜像
    • 通过 dockerfile 或者 commit 等方式制作完镜像通过 docker push 上传到仓库
  2. Docker Registry 中的镜像通常由开发人员制作,而后推送至公共或私有Registry 上保存,供其他人员使用
  3. 启动容器时,docker daemon 会试图从本地获取相关的镜像;本地镜像不存在时,其将从Registry 中下载该镜像并保存到本地;

镜像仓库拉取镜像:

随便打开nginx的一个镜像:

bash 复制代码
#复制到终端中,拉取成功!
drw@VM-0-14-ubuntu:~$ docker pull nginx/nginx-prometheus-exporter:1.5.1
1.5.1: Pulling from nginx/nginx-prometheus-exporter
f7f0a58c593f: Pull complete 
5d6c83ee9d74: Pull complete 
d51c0c9566d5: Download complete 
67b13e9453aa: Download complete 
Digest: sha256:9f6d963bb2b19d706d401cc3e2c3ea8de2f1c471b96a2156ca45e76f650b1625
Status: Downloaded newer image for nginx/nginx-prometheus-exporter:1.5.1
docker.io/nginx/nginx-prometheus-exporter:1.5.1
相关命令
命令 别名 功能
docker login - 登录仓库
docker pull docker image pull 拉取镜像
docker push docker image push 推送镜像
docker search - 查找镜像
docker logout - 登出仓库
  • docker login
    登陆到一个 Docker 镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub。因 docker 网站被封,该命令可以用阿里云或者腾讯云的镜像仓库练习,参考后续实战部分。
shell 复制代码
docker login [OPTIONS] [SERVER]
  • -u:登陆的用户名
  • -p:登陆的密码
shell 复制代码
docker login -u 用户名 -p 密码
powershell 复制代码
PS C:\Users\19624> docker login
Authenticating with existing credentials... [Username: dairenwen]

i Info → To login with a different account, run 'docker logout' followed by 'docker login'


Login Succeeded
  • docker pull
    从镜像仓库中拉取或者更新指定镜像
shell 复制代码
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
shell 复制代码
docker image pull
  • -a:拉取所有 tagged 镜像
  • --disable-content-trust:忽略镜像的校验,默认开启
shell 复制代码
drw@VM-0-14-ubuntu:~$ docker pull nginx:1.23.3
1.23.3: Pulling from library/nginx
d4ceccbfc269: Pull complete 
1ff0f94a8007: Pull complete 
d776269cad10: Pull complete 
e9427fcfa864: Pull complete 
f1f26f570256: Pull complete 
84181e80d10e: Pull complete 
Digest: sha256:f4e3b6489888647ce1834b601c6c06b9f8c03dee6e097e13ed3e28c01ea3ac8c
Status: Downloaded newer image for nginx:1.23.3
docker.io/library/nginx:1.23.3
  • docker push
    将本地的镜像上传到镜像仓库,需先登陆到镜像仓库
shell 复制代码
docker push [OPTIONS] NAME[:TAG]
shell 复制代码
docker image push
  • -a:推送所有 tagged 镜像
  • --disable-content-trust:忽略镜像的校验,默认开启

需要先在官方创建一个个人仓库:

shell 复制代码
PS C:\Users\19624> docker tag mysql:8.4.2 dairenwen/temporal-respository:v1 #给本地镜像打标签(Tag)
PS C:\Users\19624> docker push dairenwen/temporal-respository:v1 #推送到远程仓库
The push refers to repository [docker.io/dairenwen/temporal-respository]
3ae253e7d3a3: Pushed
e1f967bd5a7d: Pushing [====================================>              ]  229.5MB/312.3MB
912958c342e1: Pushed
22a17ef1ea0c: Pushing [==================>                                ]  52.12MB/139.7MB
3af6d69d4054: Pushed
6d5141647b7c: Pushed
a7226d7d17a4: Pushed
eb038111c453: Pushed
4aaf28c8ff69: Pushed
664144bd1f24: Pushing [=========>                                         ]  21.02MB/112.7MB

push成功后可以看见我们上传的镜像:

  • docker search
    从 Docker Hub 查找镜像,因 docker 网站被封,该命令国内暂时无法实操,需国外网络环境。
shell 复制代码
docker search [OPTIONS] TERM
  • --no-trunc:显示完整的镜像描述
  • -f <过滤条件>:列出收藏数不小于指定值的镜像
shell 复制代码
# 从 Docker Hub 查找所有镜像名包含 nginx,并且 star 数大于 10 的镜像
drw@Yuki:~$ docker search -f stars=10 nginx
NAME                              DESCRIPTION                                     STARS     OFFICIAL
nginx                             Official build of Nginx.                        21229     [OK]
nginx/nginx-ingress               NGINX and  NGINX Plus Ingress Controllers fo...   116
nginx/nginx-prometheus-exporter   NGINX Prometheus Exporter for NGINX and NGIN...   51
nginx/unit                        This repository is retired, use the Docker o...   66
bitnami/nginx                     Bitnami Secure Image for nginx                  203
ubuntu/nginx                      Nginx, a high-performance reverse proxy & we...   141
linuxserver/nginx                 An Nginx container, brought to you by LinuxS...   235
  • docker logout
    登出一个 Docker 镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub。因 docker 网站被封,该命令可以用阿里云或者腾讯云的镜像仓库练习,参考后续实战部分。
shell 复制代码
docker logout [SERVER]

Docker Image(镜像)

镜像是容器启动的基石,它是一个只读的模板。Docker 镜像底层采用 UnionFS(联合文件系统)技术,将应用所需的操作系统根目录、运行库、环境变量及程序代码分层叠加在一起。当我们在编写 Dockerfile 时,每一条指令(如 FROM、RUN、COPY)都会生成一个新的只读镜像层。

每一层文件系统叫一层 layer,联合文件系统可以对每一层文件系统设置三种权限只读(readonly)、读写(readwrite)和写出(whiteout-able),但是 docker 镜像中每一层文件系统都是只读的。构建镜像的时候,从一个最基本的操作系统开始,每个构建的操作都相当于做一层修改,增加了一层文件系统。一层层往上叠加,上层的修改会覆盖底层该位置的可见性。

相关命令
  • docker images
    列出本地镜像
shell 复制代码
docker images [OPTIONS] [REPOSITORY[:TAG]]

别名

shell 复制代码
docker image ls, docker image list
  • 关键参数
    • -a : 列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层);
    • --digests : 显示镜像的摘要信息;
    • -f : 显示满足条件的镜像;
    • --format : 指定返回值的模板文件;
    • --no-trunc : 显示完整的镜像信息;
    • -q : 只显示镜像ID。
shell 复制代码
drw@Yuki:~$ docker images -a                                                                                        i Info →   U  In Use
IMAGE                       ID             DISK USAGE   CONTENT SIZE   EXTRA
mysql:8.4.2                 f742bd39cd6b        584MB             0B    U
nacos/nacos-server:v2.2.2   0514f8ffee17       1.17GB             0B    U
nginx:1.24.0                6c0218f16876        142MB             0B    U
redis:7.0.15                7705dd2858c1        109MB             0B    U
  • docker image inspect
    查看镜像详细信息
shell 复制代码
docker image inspect [OPTIONS] IMAGE [IMAGE...]
  • 样例
shell 复制代码
# 查看镜像详细信息
drw@Yuki:~$ docker image inspect mysql:8.4.2
[
    {
        "Id": "sha256:f742bd39cd6b457c890bfb3761fe201d69508a68d832c0caebdb6bac3df5e60f",
        "RepoTags": [
            "mysql:8.4.2"
        ],
        "RepoDigests": [
            "mysql@sha256:ac80b6e09e5b12b4f9d5cd4f6425e43464247aa4ba4f6169da5daf59e5877f7d"
        ],
        "Comment": "buildkit.dockerfile.v0",
        "Created": "2024-07-22T22:32:47Z",
        "Config": {
            "ExposedPorts": {
                "3306/tcp": {},
                "33060/tcp": {}
            },
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "GOSU_VERSION=1.17",
                "MYSQL_MAJOR=8.4",
                "MYSQL_VERSION=8.4.2-1.el9",
                "MYSQL_SHELL_VERSION=8.4.1-1.el9"
            ],
            "Entrypoint": [
                "docker-entrypoint.sh"
            ],
            "Cmd": [
                "mysqld"
            ],
            "Volumes": {
                "/var/lib/mysql": {}
            },
            "WorkingDir": "/",
            "ArgsEscaped": true
        },
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 583638158,
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/121a6bfb874c290b8a8b7b6c579a1ff2e81e645b5117e19bc3fa7e1fbd7e9740/diff:/var/lib/docker/overlay2/576f6303d756c2057b31c1416a09ac9abf4a1fe0c66f6f5e043fbce729319b66/diff:/var/lib/docker/overlay2/cf2505f734b962ebc72b1b9789c8b5899e7f8cf38fbee4cb0db839e2914835a9/diff:/var/lib/docker/overlay2/5aa619754078a497b8ab82a0dc1e5729631b1486d7c6de8979dea9d1a59cebe1/diff:/var/lib/docker/overlay2/4adeab176622b0be588d1deb46c864efb7127108041e275f25d1c2e1e2db8bbe/diff:/var/lib/docker/overlay2/8f3e76ca4d123caf87104301a6d77db28d9adeac0068b8dc0800ab9e59a80393/diff:/var/lib/docker/overlay2/b47752aeab6154eb8271813a8f778434ab0cd6ffac8407c59fdad5091138dbda/diff:/var/lib/docker/overlay2/c1d28d3796b45cb43b2eeea88429027f0510675e0771d2739774ad34a64baff3/diff:/var/lib/docker/overlay2/b96c54069128f0a808b201ce75053de300aa93e22fb2fb83dc435e9b9a925ba3/diff",
                "MergedDir": "/var/lib/docker/overlay2/3262c11abcf306c32313d1ffe8e427b27561917d0be63a660621d0bdb2a901bc/merged",
                "UpperDir": "/var/lib/docker/overlay2/3262c11abcf306c32313d1ffe8e427b27561917d0be63a660621d0bdb2a901bc/diff",
                "WorkDir": "/var/lib/docker/overlay2/3262c11abcf306c32313d1ffe8e427b27561917d0be63a660621d0bdb2a901bc/work"
            },
            "Name": "overlay2"
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:664144bd1f243d56de6413950a57ce17fd9d25e925a8e06c4771cc4fb2fdbb50",
                "sha256:4aaf28c8ff69c75ccf3e5d7bea851ba8eb4ab41e2827eb2cee3f289fd181c634",
                "sha256:eb038111c4537af29b3f8e48acf1488a651cced010abe3637efa416e8e9cf1b4",
                "sha256:a7226d7d17a4da79f0f99ee0e4be1f407dd6e1852b94e3d7846ab70f461ff014",
                "sha256:6d5141647b7c730c83c3336a294303ac2897d8e86bcb1ed415a1903ed7e685a8",
                "sha256:3af6d69d4054ef2d040a30e7978745d76f14751aaae68c6b7cfa459539542829",
                "sha256:22a17ef1ea0c4b9d6fa2273e1bb45a148ba2f89958900d3913a2949b90c79f14",
                "sha256:912958c342e11f8857f8cf0f597ad90e4ad0283987f1e451c0866ccc3f2b7636",
                "sha256:e1f967bd5a7df8ab2ec6ffa1b67d74c0bd13800f06ff456062dc6e7ebf93a517",
                "sha256:3ae253e7d3a30c83a27182ae358c99530bf91e90993631a4e62adcb27bd0d80f"
            ]
        },
        "Metadata": {
            "LastTagTime": "2026-03-27T07:08:12.546934856Z"
        }
    }
]
  • docker tag
    标记本地镜像,将其归入某一仓库。
shell 复制代码
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
  • 别名
shell 复制代码
docker image tag
  • 样例
shell 复制代码
drw@Yuki:~$ docker tag redis:7.0.15 dairenwen/myredis:v1
drw@Yuki:~$ docker images
                                                                                        i Info →   U  In Use
IMAGE                       ID             DISK USAGE   CONTENT SIZE   EXTRA
dairenwen/myredis:v1        7705dd2858c1        109MB             0B    U
mysql:8.4.2                 f742bd39cd6b        584MB             0B    U
nacos/nacos-server:v2.2.2   0514f8ffee17       1.17GB             0B    U
nginx:1.24.0                6c0218f16876        142MB             0B    U
redis:7.0.15                7705dd2858c1        109MB             0B    U
  • docker rmi
    删除镜像。
shell 复制代码
docker rmi [OPTIONS] IMAGE [IMAGE...]
shell 复制代码
docker image rm, docker image remove
  • 参数
    • --no-prune:不移除该镜像的过程镜像,默认移除
    • -f:强制删除,当还有容器使用的时候,谨慎操作!
  • 示例:
shell 复制代码
drw@VM-0-14-ubuntu:~$ docker rmi 452a468a4bf9
Error response from daemon: conflict: unable to delete 452a468a4bf9 (must be forced) - image is being used by stopped container bba655837944
drw@VM-0-14-ubuntu:~$ docker rmi 452a468a4bf9 -f
Untagged: hello-world:latest
Deleted: sha256:452a468a4bf985040037cb6d5392410206e47db9bf5b7278d281f94d1c2d0931
  • 第一步:Untag(移除标签)
    如果用 < tag>:Docker 先移除该标签与镜像 ID 的绑定关系,此时镜像文件还在磁盘上。
    如果用 < image-id>:Docker 会先移除该镜像 ID 绑定的所有标签,然后进入第二步。
  • 第二步:Delete(物理删除镜像层)
    只有同时满足以下两个条件,Docker 才会真正删除磁盘上的镜像分层文件:
    该镜像 ID 没有任何标签绑定;
    该镜像 ID 没有被任何容器(包括已停止的容器)依赖。

WARNING:删除操作需谨慎,一旦删除无法还原!

  • docker save
    将指定镜像保存成 tar 归档文件。
shell 复制代码
docker save [OPTIONS] IMAGE [IMAGE...]
shell 复制代码
docker image save
  • -o:输出到的文件。

  • 示例:

shell 复制代码
drw@VM-0-14-ubuntu:~$ docker save -o mybusybox.tar 1487d0af5f52
# 推荐做法:保存时指定名称和标签
docker save -o mybusybox.tar mybusybox:v1 #方便load时直接加载
drw@VM-0-14-ubuntu:~$ ls -h *.tar
mybusybox.tar
  • docker load
    导入使用 docker save 命令导出的镜像。
shell 复制代码
docker load [OPTIONS]
shell 复制代码
docker image load
  • 参数:

    • --input, -i:指定导入的文件,代替 STDIN。
    • --quiet, -q:精简输出信息。
  • 示例:

shell 复制代码
drw@VM-0-14-ubuntu:~$ docker load -i mybusybox.tar
Loaded image ID: sha256:1487d0af5f52b4ba31c7e465126ee2123fe3f2305d638e7827681e7cf6c83d5e
drw@VM-0-14-ubuntu:~$ docker images busybox                                                                                                        i Info →   U  In Use
IMAGE            ID             DISK USAGE   CONTENT SIZE   EXTRA
busybox:1.24.0   1487d0af5f52       6.77MB         2.22MB
  • docker history
    显示镜像历史,按从新到旧的顺序逆向输出(最新生成的层在最顶部,最底层的基础镜像在最底部),还原镜像的构建全过程
shell 复制代码
docker history [OPTIONS] IMAGE
shell 复制代码
docker image history
  • 参数

    • -H, --human:大小和日期采用人容易读的格式展现
    • --no-trunc:显示全部信息,不要隔断
    • -q, --quiet:只显示镜像id信息
  • 样例:

shell 复制代码
drw@VM-0-14-ubuntu:~$ docker history nginx:1.24.0
IMAGE          CREATED       CREATED BY                                      SIZE      COMMENT
f6daac2445b0   2 years ago   CMD ["nginx" "-g" "daemon off;"]                0B        buildkit.dockerfile.v0
<missing>      2 years ago   STOPSIGNAL SIGQUIT                              0B        buildkit.dockerfile.v0
<missing>      2 years ago   EXPOSE map[80/tcp:{}]                           0B        buildkit.dockerfile.v0
<missing>      2 years ago   ENTRYPOINT ["/docker-entrypoint.sh"]            0B        buildkit.dockerfile.v0
<missing>      2 years ago   COPY 30-tune-worker-processes.sh /docker-ent...   16.4kB    buildkit.dockerfile.v0
<missing>      2 years ago   COPY 20-envsubst-on-templates.sh /docker-ent...   12.3kB    buildkit.dockerfile.v0
<missing>      2 years ago   COPY 10-listen-on-ipv6-by-default.sh /docker...   12.3kB    buildkit.dockerfile.v0
<missing>      2 years ago   COPY docker-entrypoint.sh / # buildkit          8.19kB    buildkit.dockerfile.v0
<missing>      2 years ago   RUN /bin/sh -c set -x     && addgroup --syst...   65.1MB    buildkit.dockerfile.v0
<missing>      2 years ago   ENV PKG_RELEASE=1~bullseye                      0B        buildkit.dockerfile.v0
<missing>      2 years ago   ENV NJS_VERSION=0.7.12                          0B        buildkit.dockerfile.v0
<missing>      2 years ago   ENV NGINX_VERSION=1.24.0                        0B        buildkit.dockerfile.v0
<missing>      2 years ago   LABEL maintainer=NGINX Docker Maintainers <d...   0B        buildkit.dockerfile.v0
<missing>      2 years ago   /bin/sh -c #(nop)  CMD ["bash"]                 0B
<missing>      2 years ago   /bin/sh -c #(nop) ADD file:5d6b639e8b6bcc011...   92.7MB
  • docker import
    从归档文件中创建镜像。
shell 复制代码
docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
shell 复制代码
docker image import
  • 参数:

    • -c:应用docker 指令创建镜像;
    • -m:提交时的说明文字;
  • 示例:

shell 复制代码
drw@VM-0-14-ubuntu:~$ docker import mynginx.tar mynginx:v1.0
sha256:8c1307bbbd75fc3fbfa0fca9790d09446ec928aa3c9121e6310b231413707c82

这里和前面学过的命令进行一个对比:

  1. docker save & docker load(镜像的完整克隆)

    流程:镜像 → tar包 → 镜像

    保存的是完整的镜像。

    包含所有的分层(Layers)、历史记录、元数据。

    load 回来后,镜像跟原来一模一样,标签也还在。

  2. docker export & docker import(容器的当前状态)

    流程:容器 → tar包(文件系统快照) → 新镜像

    保存的是容器当前的文件系统。
    丢弃了原镜像的历史、分层、元数据。

    import 回来后,生成的是一个全新的、只有一层的扁平镜像

  • docker image prune
    删除不使用的镜像。
shell 复制代码
docker image prune [OPTIONS]
  • 参数:
    • -a, --all:删除全部不使用的镜像;
    • --filter filter:指定过滤条件;
    • -f, --force:不提示是否删除;

WARNING:删除操作需谨慎,一旦删除无法还原!

  • docker build
    用于使用 Dockerfile 创建镜像。
shell 复制代码
docker build [OPTIONS] PATH | URL | -
  • 参数:

    • --build-arg=[]:设置镜像创建时的变量;
    • -f:指定要使用的Dockerfile路径;
    • --tag, -t:镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
    • --no-cache:创建镜像的过程不使用缓存;
    • --quiet, -q:安静模式,成功后只输出镜像ID;
    • --pull:尝试去更新镜像的新版本;
    • --network:默认 default。在构建期间设置RUN指令的网络模式
  • 示例:

shell 复制代码
docker build -t mynginx:v1 .

Docker Container(容器)

如果说镜像是静态的只读类,那么容器就是运行时动态实例化的对象 。当使用 docker run 命令启动一个容器时,Docker 引擎会在只读镜像层的最顶部附加一个可写的容器层。应用程序在此期间产生的所有文件读写操作,默认都会发生在这个读写层中,底层镜像的数据依然保持原始状态(即写时复制 Copy-on-Write 机制)。

容器的生命周期管理是日常运维的核心,它包含了创建、运行、暂停、停止和销毁等状态流转。一个容器的存活严格依赖于其内部主进程(PID 1)的运行状态**,主进程退出,容器即刻停止**。

来看看各个生命周期之间的转换关系:

这里采用nginx(反向代理web服务器)作为演示:

bash 复制代码
# ubuntu 安装 nginx
apt install nginx -y
# 查看版本
nginx -v
# 手动启动
nginx

nginx默认端口为80,请注意开放服务器80端口,成功访问页面如下:

相关命令
命令 别名 功能
docker create docker container create 创建容器
docker run docker container run 运行容器
docker attach docker container attach 连接到正在运行中的容器
docker commit docker container commit 将镜像提交为容器
docker cp docker container cp 在容器和主机之间拷贝
docker diff docker container diff 检查容器里文件结构的更改
docker exec docker container exec 在运行的容器中执行命令
docker export docker container export 将容器导出为 tar
docker container inspect 查看容器详细信息
docker kill docker container kill 杀死容器
docker logs docker container logs 查看日志
docker ps docker container ls、docker container list、docker container ps 查看正在运行的进程
docker pause docker container pause 暂停进程
docker port docker container port 查看容器的端口映射
docker container prune 删除停止的容器
docker rename docker container rename 重命名容器
docker restart docker container restart 重启容器
docker rm docker container rm、docker container remove 删除容器
docker start docker container start 启动容器
docker stats docker container stats 查看资源占用信息
docker stop docker container stop 停止容器
docker top docker container top 查看某个容器的资源占用
docker unpause docker container unpause 继续运行容器
docker update docker container update 更新容器配置
docker wait docker container wait 阻止一个或多个容器停止,然后打印退出代码
  • docker create
    创建一个新的容器但不启动它
shell 复制代码
docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
  • 参数:

    • -i: 以交互模式运行容器,通常与 -t 同时使用
    • -P: 随机端口映射,容器内部端口随机映射到主机的端口
    • -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
    • -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用
    • --name="nginx-lb": 为容器指定一个名称
    • -h "mars": 指定容器的hostname
    • --username="ritchie": 设置环境变量
    • --cpuset-cpus="0-2"--cpuset-cpus="0,1,2": 绑定容器到指定CPU运行
    • -m: 设置容器使用内存最大值
    • --network="bridge": 指定容器的网络连接类型
    • --link=[]: 添加链接到另一个容器
    • --volume, -v: 绑定一个卷
    • --rm: shell退出的时候自动删除容器
    • --restart: 自动重启
  • 示例:

shell 复制代码
drw@VM-0-14-ubuntu:~$ docker create --name mynginx -p 8080:80 nginx:1.24.0
51b9324d42cb904c639ec2d58b3f3bc10664f6d26440008f8a618e32004e2ed5
drw@VM-0-14-ubuntu:~$ docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS                    PORTS     NAMES
51b9324d42cb   nginx:1.24.0   "/docker-entrypoint...."   5 seconds ago   Created                             mynginx

后续可以通过docker start来启动:

bash 复制代码
drw@VM-0-14-ubuntu:~$ docker start 51b9324d42cb
51b9324d42cb
drw@VM-0-14-ubuntu:~$ docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                                     NAMES
51b9324d42cb   nginx:1.24.0   "/docker-entrypoint...."   4 minutes ago   Up 4 seconds   0.0.0.0:8080->80/tcp, [::]:8080->80/tcp   mynginx

  • docker run
    创建一个新的容器并运行一个命令,docker run 内部会先调用 docker create 创建容器,再立即调用 docker start 启动它。
shell 复制代码
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
  • 别名
shell 复制代码
docker container run
  • 关键参数
    • -d: 后台运行容器,并返回容器ID;
    • -i: 以交互模式运行容器,通常与 -t 同时使用;
    • -P: 随机端口映射,容器内部端口随机映射到主机的端口;
    • -p: 指定端口映射,格式为:主机(宿主)端口:容器端口;
    • -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
    • --name="nginx-lb": 为容器指定一个名称;
    • -h "mars": 指定容器的hostname;
    • -e username="ritchie": 设置环境变量;
    • --cpuset-cpus="0-2"--cpuset-cpus="0,1,2": 绑定容器到指定CPU运行;
    • -m: 设置容器使用内存最大值;
    • --network="bridge": 指定容器的网络连接类型;
    • --link: 添加链接到另一个容器;
    • --volume, -v: 绑定一个卷;
    • --rm: shell退出的时候自动删除容器。
  • 样例
shell 复制代码
# 拉取mysql镜像后进行后台启动,同时指定用户名密码,直接docker run启动失败
root@VM-0-14-ubuntu:/home/drw# docker run -d --name drw -p 3306:3306 -e MYSQL_ROOT_PASSWORD=dairenwen1092 mysql:8.4.2
b45b86149b8ff458bad516b429c5c695607e536516ab3b8e153228300ff3be0d
root@VM-0-14-ubuntu:/home/drw# docker ps
CONTAINER ID   IMAGE         COMMAND                  CREATED         STATUS         PORTS                                                    NAMES
b45b86149b8f   mysql:8.4.2   "docker-entrypoint.s..."   4 seconds ago   Up 3 seconds   0.0.0.0:3306->3306/tcp, [::]:3306->3306/tcp, 33060/tcp   drw
# 拉取centos镜像后启动,开启伪终端并开启交互模式,缺少任意一个无法正常启动
drw@VM-0-14-ubuntu:~$ docker run -it centos:7
[root@5981059b7836 /]# ls
anaconda-post.log  bin  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@5981059b7836 /]# uname -a
Linux 5981059b7836 6.8.0-71-generic #71-Ubuntu SMP PREEMPT_DYNAMIC Tue Jul 22 16:52:38 UTC 2025 x86_64 x86_64 x86_64 GNU/Linux
# -p参数指定宿主机到容器的端口映射,以便可以访问到容器端口
drw@VM-0-14-ubuntu:~$ docker run -d -p 8080:80 nginx:1.24.0
1bd4fc7af4f64f94b062b41c17d2a4eecfd606dc474437f1908a6092e5c6ff04
drw@VM-0-14-ubuntu:~$ docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS                      PORTS                                                    NAMES
1bd4fc7af4f6   nginx:1.24.0   "/docker-entrypoint...."   15 seconds ago   Up 14 seconds               0.0.0.0:8080->80/tcp, [::]:8080->80/tcp                  naughty_pasteur
# --name指定名称
drw@VM-0-14-ubuntu:~$ docker run --name='test' -d -p 8080:80 nginx:1.24.0
55d3a72eb3510725a62f640cb7f1524822e010863c8ffe2eaa19222bc9c99fb2
drw@VM-0-14-ubuntu:~$ docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS                      PORTS                                                    NAMES
55d3a72eb351   nginx:1.24.0   "/docker-entrypoint...."   15 seconds ago   Up 14 seconds               0.0.0.0:8080->80/tcp, [::]:8080->80/tcp                  test

# -h 可以指定主机名
drw@VM-0-14-ubuntu:~$ docker run -it -h 'myhost' centos:7
[root@myhost /]# hostname
myhost

# --cpu可以指定哪一个核,-m限制对应内存
drw@VM-0-14-ubuntu:~$ docker run -d -p 8080:80 --cpuset-cpus='0' -m 1g nginx:1.24.0
drw@VM-0-14-ubuntu:~$ docker stats
CONTAINER ID   NAME             CPU %     MEM USAGE / LIMIT   MEM %     NET I/O       BLOCK I/O     PIDS
4b7d1bc303d2   competent_bell   0.00%     4.082MiB / 1GiB     0.40%     946B / 126B   0B / 12.3kB   5

# --link可以连接到另一个容器,本质上是将ip地址做了本地dns解析
drw@VM-0-14-ubuntu:~$ docker run -it --name centos --link competent_bell centos:7
[root@832229670fb0 /]# ping competent_bell
PING competent_bell (172.17.0.2) 56(84) bytes of data.
64 bytes from competent_bell (172.17.0.2): icmp_seq=1 ttl=64 time=0.055 ms
64 bytes from competent_bell (172.17.0.2): icmp_seq=2 ttl=64 time=0.044 ms
64 bytes from competent_bell (172.17.0.2): icmp_seq=3 ttl=64 time=0.041 ms
64 bytes from competent_bell (172.17.0.2): icmp_seq=4 ttl=64 time=0.041 ms
^C
--- competent_bell ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3086ms
rtt min/avg/max/mdev = 0.041/0.045/0.055/0.007 ms

# --rm在容器退出之后自动删除,而不是保留在docker列表中
drw@VM-0-14-ubuntu:~$ docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED             STATUS                            PORTS                                     NAMES
832229670fb0   centos:7       "/bin/bash"              18 minutes ago      Exited (137) About a minute ago                                             centos
drw@VM-0-14-ubuntu:~$ docker run -it --rm --name rmcontainer -h 'mycentos' centos:7
[root@mycentos /]# exit
exit
drw@VM-0-14-ubuntu:~$ docker ps -a #顶层容器没变,说明已经结束被删除了
CONTAINER ID   IMAGE          COMMAND                  CREATED             STATUS                         PORTS                                     NAMES
832229670fb0   centos:7       "/bin/bash"              19 minutes ago      Exited (137) 2 minutes ago                                               centos

  • docker ps
    列出容器
shell 复制代码
docker ps [OPTIONS]
  • 别名
shell 复制代码
docker container ls, docker container list, docker container ps
  • 关键参数

    • -a: 显示所有的容器,包括未运行的。
    • -f: 根据条件过滤显示的内容。
    • --format: 指定返回值的模板文件。如json或者table
    • -l: 显示latest的容器。
    • -n: 列出最近创建的n个容器。
    • --no-trunc: 不截断输出。
    • -q: 静默模式,只显示容器编号。
    • -s: 显示总的文件大小。
  • 示例:

bash 复制代码
# 指定查询容器名为centos的容器
drw@VM-0-14-ubuntu:~$ docker ps -a -f name=centos
CONTAINER ID   IMAGE      COMMAND       CREATED          STATUS                        PORTS     NAMES
832229670fb0   centos:7   "/bin/bash"   43 minutes ago   Exited (137) 26 minutes ago             centos

# 指定查询json格式
drw@VM-0-14-ubuntu:~$ docker ps --format json
{"Command":"\"/docker-entrypoint....\"","CreatedAt":"2026-03-28 11:25:03 +0800 CST","ID":"4b7d1bc303d2","Image":"nginx:1.24.0","Labels":"maintainer=NGINX Docker Maintainers \u003cdocker-maint@nginx.com\u003e","LocalVolumes":"0","Mounts":"","Names":"competent_bell","Networks":"bridge","Platform":{"architecture":"amd64","os":"linux"},"Ports":"0.0.0.0:8080-\u003e80/tcp, [::]:8080-\u003e80/tcp","RunningFor":"52 minutes ago","Size":"0B","State":"running","Status":"Up 52 minutes"}

# 查询最近容器
drw@VM-0-14-ubuntu:~$ docker ps -l
CONTAINER ID   IMAGE      COMMAND       CREATED          STATUS                        PORTS     NAMES
832229670fb0   centos:7   "/bin/bash"   43 minutes ago   Exited (137) 26 minutes ago             centos

# 静默查询,只有截断后的容器号
drw@VM-0-14-ubuntu:~$ docker ps -q -a
832229670fb0
4b7d1bc303d2
feb669261787
55d3a72eb351
1bd4fc7af4f6
2fda2c94ea8d
5981059b7836
7e2decafee6a
b45b86149b8f
bba655837944

  • docker logs
    查看容器日志
shell 复制代码
docker logs [OPTIONS] CONTAINER
  • 参数:

    • -f, --follow: 跟踪日志输出
    • --since: 显示某个开始时间的所有日志
    • -t, --timestamps: 显示时间戳
    • -n, --tail: 仅列出最新N条容器日志
  • 示例:

shell 复制代码
# 跟踪查看容器mynginx的日志输出
drw@VM-0-14-ubuntu:~$ docker logs -f mynginx
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2026/03/31 02:37:05 [notice] 1#1: using the "epoll" event method
2026/03/31 02:37:05 [notice] 1#1: nginx/1.24.0
2026/03/31 02:37:05 [notice] 1#1: built by gcc 10.2.1 20210110 (Debian 10.2.1-6)
2026/03/31 02:37:05 [notice] 1#1: OS: Linux 6.8.0-71-generic
2026/03/31 02:37:05 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1024:524288
2026/03/31 02:37:05 [notice] 1#1: start worker processes
2026/03/31 02:37:05 [notice] 1#1: start worker process 29
2026/03/31 02:37:05 [notice] 1#1: start worker process 30
2026/03/31 02:37:05 [notice] 1#1: start worker process 31
2026/03/31 02:37:05 [notice] 1#1: start worker process 32


# 查看容器mynginx从2016年7月1日后的最新10条日志
docker logs --since="2016-07-01" --tail=10 mynginx

  • docker attach
    连接到正在运行中的容器
shell 复制代码
docker attach [OPTIONS] CONTAINE
  • 参数:

    • --sig-proxy: 是否将所有信号代理,默认是true;如果设置为false,退出终端不会影响容器,否则退出会导致容器停止。
  • 示例:

shell 复制代码
drw@VM-0-14-ubuntu:~$ docker attach 51b9324d42cb
# ctrlC直接退出
^C2026/03/31 02:54:57 [notice] 1#1: signal 2 (SIGINT) received, exiting
2026/03/31 02:54:57 [notice] 29#29: exiting
2026/03/31 02:54:57 [notice] 30#30: exiting
2026/03/31 02:54:57 [notice] 29#29: exit
2026/03/31 02:54:57 [notice] 30#30: exit
2026/03/31 02:54:57 [notice] 31#31: exiting
2026/03/31 02:54:57 [notice] 32#32: exiting
2026/03/31 02:54:57 [notice] 31#31: exit
2026/03/31 02:54:57 [notice] 32#32: exit
2026/03/31 02:54:57 [notice] 1#1: signal 17 (SIGCHLD) received from 29
2026/03/31 02:54:57 [notice] 1#1: worker process 29 exited with code 0
2026/03/31 02:54:57 [notice] 1#1: worker process 30 exited with code 0
2026/03/31 02:54:57 [notice] 1#1: worker process 31 exited with code 0
2026/03/31 02:54:57 [notice] 1#1: worker process 32 exited with code 0
2026/03/31 02:54:57 [notice] 1#1: exit^C

drw@VM-0-14-ubuntu:~$ docker attach --sig-proxy=false 51b9324d42cb
^C
# 此处按了 ctrl+c 不会把容器杀死

  • docker exec
    在容器中执行命令
shell 复制代码
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
  • 参数:

    • -d: 分离模式,在后台运行
    • -i: 即使没有附加也保持STDIN打开
    • -t: 分配一个伪终端
    • -u, --user="": 指定用户
    • -e, --env=[]: 设置环境变量
    • -w, --workdir="": 指定工作目录
  • 示例:

shell 复制代码
# 在容器 mynginx 中以交互模式执行curl命令
drw@VM-0-14-ubuntu:~$ docker exec -it mynginx bash
root@51b9324d42cb:/# curl 127.0.0.1
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
# 设置环境变量
drw@VM-0-14-ubuntu:~$ docker exec -it -e today=Tuesday mynginx bash
root@51b9324d42cb:/# env
HOSTNAME=51b9324d42cb
PWD=/
PKG_RELEASE=1~bullseye
today=Tuesday
HOME=/root
NJS_VERSION=0.7.12
TERM=xterm
SHLVL=1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
NGINX_VERSION=1.24.0
_=/usr/bin/env

  • docker start
    启动停止的容器
shell 复制代码
docker start [OPTIONS] CONTAINER [CONTAINER...]
  • 示例:
shell 复制代码
docker start mynginx

  • docker stop
    停止运行的容器
shell 复制代码
docker stop [OPTIONS] CONTAINER [CONTAINER...]
  • -s :发送的信号

  • 示例:

shell 复制代码
docker stop mynginx

  • docker restart
    重启容器
shell 复制代码
docker restart [OPTIONS] CONTAINER [CONTAINER...]
  • 参数:

    • -s :发送的信号
  • 示例:

shell 复制代码
docker restart mynginx

  • docker kill
    强制终止容器
shell 复制代码
docker kill [OPTIONS] CONTAINER [CONTAINER...]
  • 参数:
    • -s, --signal string: 发送的信号
  • docker stop 发送的是 SIGTERM 信号,会给容器一段优雅关闭的时间;
  • docker kill 发送的是 SIGKILL 信号,直接强制终止容器。
  • 示例:
shell 复制代码
docker kill mynginx

  • docker top
    查看容器中运行的进程信息,支持 ps 命令参数。
shell 复制代码
docker top CONTAINER [ps OPTIONS]
  • 示例:
shell 复制代码
drw@VM-0-14-ubuntu:~$ docker top 51b9324d42cb
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                2918096             2918072             0                   23:52               ?                   00:00:00            nginx: master process nginx -g daemon off;
message+            2918164             2918096             0                   23:52               ?                   00:00:00            nginx: worker process
message+            2918165             2918096             0                   23:52               ?                   00:00:00            nginx: worker process
message+            2918166             2918096             0                   23:52               ?                   00:00:00            nginx: worker process
message+            2918167             2918096             0                   23:52               ?                   00:00:00            nginx: worker process

  • docker stats
    显示容器资源的使用情况,包括:CPU、内存、网络 IO 等。
shell 复制代码
docker stats [OPTIONS] [CONTAINER...]
  • 参数:
    • -a, --all: 显示所有的容器,包括未运行的
    • --format string: 指定输出的模板文件
    • --no-stream: 展示当前状态就直接退出,不再实时更新
    • --no-trunc: 不截断输出信息
bash 复制代码
CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT     MEM %     NET I/O           BLOCK I/O    PIDS
51b9324d42cb   mynginx   0.00%     4.168MiB / 3.636GiB   0.11%     57.2kB / 71.1kB   0B / 4.1kB   5
字段 说明
CONTAINER ID / NAME 容器ID与名称
CPU % / MEM % 容器使用的CPU和内存的百分比
MEM USAGE / LIMIT 容器正在使用的总内存,和允许使用的内存总量
NET I/O 容器通过网络接口发送和接收的数据量
BLOCK I/O 容器从主机块设备读取和写入的数据量
PIDs 容器创建的进程或线程数
  • 示例:
shell 复制代码
# 列出所有运行中容器的资源使用情况
docker stats

# 仅查看指定容器的资源使用
docker stats mynginx

# 定制格式化输出内容
docker stats --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}"

  • docker container inspect
    查看容器详细信息
shell 复制代码
docker container inspect [OPTIONS] CONTAINER [CONTAINER...]
  • 参数:
    • -f, --format string: 指定返回值的模板文件,如 table、json
    • -s, --size: 显示总的文件大小

提示:docker inspect 功能更全,镜像和容器的详细信息都可以查询。

  • 示例:
shell 复制代码
drw@VM-0-14-ubuntu:~$ docker container inspect 51b9324d42cb
[
    {
        "Id": "51b9324d42cb904c639ec2d58b3f3bc10664f6d26440008f8a618e32004e2ed5",
        "Created": "2026-03-31T02:32:10.012296714Z",
        "Path": "/docker-entrypoint.sh",
        "Args": [
            "nginx",
            "-g",
            "daemon off;"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,

  • docker port
    列出指定容器的端口映射,或查找将PRIVATE_PORT NAT到面向公众的端口。
shell 复制代码
docker port CONTAINER [PRIVATE_PORT[/PROTO]]
  • 示例:
shell 复制代码
drw@VM-0-14-ubuntu:~$ docker port mynginx
80/tcp -> 0.0.0.0:8080
80/tcp -> [::]:8080
drw@VM-0-14-ubuntu:~$ docker port mynginx 80
0.0.0.0:8080
[::]:8080

drw@VM-0-14-ubuntu:~$ docker port mynginx 80/tcp
0.0.0.0:8080
[::]:8080
drw@VM-0-14-ubuntu:~$ docker port mynginx 80/udp
no public port '80/udp' published for mynginx

  • docker cp
    在容器和主机之间拷贝文件/目录
shell 复制代码
# 从容器拷贝到主机
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH

# 从主机拷贝到容器
docker cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH
  • 示例:
shell 复制代码
drw@VM-0-14-ubuntu:~$ docker cp mynginx:/usr/share/nginx/html/index.html .
Successfully copied 2.56kB to /home/drw/.
drw@VM-0-14-ubuntu:~$ cat index.html
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

  • docker diff
    检查容器里文件结构的更改
shell 复制代码
docker diff CONTAINER
  • 示例:
shell 复制代码
drw@VM-0-14-ubuntu:~$ docker diff  mynginx
C /root
A /root/.bash_history
C /run
A /run/nginx.pid
C /etc
C /etc/nginx
C /etc/nginx/conf.d
C /etc/nginx/conf.d/default.conf
C /var
C /var/cache
C /var/cache/nginx
A /var/cache/nginx/client_temp
A /var/cache/nginx/fastcgi_temp
A /var/cache/nginx/proxy_temp
A /var/cache/nginx/scgi_temp
A /var/cache/nginx/uwsgi_temp

  • docker commit
    从运行中的容器创建一个新的镜像
shell 复制代码
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
  • 参数:

    • -a, --author string: 提交的镜像作者
    • -c, --change list: 使用Dockerfile指令来创建镜像
    • -m, --message string: 提交时的说明文字
    • -p, --pause: 在commit时,将容器暂停
  • 示例:

shell 复制代码
drw@VM-0-14-ubuntu:~$ docker commit mynginx myimage:v1.0
sha256:5fe1ce47b39721285398224774abb00a082bc7a61302ec6300e1e79e1bebd717
drw@VM-0-14-ubuntu:~$ docker images myimage
                                                                                                                                        i Info →   U  In Use
IMAGE          ID             DISK USAGE   CONTENT SIZE   EXTRA
myimage:v1.0   5fe1ce47b397        215MB           57MB
# 如果此时继续向容器中新增文件,那么也会提交为镜像

drw@VM-0-14-ubuntu:~$ docker commit -a 'drw' -m 'create by drw' -p mynginx myimage:v2.0
Flag --pause has been deprecated, and enabled by default. Use --no-pause to disable pausing during commit.
sha256:b1f8aa7232d5200bf199442d43dc2f70a94c88273e3d59174f27f5187c687bbc
drw@VM-0-14-ubuntu:~$ docker image inspect myimage:v2.0 | grep 'drw'
        "Author": "drw",
        "Comment": "create by drw",
# 指定作者以及信息

drw@VM-0-14-ubuntu:~$ docker commit -c 'CMD ["tail","-f","/etc/hosts"]' mynginx myimage:v3.0
sha256:0c1a471e9477edcd6b409a7da10819e59bf4a3fe9e1b97def1b6da211e0d22f2
drw@VM-0-14-ubuntu:~$ docker run -d --name myimageruntest myimage:v3.0
68fe566e25dac1e6a1e391411acce600b0a14463f334554eb8907d73171d60c9
drw@VM-0-14-ubuntu:~$ docker ps --no-trunc -a
CONTAINER ID                                                       IMAGE          COMMAND                                          CREATED          STATUS                    PORTS                                     NAMES
68fe566e25dac1e6a1e391411acce600b0a14463f334554eb8907d73171d60c9   myimage:v3.0   "/docker-entrypoint.sh tail -f /etc/hosts"       50 seconds ago   Up 49 seconds             80/tcp     
# 修改启动命令

  • docker pause
    暂停容器中所有的进程
shell 复制代码
docker pause CONTAINER [CONTAINER...]
  • 示例:
shell 复制代码
drw@VM-0-14-ubuntu:~$ docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                                     NAMES
68fe566e25da   myimage:v3.0   "/docker-entrypoint...."   3 minutes ago   Up 3 minutes   80/tcp                                    myimageruntest
51b9324d42cb   nginx:1.24.0   "/docker-entrypoint...."   2 days ago      Up 46 hours    0.0.0.0:8080->80/tcp, [::]:8080->80/tcp   mynginx
drw@VM-0-14-ubuntu:~$ docker pause myimageruntest
myimageruntest
drw@VM-0-14-ubuntu:~$ docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS                  PORTS                                     NAMES
68fe566e25da   myimage:v3.0   "/docker-entrypoint...."   9 minutes ago   Up 9 minutes (Paused)   80/tcp                                    myimageruntest
51b9324d42cb   nginx:1.24.0   "/docker-entrypoint...."   2 days ago      Up 46 hours             0.0.0.0:8080->80/tcp, [::]:8080->80/tcp   mynginx

  • docker unpause
    恢复容器中所有被暂停的进程
shell 复制代码
docker unpause CONTAINER [CONTAINER...]
  • 示例:
shell 复制代码
drw@VM-0-14-ubuntu:~$ docker unpause myimageruntest
myimageruntest
drw@VM-0-14-ubuntu:~$ docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                                     NAMES
68fe566e25da   myimage:v3.0   "/docker-entrypoint...."   11 minutes ago   Up 11 minutes   80/tcp                                    myimageruntest

  • docker rm
    删除一个或多个容器
shell 复制代码
docker rm [OPTIONS] CONTAINER [CONTAINER...]
  • 参数:

    • -f, --force: 强制删除一个运行中的容器
    • -l, --link: 移除容器间的网络连接,而非容器本身
    • -v, --volumes: 删除与容器关联的卷
  • 示例:

shell 复制代码
# 强制删除容器 mynginx
docker rm -f mynginx

  • docker export
    将容器导出为tar归档文件
shell 复制代码
docker export [OPTIONS] CONTAINER
  • -o:写入到文件

  • 示例:

shell 复制代码
drw@VM-0-14-ubuntu:~$ docker export -o mynginx.tar mynginx
drw@VM-0-14-ubuntu:~$ ls -h mynginx.tar
mynginx.tar

  • docker wait
    阻塞运行直到容器停止,然后打印出它的退出代码
shell 复制代码
docker wait CONTAINER [CONTAINER...]
  • 示例:
shell 复制代码
drw@VM-0-14-ubuntu:~$ docker wait mynginx
0

  • docker rename
    重命名容器
shell 复制代码
docker rename CONTAINER NEW_NAME
  • 示例:
shell 复制代码
drw@VM-0-14-ubuntu:~$ docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED      STATUS          PORTS                                     NAMES
51b9324d42cb   nginx:1.24.0   "/docker-entrypoint...."   3 days ago   Up 10 seconds   0.0.0.0:8080->80/tcp, [::]:8080->80/tcp   mynginx
drw@VM-0-14-ubuntu:~$ docker rename mynginx mynginx_new
drw@VM-0-14-ubuntu:~$ docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED      STATUS          PORTS                                     NAMES
51b9324d42cb   nginx:1.24.0   "/docker-entrypoint...."   3 days ago   Up 21 seconds   0.0.0.0:8080->80/tcp, [::]:8080->80/tcp   mynginx_new

  • docker container prune

删除所有停止的容器

shell 复制代码
docker container prune [OPTIONS]
  • -f, --force: 不提示进行确认,直接执行删除

  • 示例:

shell 复制代码
drw@VM-0-14-ubuntu:~$ docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED      STATUS                    PORTS                                     NAMES
51b9324d42cb   nginx:1.24.0   "/docker-entrypoint...."   3 days ago   Up 2 minutes              0.0.0.0:8080->80/tcp, [::]:8080->80/tcp   mynginx_new
832229670fb0   centos:7       "/bin/bash"              5 days ago   Exited (137) 5 days ago                                             centos
drw@VM-0-14-ubuntu:~$ docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
832229670fb0c34db67167da9ec73a4066751e01fd3cd81ee07c7f02e7ecafdb

Total reclaimed space: 4.096kB
drw@VM-0-14-ubuntu:~$ docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED      STATUS         PORTS                                     NAMES
51b9324d42cb   nginx:1.24.0   "/docker-entrypoint...."   3 days ago   Up 2 minutes   0.0.0.0:8080->80/tcp, [::]:8080->80/tcp   mynginx_new

  • docker update
    更新容器的运行配置
shell 复制代码
docker update [OPTIONS] CONTAINER [CONTAINER...]
  • 参数:

    • --cpus int: CPU核心数量限制
    • -m, --memory string: 内存限制
    • --memory-swap string: 交换内存限制
    • --restart string: 容器重启策略
    • --cpu-period int: 限制CPU CFS周期
    • --cpu-quota int: 限制CPU CFS配额
  • 示例:

shell 复制代码
# 可以看到此时更改内存是失败的,建议在启动容器时就设置好内存
drw@VM-0-14-ubuntu:~$ docker update -m 500M mynginx_new
Error response from daemon: Cannot update container 51b9324d42cb904c639ec2d58b3f3bc10664f6d26440008f8a618e32004e2ed5: Memory limit should be smaller than already set memoryswap limit, update the memoryswap at the same time
相关推荐
云水木石3 小时前
Docker 内使用Claude Code
运维·docker·容器
xingyuzhisuan3 小时前
LoRA微调实战:8卡4090服务器如何高效微调LLaMA?
运维·服务器·llama·gpu算力
wanhengidc3 小时前
服务器租用的好处
大数据·运维·服务器·游戏·智能手机
NINGMENGb3 小时前
Infoseek舆情系统观察:自动化分析的天花板与公关人的不可替代性
运维·人工智能·自动化
志栋智能3 小时前
从脚本到智能体:低成本IT运维自动化演进路径
大数据·运维·服务器·人工智能·自动化
网安老伯3 小时前
护网行动防守实战:Web应用XSS漏洞应急处置与防护体系搭建_护网行动web应用
linux·运维·服务器·前端·web安全·网络安全·xss
斌味代码3 小时前
Docker + Kubernetes 生产环境部署:从容器化到自动扩缩容完整方案
docker·容器·kubernetes
峥无3 小时前
Linux Makefile
linux·运维·服务器
企智汇-项目管理软件厂商3 小时前
企智汇项目管理软件怎么样?企智汇软件全面解析:优势、服务、安全与价格深度评测!
大数据·运维·项目管理·devops·项目管理软件·项目管理系统·企业管理软件