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 集群中,更为轻量解耦的底层组件已经接管了容器的生命周期。
Docker 简介
什么是虚拟化、容器化?
- 物理机:实际的服务器或者计算机。相对于虚拟机而言的对实体计算机的称呼。物理
机提供给虚拟机以硬件环境,有时也称为“寄主”或“宿主”。 - 虚拟化:是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。在一台计算机上
同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都
可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率。 - 容器化:容器化是一种虚拟化技术,又称操作系统层虚拟化(Operating system level
virtualization),这种技术将操作系统内核虚拟化,可以允许用户空间软件实例
(instances)被分割成几个独立的单元,在内核中运行,而不是只有一个单一实例运
行。这个软件实例,也被称为是一个容器(containers)。对每个实例的拥有者与用户
来说,他们使用的服务器程序,看起来就像是自己专用的。容器技术是虚拟化的一种。
docker 是现今容器技术的事实标准。
为什么要虚拟化、后又有容器化?
- 极致轻量,资源利用率再上台阶
容器无完整操作系统的额外开销,镜像大小普遍为 MB 级,启动速度为秒级甚至毫秒级,一台物理机可承载数百上千个容器,资源利用率比虚拟化再提升 30% 以上,硬件成本进一步降低。 - 彻底解决环境一致性问题
容器的核心是一次构建,到处运行。它将业务代码、运行环境(JDK/Python/Node 等)、依赖库、配置文件全部打包成一个不可变的标准化镜像,开发、测试、预发、生产全流程使用同一个镜像,彻底消灭环境差异导致的部署问题。 - 完美适配微服务与 DevOps 体系
微服务架构下,一个系统会拆分为数十上百个独立迭代的服务,容器可与 CI/CD 流水线无缝集成:代码提交后自动构建镜像、自动测试、自动部署,业务交付周期从天级缩短到分钟级甚至秒级,是敏捷开发、持续交付的核心载体。 - 标准化运维,大幅降低复杂度
容器遵循 OCI 开放标准,无论业务是何种语言开发,打包成镜像后,部署、启动、停止、日志采集、监控告警的方式完全统一,运维人员无需再关心每个业务的底层运行环境,运维效率实现质的飞跃。 - 强大的弹性伸缩与自愈能力
配合 Kubernetes 编排系统,容器可根据业务的 CPU / 内存使用率、QPS 流量,实现秒级自动扩缩容 —— 高峰期自动新增容器承接流量,低谷期自动缩减容器释放资源,兼顾稳定性与成本;同时具备自愈能力,容器异常自动重启,节点故障自动将容器调度到健康节点,保障业务高可用。 - 更细粒度的资源管控
基于 Cgroups 技术,可精准限制每个容器的 CPU、内存、磁盘 IO、网络带宽,避免业务间互相抢占资源,资源管控的粒度和灵活度远高于虚拟机。
Docker 是一个开源的应用容器引擎,基于 Go 语言开发。它允许开发者将应用程序及其所有的依赖库、配置文件打包在一个标准化、轻便且可移植的镜像中。由于容器共享宿主机的操作系统内核,它避开了虚拟机启动客户机操作系统的庞大开销,使得应用的启动时间从分钟级缩减到毫秒级。Docker 的核心愿景是“Build, Ship, and Run Any App, Anywhere”,它彻底打破了“在我的机器上明明可以运行”的开发魔咒。
常见虚拟化实现
- 主机虚拟化(虚拟机)实现
主机虚拟化的原理是通过在物理服务器上安装一个虚拟化层来实现。这个虚拟化层可以在物理服务器和客户操作系统之间建立虚拟机,使得它们可以独立运行。
从软件框架的角度上,根据虚拟化层是直接位于硬件之上还是在一个宿主操作系统之上,将虚拟化划分为 Type1 和 Type2。
-
Type1 类的 Hypervisor(Hypervisor 是一种系统软件,它充当计算机硬件和虚拟机之间的中介,负责有效地分配和利用由各个虚拟机使用的硬件资源,这些虚拟机在物理主机上单独工作,因此,Hypervisor 也称为虚拟机管理器)直接运行在硬件之上,没有宿主操作系统,Hypervisor 直接控制硬件资源和客户机。典型框架为 Xen、Vmware ESX。
-
Type2 类的 Hypervisor 运行在一个宿主操作系统之上(如 Vmware Workstation),Hypervisor 作为宿主操作系统中的一个应用程序,客户机就是在宿主操作系统上的一个进程。
容器虚拟化实现原理
容器虚拟化,有别于主机虚拟化,是操作系统层的虚拟化。通过 namespace 进行程序的隔离,加上 cgroups 进行资源的控制,以此来进行虚拟化。
什么是Namespace(命名空间)?
namespace 是 Linux 内核用来隔离内核资源的方式。通过 namespace 可以让一些进程只能看到与自己相关的一部分资源,而另外一些进程也只能看到与它们自己相关的资源,这两拨进程根本就感觉不到对方的存在。具体的实现方式是把一个或多个进程的相关资源指定在同一个 namespace 中。
Linux namespaces 是对全局系统资源的一种封装隔离,使得处于不同 namespace 的进程拥有独立的全局系统资源,改变一个 namespace 中的系统资源只会影响当前 namespace 里的进程,对其他 namespace 中的进程没有影响。
Linux 提供了多个 API 用来操作 namespace,它们是 clone()、setns() 和 unshare() 函数,为了确定隔离的到底是哪项 namespace,在使用这些 API 时,通常需要指定一些调用参数:CLONE_NEWIPC、CLONE_NEWNET、CLONE_NEWNS、CLONE_NEWPID、CLONE_NEWUSER、CLONE_NEWUTS 和 CLONE_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。
想想要如果我们要隔离两个进程需要怎么办?
- 首先容器进程与进程之间需要隔离,所以需要 PID 隔离
- 首先容器 A 进程不能读取容器 B 进程通讯内容需要隔离信号量等,所以需要 IPC 隔离
- 首先容器 A 进程不能读取容器 B 进程的文件,所以需要 Mount 隔离
- 首先容器 A 进程不能读取容器 B 进程的 socket,所以需要网络隔离、主机隔离
- 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 以标准化镜像为统一交付载体、轻量级隔离容器为运行单元,解决了传统应用开发、测试、部署全流程中环境不一致、资源利用率低、部署运维低效、应用隔离性差、跨环境迁移与版本管理回滚困难的核心痛点。
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 的标准流程演示:
# 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 没装上,按以下步骤重新正确安装:
- 清理旧的错误配置(关键一步)
# 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 官方源
# 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
# 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
- 验证安装并启动服务
# 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:检查并创建配置文件
# 若文件不存在,先创建目录和文件
sudo mkdir -p /etc/docker
sudo touch /etc/docker/daemon.json
2:编辑配置文件
使用文本编辑器打开文件:
sudo nano /etc/docker/daemon.json
{
"registry-mirrors": [
"https://hub-mirror.c.163.com", // 网易镜像源
"https://mirror.ccs.tencentyun.com", // 腾讯云镜像源
"https://xxxxxxxx.mirror.aliyuncs.com" //阿里云个人镜像源
]
}
步骤 3:重启 Docker 服务
sudo systemctl daemon-reload #重载配置
sudo systemctl restart docker #重启 Docker
步骤 4:验证配置是否生效
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 字段指定新目录 | 官方推荐,兼容性好,适合已安装后修改 | 需迁移原有数据,否则会丢失已下载的镜像和容器 |
当前按照第三种方法修改:
- 迁移原有数据
直接修改data-root后,Docker 会把新数据写到新目录,但旧目录/var/lib/docker里的镜像、容器不会自动迁移,需要手动复制:# 先停止 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 - 配置验证
重启 Docker 后,用docker info查看Docker Root Dir是否变为你设置的新路径:docker info | grep "Docker Root Dir"
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)私有仓库:不对外开放,往往位于私有网络,只有公司内部人员可以使用。
按供应商和面向群体划分
镜像仓库工作机制
- 镜像仓库使用流程:
- 通过 docker login 登录仓库
- Docker pull 拉取需要的镜像
- 通过 dockerfile 或者 commit 等方式制作完镜像通过 docker push 上传到仓库
- Docker Registry 中的镜像通常由开发人员制作,而后推送至公共或私有Registry 上保存,供其他人员使用
- 启动容器时,docker daemon 会试图从本地获取相关的镜像;本地镜像不存在时,其将从Registry 中下载该镜像并保存到本地;
镜像仓库拉取镜像:
随便打开nginx的一个镜像:

