docker介绍
容器
容器是一种轻量级的操作系统层虚拟化技术,它通过隔离应用程序的运行环境(文件系统、网络、进程、内存等),将应用程序及其所有依赖(库、配置文件、运行时)打包成一个可移植的 “标准化单元”。
简单来说:容器 = 应用程序 + 依赖环境 + 隔离层,它不依赖宿主机的具体配置,能在任何支持容器引擎的系统上以相同方式运行(即 “一次打包,到处运行”)。
容器的工作原理(How)
容器的实现依赖于宿主机操作系统的内核特性(以 Linux 为例):
-
Namespace(命名空间):实现资源隔离
Linux 内核通过 Namespace 为每个容器创建独立的 “视图”,包括:
PID Namespace:容器内的进程 ID 与宿主机隔离(容器内 PID=1 的进程不会与宿主机冲突);Network Namespace:容器有独立的网络接口、IP、端口;Mount Namespace:容器有独立的文件系统挂载点;- 还有 User、UTS、IPC 等 Namespace,确保容器内的资源与外部完全隔离。
-
Cgroups(控制组):实现资源限制
Cgroups 用于限制容器能使用的系统资源(CPU、内存、磁盘 I/O、网络带宽等),例如限制某个容器最多使用 1 核 CPU 和 2GB 内存,避免单个容器占用过多资源影响其他容器。
-
镜像与容器的关系
容器是镜像的运行实例:镜像是只读的模板(包含应用和依赖),容器是镜像加载到内存后的可读写副本,多个容器可基于同一个镜像创建,彼此隔离。
docker镜像
Docker 镜像是只读的、不可修改的文件系统模板,包含了运行应用程序所需的所有依赖(代码、运行时、库、环境变量、配置文件等)。
简单来说:镜像就像一张 “系统安装光盘” 或 “软件安装包”,是创建容器的静态蓝本—— 容器是镜像加载到内存后的可读写运行实例,一个镜像可以创建多个独立的容器。
镜像的工作原理(How)
- 分层存储机制
镜像采用分层(Layered)存储设计,而非单一文件:
- 每个镜像由多个只读层叠加而成,每层对应 Dockerfile 中的一条指令(如
FROM、RUN、COPY); - 分层存储的优势:复用性(不同镜像可共享底层层,节省存储空间)、增量构建(修改镜像时仅更新变化的层,加速构建和传输)。
例如,nginx:alpine 镜像的分层可能包括:
-
Alpine Linux 基础层 → 2. 安装依赖库层 → 3. 安装 Nginx 层 → 4. 配置 Nginx 层。
-
镜像与容器的关系
- 镜像:只读模板,无状态,不能运行;
- 容器:镜像的可读写实例,启动容器时,Docker 会在镜像的只读层之上添加一层可读写层(容器层),容器的所有修改都发生在这一层,不影响底层镜像。
容器与镜像
| 对比项 | 镜像(Image) | 容器(Container) |
|---|---|---|
| 定义 | 只读的文件系统模板,包含应用运行的所有依赖(代码、库、配置等) | 镜像的可读写运行实例,是镜像加载到内存后的动态实体 |
| 状态 | 静态(无运行状态,仅作为模板存在) | 动态(运行中的进程,有生命周期,可启动、停止、销毁) |
| 存储特性 | 分层存储(由多个只读层叠加,共享底层依赖以节省空间) | 在镜像的只读层之上添加可写层(容器层),所有修改仅在该层生效 |
| 生命周期 | 创建后长期稳定,版本化管理(如 nginx:1.29) | 从启动到停止 / 销毁(临时或持久,取决于业务需求) |
| 与宿主机关系 | 不依赖宿主机环境,可跨平台分发 | 共享宿主机内核(Linux 容器),隔离但依赖宿主机系统资源 |
| 核心作用 | 用于分发和版本控制(作为应用的 “安装包”) | 用于运行应用(作为应用的 “运行实例”) |
| 数量关系 | 一个镜像可以创建多个容器 | 一个容器只能由一个镜像创建(启动时指定镜像) |
| 修改性 | 只读(无法直接修改,需通过 Dockerfile 重建或 docker commit 生成新镜像) | 可写(容器内的修改仅在 “容器层” 生效,不影响底层镜像) |
容器与虚拟机

| 对比项 | 虚拟机 | 容器 |
|---|---|---|
| 优点 | 1. 使用简单 2. 也有成熟管理工具,vmware esxi、vcenter、KVM、Openstack 3. 可以随意定制4. 启动虚拟机要经历完整的 Linux 启动流程 | 1. 快速部署(扩容,弹性伸缩) 2. 大部分环境都有现成镜像 3. 让我们不再关注系统基础设施,把关注点放在配置、升级、优化 4. 不依赖硬件 5. 启动容器秒级 6. 相当于一个进程 |
| 缺点 | 1. 需要硬件支持虚拟化技术 (VT-X) 2. 资源利用率不高 3. 同一台虚拟跑多个服务,可能有冲突 4. 占用资源较多 5. 不满足目前升级、快速扩容、快速部署、回滚不方便 | 1. 使用较为复杂 2. 共享 linux 系统内核,推荐使用较新 linux 内核 3. 自定义镜像与批量管理 |
容器运行时选型
| 选型 | 核心特点 | 适用场景 |
|---|---|---|
| Docker | 生态最成熟,工具链丰富(docker 命令直观),支持本地开发、测试到生产全流程 | 个人开发、中小企业项目、需快速上手容器化的场景;依赖 Docker 生态(如 Compose、Dockerfile)的项目 |
| Podman | 无守护进程(daemonless),支持 rootless 运行(非 root 用户也能操作容器),安全性更高 | 企业级生产环境、需严格权限控制的场景;替代 Docker 作为底层运行时,兼容 Dockerfile 和镜像格式 |
| Containerd | 轻量级底层运行时,是 Docker、Kubernetes 的底层依赖,专注 “运行容器” 的核心功能 | 作为 Kubernetes 集群的底层运行时(如与 CRI-O 配合);大型编排平台的底层组件 |
docker cs架构