#复制到终端中,拉取成功!
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 网站被封,该命令可以用阿里云或者腾讯云的镜像仓库练习,参考后续实战部分。
docker login [OPTIONS] [SERVER]
-u:登陆的用户名-p:登陆的密码
docker login -u 用户名 -p 密码
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
从镜像仓库中拉取或者更新指定镜像
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
docker image pull
-a:拉取所有 tagged 镜像--disable-content-trust:忽略镜像的校验,默认开启
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
将本地的镜像上传到镜像仓库,需先登陆到镜像仓库
docker push [OPTIONS] NAME[:TAG]
docker image push
-a:推送所有 tagged 镜像--disable-content-trust:忽略镜像的校验,默认开启
需要先在官方创建一个个人仓库:

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 网站被封,该命令国内暂时无法实操,需国外网络环境。
docker search [OPTIONS] TERM
--no-trunc:显示完整的镜像描述-f <过滤条件>:列出收藏数不小于指定值的镜像
# 从 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 网站被封,该命令可以用阿里云或者腾讯云的镜像仓库练习,参考后续实战部分。
docker logout [SERVER]
Docker Image(镜像)
镜像是容器启动的基石,它是一个只读的模板。Docker 镜像底层采用 UnionFS(联合文件系统)技术,将应用所需的操作系统根目录、运行库、环境变量及程序代码分层叠加在一起。当我们在编写 Dockerfile 时,每一条指令(如 FROM、RUN、COPY)都会生成一个新的只读镜像层。
每一层文件系统叫一层 layer,联合文件系统可以对每一层文件系统设置三种权限只读(readonly)、读写(readwrite)和写出(whiteout-able),但是 docker 镜像中每一层文件系统都是只读的。构建镜像的时候,从一个最基本的操作系统开始,每个构建的操作都相当于做一层修改,增加了一层文件系统。一层层往上叠加,上层的修改会覆盖底层该位置的可见性。
相关命令
- docker images
列出本地镜像
docker images [OPTIONS] [REPOSITORY[:TAG]]
别名
docker image ls, docker image list
- 关键参数
-a: 列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层);--digests: 显示镜像的摘要信息;-f: 显示满足条件的镜像;--format: 指定返回值的模板文件;--no-trunc: 显示完整的镜像信息;-q: 只显示镜像ID。
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
查看镜像详细信息
docker image inspect [OPTIONS] IMAGE [IMAGE...]
- 样例
# 查看镜像详细信息
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
标记本地镜像,将其归入某一仓库。
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
- 别名
docker image tag
- 样例
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
删除镜像。
docker rmi [OPTIONS] IMAGE [IMAGE...]
docker image rm, docker image remove
- 参数
--no-prune:不移除该镜像的过程镜像,默认移除-f:强制删除,当还有容器使用的时候,谨慎操作!
- 示例:
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 归档文件。
docker save [OPTIONS] IMAGE [IMAGE...]
docker image save
-
-o:输出到的文件。 -
示例:
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命令导出的镜像。
docker load [OPTIONS]
docker image load
-
参数:
--input, -i:指定导入的文件,代替 STDIN。--quiet, -q:精简输出信息。
-
示例:
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
显示镜像历史,按从新到旧的顺序逆向输出(最新生成的层在最顶部,最底层的基础镜像在最底部),还原镜像的构建全过程
docker history [OPTIONS] IMAGE
docker image history
-
参数
-H, --human:大小和日期采用人容易读的格式展现--no-trunc:显示全部信息,不要隔断-q, --quiet:只显示镜像id信息
-
样例:
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
从归档文件中创建镜像。
docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
docker image import
-
参数:
-c:应用docker 指令创建镜像;-m:提交时的说明文字;
-
示例:
drw@VM-0-14-ubuntu:~$ docker import mynginx.tar mynginx:v1.0
sha256:8c1307bbbd75fc3fbfa0fca9790d09446ec928aa3c9121e6310b231413707c82
这里和前面学过的命令进行一个对比:
-
docker save & docker load(镜像的完整克隆)
流程:镜像 → tar包 → 镜像
保存的是完整的镜像。
包含所有的分层(Layers)、历史记录、元数据。
load 回来后,镜像跟原来一模一样,标签也还在。 -
docker export & docker import(容器的当前状态)
流程:容器 → tar包(文件系统快照) → 新镜像
保存的是容器当前的文件系统。
丢弃了原镜像的历史、分层、元数据。
import 回来后,生成的是一个全新的、只有一层的扁平镜像。
- docker image prune
删除不使用的镜像。
docker image prune [OPTIONS]
- 参数:
-a, --all:删除全部不使用的镜像;--filter filter:指定过滤条件;-f, --force:不提示是否删除;
WARNING:删除操作需谨慎,一旦删除无法还原!
- docker build
用于使用 Dockerfile 创建镜像。
docker build [OPTIONS] PATH | URL | -
-
参数:
--build-arg=[]:设置镜像创建时的变量;-f:指定要使用的Dockerfile路径;--tag, -t:镜像的名字及标签,通常name:tag或者name格式;可以在一次构建中为一个镜像设置多个标签。--no-cache:创建镜像的过程不使用缓存;--quiet, -q:安静模式,成功后只输出镜像ID;--pull:尝试去更新镜像的新版本;--network:默认default。在构建期间设置RUN指令的网络模式
-
示例:
docker build -t mynginx:v1 .
Docker Container(容器)
如果说镜像是静态的只读类,那么容器就是运行时动态实例化的对象。当使用 docker run 命令启动一个容器时,Docker 引擎会在只读镜像层的最顶部附加一个可写的容器层。应用程序在此期间产生的所有文件读写操作,默认都会发生在这个读写层中,底层镜像的数据依然保持原始状态(即写时复制 Copy-on-Write 机制)。
容器的生命周期管理是日常运维的核心,它包含了创建、运行、暂停、停止和销毁等状态流转。一个容器的存活严格依赖于其内部主进程(PID 1)的运行状态**,主进程退出,容器即刻停止**。
来看看各个生命周期之间的转换关系:

这里采用nginx(反向代理web服务器)作为演示:
# 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
创建一个新的容器但不启动它
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: 自动重启
-
示例:
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来启动:
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 启动它。
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
- 别名
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退出的时候自动删除容器。
- 样例
# 拉取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
列出容器
docker ps [OPTIONS]
- 别名
docker container ls, docker container list, docker container ps
-
关键参数
-a: 显示所有的容器,包括未运行的。-f: 根据条件过滤显示的内容。--format: 指定返回值的模板文件。如json或者table-l: 显示latest的容器。-n: 列出最近创建的n个容器。--no-trunc: 不截断输出。-q: 静默模式,只显示容器编号。-s: 显示总的文件大小。
-
示例:
# 指定查询容器名为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
查看容器日志
docker logs [OPTIONS] CONTAINER
-
参数:
-f,--follow: 跟踪日志输出--since: 显示某个开始时间的所有日志-t,--timestamps: 显示时间戳-n,--tail: 仅列出最新N条容器日志
-
示例:
# 跟踪查看容器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
连接到正在运行中的容器
docker attach [OPTIONS] CONTAINE
-
参数:
--sig-proxy: 是否将所有信号代理,默认是true;如果设置为false,退出终端不会影响容器,否则退出会导致容器停止。
-
示例:
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
在容器中执行命令
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
-
参数:
-d: 分离模式,在后台运行-i: 即使没有附加也保持STDIN打开-t: 分配一个伪终端-u,--user="": 指定用户-e,--env=[]: 设置环境变量-w,--workdir="": 指定工作目录
-
示例:
# 在容器 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
启动停止的容器
docker start [OPTIONS] CONTAINER [CONTAINER...]
- 示例:
docker start mynginx
- docker stop
停止运行的容器
docker stop [OPTIONS] CONTAINER [CONTAINER...]
-
-s :发送的信号
-
示例:
docker stop mynginx
- docker restart
重启容器
docker restart [OPTIONS] CONTAINER [CONTAINER...]
-
参数:
- -s :发送的信号
-
示例:
docker restart mynginx
- docker kill
强制终止容器
docker kill [OPTIONS] CONTAINER [CONTAINER...]
- 参数:
-s,--signal string: 发送的信号
docker stop发送的是SIGTERM信号,会给容器一段优雅关闭的时间;docker kill发送的是SIGKILL信号,直接强制终止容器。
- 示例:
docker kill mynginx
- docker top
查看容器中运行的进程信息,支持 ps 命令参数。
docker top CONTAINER [ps OPTIONS]
- 示例:
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 等。
docker stats [OPTIONS] [CONTAINER...]
- 参数:
-a,--all: 显示所有的容器,包括未运行的--format string: 指定输出的模板文件--no-stream: 展示当前状态就直接退出,不再实时更新--no-trunc: 不截断输出信息
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 | 容器创建的进程或线程数 |
- 示例:
# 列出所有运行中容器的资源使用情况
docker stats
# 仅查看指定容器的资源使用
docker stats mynginx
# 定制格式化输出内容
docker stats --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}"
- docker container inspect
查看容器详细信息
docker container inspect [OPTIONS] CONTAINER [CONTAINER...]
- 参数:
-f,--format string: 指定返回值的模板文件,如 table、json-s,--size: 显示总的文件大小
提示:docker inspect 功能更全,镜像和容器的详细信息都可以查询。
- 示例:
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到面向公众的端口。
docker port CONTAINER [PRIVATE_PORT[/PROTO]]
- 示例:
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
在容器和主机之间拷贝文件/目录
# 从容器拷贝到主机
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH
# 从主机拷贝到容器
docker cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH
- 示例:
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
检查容器里文件结构的更改
docker diff CONTAINER
- 示例:
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
从运行中的容器创建一个新的镜像
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
-
参数:
-a,--author string: 提交的镜像作者-c,--change list: 使用Dockerfile指令来创建镜像-m,--message string: 提交时的说明文字-p,--pause: 在commit时,将容器暂停
-
示例:
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
暂停容器中所有的进程
docker pause CONTAINER [CONTAINER...]
- 示例:
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
恢复容器中所有被暂停的进程
docker unpause CONTAINER [CONTAINER...]
- 示例:
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
删除一个或多个容器
docker rm [OPTIONS] CONTAINER [CONTAINER...]
-
参数:
-f,--force: 强制删除一个运行中的容器-l,--link: 移除容器间的网络连接,而非容器本身-v,--volumes: 删除与容器关联的卷
-
示例:
# 强制删除容器 mynginx
docker rm -f mynginx
- docker export
将容器导出为tar归档文件
docker export [OPTIONS] CONTAINER
-
-o:写入到文件
-
示例:
drw@VM-0-14-ubuntu:~$ docker export -o mynginx.tar mynginx
drw@VM-0-14-ubuntu:~$ ls -h mynginx.tar
mynginx.tar
- docker wait
阻塞运行直到容器停止,然后打印出它的退出代码
docker wait CONTAINER [CONTAINER...]
- 示例:
drw@VM-0-14-ubuntu:~$ docker wait mynginx
0
- docker rename
重命名容器
docker rename CONTAINER NEW_NAME
- 示例:
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
删除所有停止的容器
docker container prune [OPTIONS]
-
-f,--force: 不提示进行确认,直接执行删除 -
示例:
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
更新容器的运行配置
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配额
-
示例:
# 可以看到此时更改内存是失败的,建议在启动容器时就设置好内存
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
更多推荐
所有评论(0)