docker的运行流程(底层视角)
当你运行一个容器时,Docker 引擎(dockerd)会做以下事情:
-
拉取或加载镜像:
dockerd先检查本地镜像仓库,无对应镜像则从远程 Registry(如 Docker Hub)拉取;镜像由多个只读层组成,通过 UnionFS(现代默认用 OverlayFS)完成分层加载。 -
调用 Containerd 组件:
dockerd不直接处理容器底层操作,而是将 “创建容器” 的请求转发给 Containerd(负责容器生命周期管理的核心组件)。 -
创建容器文件系统:
Containerd 协调挂载 OverlayFS,在镜像的只读层之上添加一个独立的可写层(即 “容器层”),所有容器内的修改仅保存在该可写层中。
-
Containerd 调用 Runc:
Containerd 启动 Runc(符合 OCI 标准的底层运行时),由 Runc 执行容器的 “隔离、限制、进程启动” 等核心操作。
-
创建命名空间:
Runc 通过
clone()系统调用,为容器创建独立的 PID、Network、Mount、UTS、IPC 等命名空间,实现资源隔离。 -
设置资源限制(cgroups):
Runc 向 Linux Cgroups 的子系统目录(如
/sys/fs/cgroup/memory)写入配置,限制容器的 CPU、内存等资源使用上限。 -
启动容器进程:
Runc 通过
execve()系统调用,在新的隔离环境中启动容器主进程(如/bin/bash);进程启动后 Runc 会立即退出,仅负责 “一次性创建容器”。 -
配置网络:
dockerd配合网络插件(如默认的 bridge 插件),通过 Containerd 为容器创建虚拟网卡、分配 IP、配置路由、NAT 规则及端口映射等。 -
挂载卷(Volume):
Containerd 将宿主机目录或 Docker 卷,挂载到容器内指定的路径,实现容器与宿主机 / 其他容器的数据共享。
-
维持容器运行:
Containerd 启动
containerd-shim(垫片进程),作为容器主进程的父进程,负责维持容器运行、收集日志、传递信号(如docker stop的终止信号)。
docker架构组件
| 组件名称 | 作用说明 |
|---|---|
| Docker 客户端(Client) | 用户与 Docker 交互的入口,提供docker build/pull/run等命令,将操作指令发送给 Docker 守护进程执行。 |
| Docker 守护进程(Docker Daemon) | 运行在宿主机后台的服务进程(dockerd),是 Docker 服务的核心:负责处理客户端请求,管理镜像、容器、网络、存储等资源。 |
| 镜像(Images) | 容器的 “只读模板”,基于联合文件系统的分层结构,包含应用运行所需的代码、依赖、配置等;本地镜像存储在宿主机中,可从仓库拉取。 |
| 容器(Containers) | 基于镜像创建的可运行实例:在镜像的只读层之上添加 “可写层”,容器内的修改仅保存在自身可写层中,实现与其他容器 / 宿主机的隔离。 |
| 镜像仓库(Registry) | 用于存储、分发镜像的服务:- 远程公共仓库:如 Docker Hub(官方公共镜像仓库);- 自建本地仓库:如 Harbor(企业私有镜像仓库)。 |
Docker镜像结构(分层原理)
FROM ubuntu:2204 #基础层
ADD sources.list /etc/apt/source.list #加了一层
RUN apt update && \ #加了一层
apt install -y xxx
CMD ["tail -f /dev/null"] #阻塞命令
-
所有镜像层是只读的。
-
容器运行时会在最上层添加一个可写层(Container Layer)。
-
多个容器可以共享同一个镜像的只读层,节省空间。
部署docker
Docker: Accelerated Container Application Development
环境准备
| 节点 | 配置 | ip |
|---|---|---|
| docker01 | 2c4g | 10.0.0.81/172.16.1.81 |
| docker02 | 2c4g | 10.0.0.82/172.16.1.82 |
yum/apt 安装
- kylin安装
#0.安装依赖
yum install -y https://mirrors.aliyun.com/centos/7/extras/x86_64/Packages/slirp4netns-0.4.3-4.el7_8.x86_64.rpm
yum install -y https://mirrors.aliyun.com/centos/7/extras/x86_64/Packages/fuse-overlayfs-0.7.2-6.el7_8.x86_64.rpm
#1.添加docker源仓库
yum-config-manager --add-repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
#2.修改源
sed -i 's/$releasever/7/g' /etc/yum.repos.d/docker-ce.repo
#3.安装docker
yum install docker-ce-rootless-extras -y
yum install -y docker-ce docker-ce-cli containerd.io
#4.开启并设置开机自启docker,并查看版本
#5.设置docker镜像加速
systemctl enable --now docker && docker --version
cat >/etc/docker/daemon.json<<'EOF'
> {
> "registry-mirrors" : ["https://do.nark.eu.org",
> "https://dc.j8.work",
> "https://docker.m.daocloud.io",
> "https://dockerproxy.com",
> "https://docker.mirrors.ustc.edu.cn",
> "https://docker.nju.edu.cn",
> "https://docker.mirrors.ustc.edu.cn",
> "https://docker.registry.cyou",
> "https://docker-cf.registry.cyou",
> "https://dockercf.jsdelivr.fyi",
> "https://docker.jsdelivr.fyi",
> "https://dockertest.jsdelivr.fyi",
> "https://mirror.aliyuncs.com",
> "https://dockerproxy.com",
> "https://mirror.baidubce.com",
> "https://docker.m.daocloud.io",
> "https://docker.nju.edu.cn",
> "https://docker.mirrors.sjtug.sjtu.edu.cn",
> "https://docker.mirrors.ustc.edu.cn",
> "https://mirror.iscas.ac.cn",
> "https://docker.rainbond.cc",
> "https://do.nark.eu.org",
> "https://docker.shootchat.top",
> "https://registry.docker-cn.com"]
> }
> EOF
#6.重新加载系统配置文件,重启docker
systemctl daemon-reload && systemctl restart docker
#7.测试是否能拉取镜像
docker run hello-world
#8.查看镜像
docker images
#9.docker补全
yum install -y bash-completion
sudo curl -L https://raw.githubusercontent.com/docker/docker-ce/master/components/cli/contrib/completion/bash/docker -o /etc/bash_completion.d/docker.sh
source /etc/bash_completion.d/docker.sh
- ubt安装
#1.安装前先卸载操作系统默认安装的docker
apt purge docker docker-engine docker.io containerd runc
#2.安装必要支持
apt install apt-transport-https ca-certificates curl software-properties-common gnupg lsb-release
#2.添加源和gpgkey
#添加 Docker 官方 GPG key (可能国内现在访问会存在问题)
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
#添加 apt Docker官方源
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
#阿里源(推荐使用阿里的gpg KEY)
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
#阿里apt源
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
#3.更新源
apt update
#4.安装docker
apt install docker-ce docker-ce-cli containerd.io
#5.查看docker状态,查看docker版本
systemctl status docker && docker --version
#6.安装docker命令补全工具
sudo apt-get install bash-completion
sudo curl -L https://raw.githubusercontent.com/docker/docker-ce/master/components/cli/contrib/completion/bash/docker -o /etc/bash_completion.d/docker.sh
source /etc/bash_completion.d/docker.sh
#7.配置docker镜像加速
cat >/etc/docker/daemon.json<<'EOF'
{
"registry-mirrors" : ["https://do.nark.eu.org",
"https://dc.j8.work",
"https://docker.m.daocloud.io",
"https://dockerproxy.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.nju.edu.cn",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.registry.cyou",
"https://docker-cf.registry.cyou",
"https://dockercf.jsdelivr.fyi",
"https://docker.jsdelivr.fyi",
"https://dockertest.jsdelivr.fyi",
"https://mirror.aliyuncs.com",
"https://dockerproxy.com",
"https://mirror.baidubce.com",
"https://docker.m.daocloud.io",
"https://docker.nju.edu.cn",
"https://docker.mirrors.sjtug.sjtu.edu.cn",
"https://docker.mirrors.ustc.edu.cn",
"https://mirror.iscas.ac.cn",
"https://docker.rainbond.cc",
"https://do.nark.eu.org",
"https://docker.shootchat.top",
"https://registry.docker-cn.com"]
}
EOF
#8.重新加载系统配置文件,重启docker
systemctl daemon-reload && systemctl restart docker
#9.测试是否能拉取镜像
docker run hello-world
#10.查看镜像
docker images
二进制部署docker
上传文件
[root@docker01 ~]# ls docker-27.0.3.tgz
docker-27.0.3.tgz
#删除系统已有的runc
\rm -f /usr/local/bin/runc
tar -xf docker-27.0.3.tgz
chown -R root:root docker
mv docker/* /bin/
docker --version
[root@docker01 ~]# docker --version
Docker version 27.0.3, build 7d4bcd8
cat >/usr/lib/systemd/system/docker.service<<EOF
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
Environment=GOTRACEBACK=crash
#Environment=HTTP_PROXY=10.0.0.1:7890 HTTPS_PROXY=10.0.0.1:7890
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=1048576
LimitNPROC=1048576
LimitCORE=infinity
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now docker
mkdir -p /etc/docker
cat >/etc/docker/daemon.json<<'EOF'
{
"registry-mirrors" : ["https://do.nark.eu.org",
"https://dc.j8.work",
"https://docker.m.daocloud.io",
"https://dockerproxy.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.nju.edu.cn",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.registry.cyou",
"https://docker-cf.registry.cyou",
"https://dockercf.jsdelivr.fyi",
"https://docker.jsdelivr.fyi",
"https://dockertest.jsdelivr.fyi",
"https://mirror.aliyuncs.com",
"https://dockerproxy.com",
"https://mirror.baidubce.com",
"https://docker.m.daocloud.io",
"https://docker.nju.edu.cn",
"https://docker.mirrors.sjtug.sjtu.edu.cn",
"https://docker.mirrors.ustc.edu.cn",
"https://mirror.iscas.ac.cn",
"https://docker.rainbond.cc",
"https://do.nark.eu.org",
"https://docker.shootchat.top",
"https://registry.docker-cn.com"]
}
EOF
systemctl restart docker
#docker pull拉取镜像测试
docker pull nginx:alpine
#检查镜像
docker images
docker命令
命令补全工具
- centos/红帽系统
curl -L https://raw.githubusercontent.com/docker/docker-ce/master/components/cli/contrib/completion/bash/docker -o /etc/bash_completion.d/docker.sh
source /etc/bash_completion.d/docker.sh
[root@docker01 ~]# docker
attach diff info node rm stats version
build events inspect pause rmi stop volume
builder exec kill plugin run swarm wait
commit export load port save system
config help login ps search tag
container history logout pull secret top
context image logs push service trust
cp images manifest rename stack unpause
create import network restart start update
- ubuntu/debian
apt-get install bash-completion
curl -L https://raw.githubusercontent.com/docker/docker-ce/master/components/cli/contrib/completion/bash/docker -o /etc/bash_completion.d/docker.sh
source /etc/bash_completion.d/docker.sh
基础命令
- 查看docker版本信息
docker --version
- 查看docker系统详细信息
docker info
- 查看docker命令帮助(可指定具体命令查看详情)
docker help #查看所有帮助
docker help run #查看指定命令的用法和选项
镜像管理命令(image)
标签
| 标签类型 | 常见标签 / 格式 | 含义说明 | 示例镜像 |
|---|---|---|---|
| 版本标识标签 | 具体版本号(x.y.z)主版本号(x)LTS(长期支持版) | 标记软件具体版本 / 主版本 / 长期支持版本,生产环境首选,版本明确可控 | nginx:1.29``mysql:8``node:20-lts |
| 基础系统变体标签 | alpineslimbuster/bullseyeubuntu: 版本 | alpine:基于轻量 Alpine Linux(体积最小)slim:精简版系统(比完整版小)buster/bullseye:Debian 具体版本ubuntu:xx.xx:Ubuntu 具体版本 | nginx:alpine``python:3.12-slim``debian:buster``ubuntu:22.04 |
| 环境 / 功能标签 | latestprod/test/devonbuildwindowsservercore | latest:默认标签,通常指向最新稳定版(非绝对最新)prod/test/dev:区分生产 / 测试 / 开发环境onbuild:包含 ONBUILD 构建指令(自动执行依赖安装)windowsservercore:Windows Server 核心版基础镜像 | nginx:latest``myapp:prod``node:onbuild``microsoft/dotnet:6.0-windowsservercore |
| 架构适配标签 | amd64/arm64/arm32v7-linux/-windows | 标记镜像适配的 CPU 架构(x86_64/ARM 等)或操作系统类型 | nginx:alpine-amd64``redis:latest-arm64v8``mcr.microsoft.com/windows/nanoserver:ltsc2022 |
docker pull(拉取镜像)
从远程仓库(如Docker Hub)拉取镜像
- 不指定标签时,默认拉取
latest标签(最新版)。 - 仓库地址默认是 Docker Hub(可省略),私有仓库需指定完整地址(如
registry.example.com/nginx:v1)。
docker pull nginx:alpine # 拉取 nginx 的 alpine 轻量版本
docker pull mysql:8.0 # 拉取 mysql 8.0 版本
docker imgse prune (删除悬空镜像)
工作原理(How)
- 默认行为:仅删除悬空镜像(dangling images)—— 这类镜像的特征是
REPOSITORY和TAG均为<none>,通常是构建镜像时新旧版本更替产生的 “废弃镜像”,且未被任何容器(包括停止的容器)引用。 - 扩展行为:通过参数可扩展清理范围,比如删除所有未被运行 / 停止容器关联的镜像(无论是否有标签)。
基础清理(仅悬空镜像)
docker image prune
强制清理(无需确认)
docker image prune -f
深度清理(慎用)
删除所有未被容器引用的镜像(包括有标签但无关联容器的)
docker image prune -a
docker images(查看镜像)⭐⭐⭐
- 列出本地所有镜像
常用选项:
-a:显示所有镜像(包括中间层镜像,默认不显示)。-q:只显示镜像 ID。--format:自定义输出格式(如--format "table {{.Repository}}:{{.Tag}} {{.Size}}")。
#列出所有镜像
docker images
#显示所有(包括中间层镜像)
docker images -a
#只列出关于nginx的镜像
docker images nginx
#只显示镜像id
docker images -q
docker rmi(删除镜像)
作用:删除本地镜像。
语法:docker rmi [选项] 镜像ID/镜像名[:标签]
常用选项:
-f:强制删除(即使镜像被容器引用,也会删除)。
注意:若镜像被运行中的容器使用,需先删除容器或用 -f 强制删除。
docker image rm
#删除nginx:alpine 镜像
docker rmi nginx:alpine
#强制删除指定 ID 的镜像
docker rmi -f d4918ca78576
docker build(构建镜像)⭐⭐⭐
作用:根据 Dockerfile 构建镜像。
语法:docker build [选项] 上下文路径
常用选项:
-t 镜像名[:标签]:指定镜像名称和标签(必填,否则为<none>)。-f 路径/Dockerfile:指定 Dockerfile 路径(默认上下文路径下的Dockerfile)。--no-cache:构建时不使用缓存(强制重新执行所有步骤)。--target: 指定构建到某个阶段(而非完整构建所有阶段),常用于调试或复用中间阶段。
# 在当前目录(上下文路径)根据 Dockerfile 构建,命名为 myapp:v1
docker build -t myapp:v1 .
# 指定自定义 Dockerfile 路径(./dockerfiles/app.Dockerfile)
docker build -t myapp:v2 -f ./dockerfiles/app.Dockerfile .
docker buildx (高级构建工具)
docker buildx 是 Docker 官方提供的高级构建工具,基于 BuildKit 引擎,解决了传统 docker build 的诸多限制(如单平台构建、功能单一等),是现代 Docker 镜像构建的首选工具。
自动安装(推荐)
-
Docker Desktop(macOS/Windows):默认内置
buildx,无需额外安装; -
Linux(Docker Engine):Docker 20.10+ 版本默认包含,若缺失可手动安装:
# 下载最新版 buildx 二进制文件 mkdir -p ~/.docker/cli-plugins/ curl -SL https://github.com/docker/buildx/releases/download/v0.14.0/buildx-v0.14.0.linux-amd64 -o ~/.docker/cli-plugins/docker-buildx chmod +x ~/.docker/cli-plugins/docker-buildx
- 启用 buildx 为默认构建工具
# 将 buildx 设置为 docker build 的默认后端
docker buildx install
# 验证安装
docker buildx version
- 多平台构建前置:启用 QEMU 模拟器
构建非本机架构的镜像(如 x86 机器构建 arm64 镜像),需安装 QEMU 模拟层:
docker run --privileged --rm tonistiigi/binfmt --install all
三、核心命令与用法
- 构建器实例管理
buildx 基于「构建器实例」工作,可创建 / 切换不同的构建环境:
# 列出所有构建器实例
docker buildx ls
# 创建新的构建器(支持多节点/多平台)
docker buildx create --name mybuilder --use
# 切换到指定构建器
docker buildx use mybuilder
# 启动构建器(首次使用需启动)
docker buildx inspect --bootstrap
# 删除构建器实例
docker buildx rm mybuilder
- 基础构建命令
替代传统 docker build,核心格式:
docker buildx build [选项] <上下文路径/URL>
关键选项:
| 选项 | 说明 |
|---|---|
--platform | 指定目标平台(如 linux/amd64,linux/arm64) |
--push | 构建完成后推送到镜像仓库(多平台镜像必须用此,不能用 --load) |
--load | 将构建结果加载到本地 Docker 守护进程(仅支持单平台) |
--tag/-t | 镜像标签(如 username/imagename:tag) |
--cache-from | 从远程缓存拉取(如 type=registry,ref=username/imagename:cache) |
--cache-to | 将缓存推送到远程(如 type=registry,ref=username/imagename:cache) |
--progress | 构建日志输出格式(plain/tty/json) |
- 多平台镜像构建示例
步骤 1:登录 Docker Hub(或私有仓库)
docker login
步骤 2:构建并推送多平台镜像
# 构建 amd64 + arm64 镜像,推送到 Docker Hub
docker buildx build \
--platform linux/amd64,linux/arm64 \
--tag your-username/your-image:latest \
--push \
.
步骤 3:验证多平台镜像
# 查看镜像的平台信息
docker buildx imagetools inspect your-username/your-image:latest
- 单平台构建并加载到本地
docker buildx build \
--platform linux/amd64 \
--tag your-image:latest \
--load \
.
# 验证本地镜像
docker images your-image:latest
四、高级技巧
- 缓存优化(加速构建)
docker buildx build \
--platform linux/amd64,linux/arm64 \
--tag your-username/your-image:latest \
--cache-from type=registry,ref=your-username/your-image:cache \
--cache-to type=registry,ref=your-username/your-image:cache,mode=max \
--push \
.
- 导出镜像为 tar 包
docker buildx build \
--platform linux/amd64 \
--tag your-image:latest \
--output type=tar,dest=./your-image.tar \
.
- 自定义 BuildKit 配置
创建 buildkitd.toml 配置文件,自定义构建器参数(如镜像仓库镜像、资源限制):
docker buildx create \
--name custom-builder \
--config ./buildkitd.toml \
--use
五、注意事项
--loadvs--push:多平台镜像无法用--load加载到本地,只能用--push推送到仓库;- 权限问题:Linux 下构建器可能需要 root 权限,或配置
sudo; - 镜像仓库支持:需确保仓库支持 OCI 多平台镜像(Docker Hub、GHCR、Harbor 均支持);
- BuildKit 启用:
buildx默认使用 BuildKit,若需回退传统构建,可设置DOCKER_BUILDKIT=0。
六、常用补充命令
# 查看构建器详细信息
docker buildx inspect
# 停止构建器
docker buildx stop mybuilder
# 清理构建缓存
docker buildx prune
# 查看镜像工具信息(多平台验证)
docker buildx imagetools inspect <镜像名>
docker commit(将容器的修改提交为新镜像)
作用:将容器的修改提交为新镜像(不推荐,建议用 Dockerfile 构建,可复现性更强)。
语法:docker commit [选项] 容器ID/容器名 新镜像名[:标签]
# 将 mynginx 容器的修改提交为 mynginx:v2 镜像
docker commit mynginx mynginx:v2
docker history(查看镜像的构建历史)
作用:用于查看镜像的构建历史
语法:docker history [选项] 镜像名:标签
常用选项:
--no-trunc:显示完整的构建命令(默认会截断长命令);--quiet/-q:仅显示每一层的 ID;--human/-h:以易读的格式显示层大小(默认开启)。
docker history nginx:alpine
docker tag(标签镜像)
作用:为镜像添加标签(常用于推送镜像到仓库前重命名)。
语法:docker tag 源镜像ID/名称[:标签] 新镜像名[:新标签]
# 给本地 nginx:alpine 镜像添加标签,用于推送到私有仓库
docker tag nginx:latest nginx:test
docker tag 镜像id 新名字
[root@docker01 ~]# docker images nginx
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 60adc2e137e7 29 hours ago 152MB
nginx test 60adc2e137e7 29 hours ago 152MB
nginx 1.24 b6c621311b44 2 years ago 142MB
nginx 1.24-alpine 55ba84d7d539 2 years ago 41.1MB
docker push(推送镜像)
作用:将本地镜像推送到远程仓库(需先登录仓库)。
语法:docker push [仓库地址/]镜像名[:标签]
docker login registry.example.com # 先登录私有仓库
docker push registry.example.com/nginx:alpine # 推送镜像到私有仓库
docker save(导出镜像)
作用:将本地镜像导出为 .tar 文件(用于离线传输)。
语法:docker save -o 输出文件名.tar 镜像名[:标签]
镜像导入与导出
- 内网环境
- 服务器1-10台可以使用镜像导入导出
- 服务器多的话,自建私有镜像仓库使用
#查看已有镜像
[root@docker01 ~]# docker images
#导出镜像
docker save nginx:alpine -o nginx-apline.tar
#导出镜像并压缩
docker save nginx:alpine | gzip > /root/nginx-apline.tar.gz
[root@docker01 ~]# du -sh nginx*
52M nginx-apline.tar
21M nginx-apline.tar.gz
#将镜像传到内网服务器
#导入镜像
docker load -i nginx-apline.tar
#可以使用循环命令导入
for n in *.tar; do docker load -i "$n"; done
docker load(导入镜像)
作用:从 .tar 文件导入镜像(与 docker save 对应)。
语法:docker load -i 输入文件名.tar
# 导入 tar 文件中的镜像
docker load -i nginx-apline.tar
#可以使用循环命令导入,在镜像目录的里面
for n in *.tar; do docker load -i "$n"; done
docker search(搜索镜像)
作用:从 Docker Hub 搜索镜像。
语法:docker search [选项] 关键词
常用选项:
--filter "stars=1000":筛选星级(stars)≥1000 的镜像。--no-trunc:不截断输出结果(显示完整描述)。
注意:一般会失败,需要搭梯子
docker search --filter "stars=5000" nginx # 搜索星级≥5000 的 nginx 镜像
docker inspect(详细信息json)
作用:查看容器 / 镜像的详细元数据(JSON 格式,包括配置、网络、挂载等)。
语法:docker inspect 容器ID/容器名/镜像ID/镜像名
#查看容器的详细信息
docker inspect ngx_1.29
#查看镜像的详细信息
docker inspect nginx:latest
#配合jq使用
#取id号
docker inspect nginx:latest |jq .[].Id
#取镜像版本号,注意加上引号
docker inspect nginx:latest |jq '.[].Config.Env[2]'
#取容器的ip
docker inspect ngx_1.29 | jq .[].NetworkSettings.IPAddress
容器管理命令(Container)
容器是镜像的 “运行实例”,可读写,包含运行中的进程。
开启内核转发
[root@docker01 ~]# grep ip_forward /etc/sysctl.conf
net.ipv4.ip_forward=1
#生效
sysctl -p
docker run(创建并运行)⭐⭐⭐
作用:基于镜像创建并启动容器(最常用命令之一)。
语法:docker run [选项] 镜像名[:标签] [容器内命令]
核心选项(必知):
-i:保持标准输入(STDIN)打开,允许交互。-t:分配伪终端(TTY),与-i配合使用(-it实现交互式终端)。-d:后台运行容器(守护进程模式),返回容器 ID。--name 容器名:指定容器名称(默认随机生成),要唯一,不能冲突。-p 宿主端口:容器端口:端口映射(如-p 8080:80表示宿主 8080 映射到容器 80),宿主端口不能冲突。-v 宿主路径:容器路径[:权限]:挂载数据卷或宿主目录(如-v /data:/app共享宿主/data到容器/app)。--rm:容器停止后自动删除(适合临时任务)。--network 网络名:指定容器加入的网络(默认是bridge网络)。
# 交互式运行 nginx:alpine,启动后进入容器终端
docker run -it --name ngx_1.29 nginx:latest bash
#后台运行,映射宿主80到容器80,宿主端口不能冲突,容器停止后自动删除
docker run -d -p 80:80 --rm --name ngx_1.29 nginx:latest
#启动数据库需要密码
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123 --name db mysql:8.0-debian
浏览器访问服务器ip

docker run启动容器背后发送了什么?
- docker pull拉取镜像
- docker create创建容器
- docker start 启动容器
启动数据库失败
- 需要设置数据库密码
docker run -d -p 3306:3306 --name db mysql:8.0-debian
[root@docker01 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b809563d644d mysql:8.0-debian "docker-entrypoint.s…" 9 seconds ago Exited (1) 8 seconds ago db
[root@docker01 ~]# docker logs db
2025-11-19 11:07:59+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.33-1debian11 started.
2025-11-19 11:07:59+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2025-11-19 11:07:59+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.33-1debian11 started.
2025-11-19 11:07:59+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified
You need to specify one of the following as an environment variable:
- MYSQL_ROOT_PASSWORD
- MYSQL_ALLOW_EMPTY_PASSWORD
- MYSQL_RANDOM_ROOT_PASSWORD
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123 --name db mysql:8.0-debian
容器的重启策略
作用:用于定义容器的重启策略
语法:docker run --restart 参数
| 策略值 | 含义 |
|---|---|
no | 默认值,容器退出后不自动重启(包括 Docker 重启或主机重启)。 |
on-failure[:max-retries] | 仅当容器非 0 状态退出(运行失败)时才重启;可通过 :max-retries 指定最大重启次数(默认无限重试)。 |
always | 容器无论以何种状态退出,都始终自动重启;即使手动停止容器,Docker 重启后容器也会重新启动。 |
unless-stopped | 容器退出时始终重启,但如果是手动停止的容器,Docker 重启后不会自动启动(区别于 always)。 |
# 运行一个临时容器,退出后不重启
docker run --rm alpine echo "Hello Docker"
# 容器失败退出时重启,最多重试 5 次
docker run --restart on-failure:5 mysql:8.0
# 容器无论如何退出都重启(包括手动停止后 Docker 重启)
docker run --restart always nginx:latest
# 容器退出时重启,但手动停止后 Docker 重启不会恢复
docker run --restart unless-stopped redis:latest
- 查看容器的重启策略
#查看所有容器的重启策略
docker ps -aq |xargs docker inspect | grep -C2 always
#查看所有容器的重启策略
docker ps -aq |xargs docker inspect | jq .[].HostConfig.RestartPolicy
docker ps(列出容器)⭐⭐⭐
作用:列出容器(默认只显示运行中的容器)。
语法:docker ps [选项]
常用选项:
-a:显示所有容器(包括已停止的)。-l:只显示最近创建的容器。-q:只显示容器 ID。-s:显示容器大小。--no-trunc:显示完整信息
# 查看运行中的容器
docker ps
# 查看所有容器(包括停止的)
docker ps -a
# 只输出所有容器的 ID
docker ps -qa
docker stats(实时监控容器资源信息)
作用:实时展示运行中容器的 CPU、内存、网络 I/O、磁盘 I/O 等资源占用统计信息(类似 Linux 的 top 命令,但针对 Docker 容器)。
语法:docker stats [选项] [容器ID/容器名...]
常用选项:
--all/-a:显示所有容器(包括已停止的,默认只显示运行中的)。--no-stream:只输出一次统计结果(默认实时刷新)。--format:自定义输出格式(如table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}})。
# 实时监控所有运行中的容器
docker stats
# 只输出一次所有容器的统计结果(非实时)
docker stats -a --no-stream
# 监控指定容器(如名为 nginx_1.29 的容器)
docker stats nginx_1.29
| 字段 | 含义 |
|---|---|
CONTAINER ID | 容器 ID |
NAME | 容器名称 |
CPU % | CPU 占用百分比 |
MEM USAGE / LIMIT | 内存使用量 / 限制 |
MEM % | 内存占用百分比 |
NET I/O | 网络输入 / 输出总量 |
BLOCK I/O | 磁盘块设备输入 / 输出总量 |
docker top(查看容器内运行的进程)
作用:查看指定容器内的进程列表(类似 Linux 的 ps 命令,但针对容器内部),无需进入容器即可监控进程状态。
语法: docker top 容器ID/容器名 [ps选项]
- 可追加
ps命令的选项(如-aux、-ef),进一步筛选进程。
# 查看名为 nginx_1.29 的容器内所有进程
docker top nginx_1.29
# 用 ps -aux 格式查看容器进程(显示详细信息)
docker top nginx_1.29 -aux
#查看容器线程
docker top db -efL
docker system df(查看docker系统磁盘使用)
作用:分析 Docker 整体的磁盘占用情况,包括镜像、容器、数据卷、构建缓存等的空间使用(类似 Linux 的 df 命令,但针对 Docker 资源)。
**语法:**docker system df [选项]
常用选项:
--verbose/-v:显示详细的资源占用明细(如每个镜像 / 容器的具体大小)。
# 查看Docker系统磁盘使用概览
docker system df
# 查看详细的磁盘占用明细(包括每个镜像、容器的大小
docker system df -v
| 类型 | 总数量 | 活跃数量 | 大小 | 可回收大小 |
|---|---|---|---|---|
Images | 镜像数 | 活跃镜像数 | 镜像总大小 | 可清理镜像大小 |
Containers | 容器数 | 活跃容器数 | 容器总大小 | 可清理容器大小 |
Local Volumes | 数据卷数 | 活跃数据卷数 | 数据卷总大小 | 可清理数据卷大小 |
Build Cache | 构建缓存数 | - | 缓存总大小 | 可清理缓存大小 |
docker exec(进入容器,在运行中的容器执行命令)
作用:在运行中的容器内执行命令(常用于进入容器终端)。
语法:docker exec [选项] 容器ID/容器名 命令
核心选项:
-i:交互式输入(配合-t使用)。-t:分配伪终端(-it进入容器终端)。/bin/bash指定命令解释器或/bin/sh
#在容器内执行命令
docker exec -it ngx_1.29 hostname -I
#进入容器
docker exec -it ngx_1.29 bash
docker exec -it ngx_1.29 sh
docker start/stop/restart
作用:启动、停止、重启容器。
语法:
docker start 容器ID/容器名:启动已停止的容器。docker stop 容器ID/容器名:优雅停止容器(发送 SIGTERM 信号,等待 10s 后强制终止)。docker restart 容器ID/容器名:重启容器。
#启动db容器
docker stop db
#停止db容器
docker start db
#重启db容器
docker restart db
docker kill(强制停止)
作用:强制终止运行中的容器(发送 SIGKILL 信号,立即停止)。
语法:docker kill 容器ID/容器名
docker kill db
docker rm(删除容器)
作用:删除容器(默认只能删除已停止的容器)。
语法:docker rm [选项] 容器ID/容器名
常用选项:
-f:强制删除(即使容器正在运行)。
#删除db容器
docker rm db
#强制删除db容器
docker rm -f db
# 强制删除所有容器(慎用!)
docker rm -f $(docker ps -aq)
#选中同一种镜像的容器进行删除
docker ps -a | awk '$2~/nginx:1.24$/{print $1}' | xargs docker rm -f
docker logs(查看容器日志)
作用:查看容器日志(容器内进程的输出,如应用日志)。
语法:docker logs [选项] 容器ID/容器名
常用选项:
-f:实时跟踪日志(类似tail -f)。-t:显示日志时间戳。--tail N:只显示最后 N 行日志。--since 10m:显示最近10分钟
#显示容器给日志
docker logs ngx_1.29
#显示ngx容器日志最近5行
docker logs -n 5 ngx_1.29
#类似于tail -f
docker logs -f ngx_1.29
#表示最近10分钟的日志
docker logs --since 10m ngx_1.29
docker cp(复制文件/目录)
作用:在宿主和容器之间复制文件 / 目录。
语法:
- 宿主 → 容器:
docker cp 宿主路径 容器ID/容器名:容器路径 - 容器 → 宿主:
docker cp 容器ID/容器名:容器路径 宿主路径
# 复制宿主的 index.html 到容器的 /usr/share/nginx/html 目录
docker cp index.html ngx_1.29:/usr/share/nginx/html/
# 复制容器的nginx文件到宿主的 /root/ 目录
docker cp ngx_1.29:/etc/nginx/nginx.conf /root/
目录/. 表示目录内的所有文件
目录/ 目录 表示目录本身和目录内的文件
动态修改容器配置与资源配置
docker update 是 Docker 提供的用于动态更新一个或多个运行中容器配置的命令,无需停止并重建容器,即可调整容器的资源限制、重启策略等参数。它主要用于在线调整容器的运行配置,满足动态资源调度或策略修改的需求。
**语法:**docker update 参数 容器名
| 配置类别 | 常用参数示例 | 说明 |
|---|---|---|
| 资源限制 | --cpus, --memory, --cpuset-cpus | 调整容器的 CPU 核心数、内存上限、绑定的 CPU 核心等资源配额。 |
| 重启策略 | --restart | 修改容器的重启策略(如从 no 改为 unless-stopped)。 |
| 日志配置 | --log-opt | 更新容器的日志驱动选项(如日志大小限制)。 |
| 其他配置 | --pids-limit, --ulimit | 限制容器的进程数、调整 ulimit 资源限制(如文件句柄数)。 |
1. 调整资源限制
适用于容器运行过程中资源占用过高 / 过低,需要动态调整 CPU、内存配额的场景(如业务高峰期给容器扩容内存)。
你看到的 Memory: 0, MemorySwap: 0 表示容器最初创建时未设置任何内存和交换空间限制(0 代表无限制)。此时要为容器设置具体的内存限制(如 500m),仍需同步指定 --memory-swap,因为 Docker 需要明确内存与交换空间的关系约束。
#查看容器的当前的内存配置
docker inspect --format 'Memory: {{.HostConfig.Memory}}, MemorySwap: {{.HostConfig.MemorySwap}}' db
# 方案1:设置内存500m,交换空间500m(总限制1g)
docker update --cpus 1 --memory 500m --memory-swap 1g db
# 方案2:设置内存500m,交换空间无限制(推荐,避免后续调整内存时再次冲突)
docker update --cpus 1 --memory 500m --memory-swap -1 db
[root@docker01 ~]# docker stats --no-stream
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
681aa25b2c04 ngx 0.00% 2.699MiB / 3.816GiB 0.07% 1.01kB / 0B 0B / 0B 3
2a3f3d47847e data 0.03% 197.4MiB / 3.816GiB 5.05% 1.08kB / 0B 0B / 12.7MB 28
b377ab11b2c9 db 0.34% 401.7MiB / 500MiB 80.34% 1.26kB / 0B 115kB / 260MB 38
2. 修改重启策略
适用于需要调整容器的重启规则(如将临时容器改为持久运行容器)。
# 将容器 mysql 的重启策略改为 unless-stopped
docker update --restart unless-stopped mysql
# 批量修改多个容器的重启策略为 on-failure:3
docker update --restart on-failure:3 nginx redis mysql
3. 调整日志限制
适用于容器日志过大,需要动态设置日志轮转规则的场景。
# 限制容器 web 的日志文件大小为 100MB,最多保留 3 个日志文件
docker update --log-opt max-size=100m --log-opt max-file=3 web
4. 限制进程数
适用于防止容器内进程过多导致主机资源耗尽的场景。
# 限制容器 test 的最大进程数为 100
docker update --pids-limit 100 test
监控与排查名命令
网络管理命令(Network)
Docker 网络用于容器间通信或容器与外部网络通信,支持多种模式(bridge、host、none、overlay 等)。
查看docker网络
作用:列出所有 Docker 网络。
语法:docker network ls
docker network ls # 输出包括网络 ID、名称、驱动(driver)等
创建自定义网络
作用:创建自定义网络(推荐用自定义网络实现容器间 DNS 解析)。
语法:docker network create [选项] 网络名
常用选项:
--driver bridge:指定驱动(默认是 bridge,适合单机容器通信)。--subnet 172.20.0.0/16:指定子网(自定义 IP 段)。
# 创建名为 mynet 的自定义桥接网络
docker network create mynet
# 启动容器时加入自定义网络(容器间可通过名称通信)
docker run -d --name app1 --network mynet nginx:alpine
docker run -d --name app2 --network mynet nginx:alpine # app1 和 app2 可通过名称 ping 通
指定容器加入网络
作用:将运行中的容器加入指定网络。
语法:docker network connect 网络名 容器ID/容器名
# 将已运行的 app3 容器加入 mynet 网络
docker network connect mynet app3
指定网络移除容器
作用:将容器从指定网络中移除。
语法:docker network disconnect 网络名 容器ID/容器名
docker network disconnect mynet app3 # 将 app3 从 mynet 网络移除
删除网络
作用:删除网络(需先断开所有容器的连接)。
语法:docker network rm 网络名/网络ID
docker network rm mynet # 删除 mynet 网络
数据卷管理命令(Volume)
数据卷是 Docker 管理的持久化存储,用于容器数据持久化(容器删除后数据不丢失)。
查看数据卷
作用:列出所有数据卷。
语法:docker volume ls
# 输出数据卷名称、驱动等
docker volume ls
创建数据卷
作用:创建数据卷。
语法:docker volume create [选项] 卷名
docker volume create mydata # 创建名为 mydata 的数据卷
查看数据库详细信息
作用:查看数据卷的详细信息(如宿主存储路径)。
语法:docker volume inspect 卷名
docker volume inspect mydata # 查看 mydata 卷的存储路径(通常在 /var/lib/docker/volumes/mydata/_data)
删除数据卷
作用:删除数据卷(需先确保没有容器使用该卷)。
语法:docker volume rm 卷名
选项:-f:强制删除(不提示确认)。
docker volume prune -f # 强制删除所有未使用的数据卷
案例:容器数据目录挂载到宿主机中(容器删除数据也不丢失)
如何查看容器/镜像的数据目录?(一般指数据库镜像)
#查看镜像的数据目录
docker inspect mysql:latest | jq '.[].Config.Volumes'
#已运行容器的数据目录
docker inspect db | jq '.[].Mounts.[].Destination'
- 将容器的数据目录挂载到宿主机目录下
docker run -d -e MYSQL_ROOT_PASSWORD=123 -v /app/data/db/:/var/lib/mysql/ --name db mysql:8.0-debian
[root@docker01 ~]# docker exec -it db mysql -uroot -p123
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.33 MySQL Community Server - GPL
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> create database blog;
Query OK, 1 row affected (0.00 sec)
mysql> create database zrlog;
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| blog |
| information_schema |
| mysql |
| performance_schema |
| sys |
| zrlog |
+--------------------+
6 rows in set (0.01 sec)
#删除容器
docker ps -qa | xargs docker rm -f
#在创建
docker run -d -e MYSQL_ROOT_PASSWORD=123 -v /app/data/db/:/var/lib/mysql/ --name db mysql:8.0-debian
docker exec -it db mysql -uroot -p123
#创建的库依然存在
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| blog |
| information_schema |
| mysql |
| performance_schema |
| sys |
| zrlog |
+--------------------+
6 rows in set (0.00 sec)
- 将数据目录挂载到数据卷空间下
#创建数据卷
docker volume create mydata
#查看数据卷的挂载目录位置
docker volume inspect mydata | jq .[].Mountpoint
#将容器的数据目录挂载到数据卷下
docker run -d -e MYSQL_ROOT_PASSWORD=123 -v mydata:/var/lib/mysql/ --name data mysql:5.7-debian
docker exec -it data mysql -uroot -p123
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| hong |
| mysql |
| performance_schema |
| song |
| sys |
+--------------------+
#删除容器
docker rm -f data
#在挂载
docker run -d -e MYSQL_ROOT_PASSWORD=123 -v mydata:/var/lib/mysql/ --name data mysql:5.7-debian
docker exec -it data mysql -uroot -p123
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| hong |
| mysql |
| performance_schema |
| song |
| sys |
+--------------------+
6 rows in set (0.00 sec)
#查看数据卷目录下的数据
[root@docker01 ~]# ls /var/lib/docker/volumes/mydata/_data/
auto.cnf client-key.pem ib_logfile0 performance_schema server-key.pem
ca-key.pem hong ib_logfile1 private_key.pem song
ca.pem ib_buffer_pool ibtmp1 public_key.pem sys
client-cert.pem ibdata1 mysql server-cert.pem
jq 处理json形式的输出
安装
yum install -y jq
apt install -y jq
使用
docker inspect mysql:8.0-debian
docker inspect mysql:8.0-debian | jq
#取id
docker inspect mysql:8.0-debian | jq .[].Id
docker inspect mysql:8.0-debian | jq '.[].RootFS.Layers[0]'
docker inspect mysql:8.0-debian | jq '.[].GraphDriver.Name'
更多推荐

所有评论(0)