开篇:Docker核心底层逻辑
Docker的本质是基于Linux内核的轻量级虚拟化技术,通过内核原生能力实现进程级别的隔离与资源管控,相比传统虚拟机,具备启动快、体积小、性能损耗低、环境一致性强的核心优势。其底层三大基石决定了所有命令的设计逻辑,理解底层才能真正用好每一条指令:
- Namespace(命名空间):实现资源隔离,为每个容器构建独立的运行环境,包括PID、网络、挂载、用户、UTS、IPC六大核心命名空间,确保容器内的进程无法感知宿主机和其他容器的存在,从根源上实现环境隔离。
- CGroup(控制组):实现资源限制,为容器分配CPU、内存、磁盘IO、网络IO等资源的使用上限,防止单个容器耗尽宿主机资源,是生产环境稳定性的核心保障。
- UnionFS(联合文件系统):实现分层存储,镜像是一堆只读层的有序叠加,容器是在镜像只读层之上新增的一个可写层,所有修改仅作用于可写层,不影响底层镜像,这也是镜像可复用、容器启动快、环境一致性的核心原因。
Docker核心底层架构如下:
Docker采用标准C/S架构,客户端通过CLI发送命令,守护进程负责接收并执行所有容器、镜像、网络、存储相关的操作,本文所有命令均基于Dockerv27.0.3编写。
一、Docker环境信息与系统命令
该类命令用于校验Docker环境状态、查看系统信息、清理系统资源,是所有操作的前置基础。
1.1 版本与环境校验
查看Docker版本,确认环境是否正常:
docker --version
执行后将输出当前安装的Docker版本,2026年最新稳定版输出示例如下:
Docker version 27.0.3, build 7d4bcd9
查看Docker客户端与服务端的详细版本信息,包括API版本、Go版本、操作系统架构等:
docker version
查看Docker系统完整信息,包括容器数量、镜像数量、存储驱动、内核版本、CPU/内存总量等核心信息,是环境排查的核心命令:
docker system info
1.2 磁盘使用与系统清理
Docker长期运行会产生大量悬空镜像、停止容器、未使用网络、构建缓存等无用资源,占用大量磁盘空间,该组命令是生产环境运维的必备工具。
查看Docker整体磁盘使用情况,包括镜像、容器、数据卷、构建缓存的占用空间:
docker system df
查看详细的磁盘使用明细,精准定位空间占用来源:
docker system df -v
清理所有无用资源,包括停止的容器、未使用的网络、悬空镜像、过期构建缓存,-a参数清理所有未被使用的镜像(不仅是悬空镜像),-f参数强制清理无需二次确认:
docker system prune -af
二、镜像生命周期全流程核心命令
镜像是容器的运行基础,是包含代码、运行时、依赖、配置、环境变量的只读模板,所有容器均基于镜像启动,该组命令覆盖镜像从拉取、构建、管理到分发的全生命周期。
镜像与容器的生命周期流转逻辑如下:
2.1 镜像拉取
从远程镜像仓库拉取镜像到本地,默认从Docker Hub官方仓库拉取,也可指定私有仓库地址。语法:docker pull [OPTIONS] NAME[:TAG|@DIGEST]核心常用参数:
-a, --all-tags:拉取指定仓库下所有标签的镜像--platform:指定镜像的操作系统与架构,适配多环境部署,如linux/amd64、linux/arm64-q, --quiet:静默拉取,仅输出镜像ID
拉取官方nginx最新稳定版alpine精简镜像(生产环境优先选择alpine镜像,体积小、攻击面低):
docker pull nginx:alpine
拉取指定版本、指定架构的镜像,确保环境一致性:
docker pull --platform linux/amd64 nginx:1.27.0-alpine
通过摘要拉取镜像,校验镜像完整性,防止镜像被篡改,生产环境推荐使用:
docker pull nginx@sha256:aad43ac6bd46b2cab91485c8f1dac6a985df690af3e431d9e04d9645fe70745
拉取私有仓库镜像,需先登录对应私有仓库:
docker pull registry.example.com/my-app:1.0.0
2.2 镜像构建
基于Dockerfile构建自定义镜像,本文采用Docker官方新一代构建工具Buildx(v27.0.3默认集成),替代旧版docker build命令,支持多平台构建、高级缓存、并行构建等企业级特性。语法:docker buildx build [OPTIONS] PATH | URL | -核心常用参数:
-t, --tag:为构建的镜像设置标签,格式为镜像名:版本号,可多次设置多个标签-f, --file:指定Dockerfile文件路径,默认使用当前目录下的Dockerfile--platform:指定构建的目标平台,支持同时构建多平台镜像,如linux/amd64,linux/arm64--load:构建完成后将镜像加载到本地Docker镜像库,多平台构建时需指定--push:构建完成后直接将镜像推送到远程仓库--no-cache:不使用构建缓存,强制重新构建镜像的每一层,确保依赖更新--build-arg:设置构建时的环境变量,可在Dockerfile中通过ARG指令引用
基础构建,为镜像打标签,Dockerfile位于当前目录:
docker buildx build -t my-app:1.0.0 .
指定Dockerfile路径,构建并加载到本地镜像库:
docker buildx build -f ./build/Dockerfile -t my-app:1.0.0 --platform linux/amd64 --load .
无缓存构建,同时设置构建参数,构建完成后推送到私有仓库:
docker buildx build -t registry.example.com/my-app:1.0.0 --build-arg APP_ENV=prod --no-cache --push .
2.3 镜像查看与管理
查看本地所有镜像列表:
docker images
仅输出本地所有镜像的ID,常用于批量操作:
docker images -q
查看镜像的详细历史构建记录,包括每一层的构建指令、大小、创建时间,可用于排查镜像体积过大问题:
docker history nginx:1.27.0-alpine
查看镜像的完整元数据,包括架构、操作系统、分层信息、环境变量、暴露端口、启动命令等,JSON格式输出:
docker inspect nginx:1.27.0-alpine
格式化输出镜像的核心信息,仅查看镜像的分层数量:
docker inspect --format '{{.RootFS.Layers | len}}' nginx:1.27.0-alpine
为本地镜像重新打标签,用于推送到不同仓库或修改版本号:
docker tag my-app:1.0.0 registry.example.com/my-app:1.0.0
2.4 镜像安全扫描
采用Docker官方原生安全工具Scout(v27.0.3默认集成),扫描镜像的CVE安全漏洞,是生产环境镜像上线前的必备步骤。 扫描本地镜像的所有CVE漏洞,按严重等级分类展示:
docker scout cves my-app:1.0.0
仅扫描高危和严重级别的漏洞,快速定位核心风险:
docker scout cves --only-severity critical,high my-app:1.0.0
生成镜像安全报告,输出到指定文件:
docker scout cves my-app:1.0.0 --output ./security-report.html
2.5 镜像导出、导入与删除
将本地镜像导出为tar压缩包,保留完整的分层、历史和元数据,用于镜像备份、离线分发:
docker save -o nginx-1.27.0-alpine.tar nginx:1.27.0-alpine
从tar包中导入镜像,恢复镜像的完整信息,可直接用于启动容器:
docker load -i nginx-1.27.0-alpine.tar
删除本地指定镜像,-f参数强制删除,即使镜像被容器引用(仅删除标签,镜像底层层保留):
docker rmi nginx:1.27.0-alpine
批量删除本地所有未被使用的镜像:
docker rmi $(docker images -q)
三、容器生命周期全流程核心命令
容器是镜像的运行实例,是一个独立的、可运行的隔离环境,包含应用程序及其所有依赖,该组命令是Docker最核心、最高频使用的命令,覆盖容器从创建、启动、运行、停止到删除的全生命周期。
3.1 容器创建与启动
3.1.1 docker run(核心高频)
创建并启动容器,是Docker最常用的命令,底层依次执行:检查本地镜像→无镜像则远程拉取→创建容器并分配namespace与cgroup→挂载镜像只读层与容器可写层→分配网络IP→启动容器执行指定命令,一步完成容器的创建与启动。语法:docker run [OPTIONS] IMAGE [COMMAND] [ARG...]核心常用参数按功能分类:
| 参数分类 | 核心参数 | 功能说明 |
| 基础运行 | --name |
为容器设置唯一名称,便于管理和访问,未设置则随机生成 |
| 基础运行 | --rm |
容器退出后自动删除容器及相关资源,适合临时测试场景 |
| 基础运行 | -d, --detach |
后台守护进程模式运行容器,生产环境必备 |
| 基础运行 | -it |
交互式终端模式,-i保持标准输入流打开,-t分配伪终端,两个参数配合使用才能进入容器交互式终端 |
| 端口映射 | -p, --publish |
端口映射,格式为宿主机端口:容器端口,将容器端口暴露到宿主机,支持TCP/UDP协议 |
| 端口映射 | -P, --publish-all |
随机映射容器Dockerfile中EXPOSE的所有端口到宿主机高位端口 |
| 环境配置 | -e, --env |
设置容器内的环境变量,可多次设置多个变量 |
| 环境配置 | --env-file |
从文件中批量加载环境变量,适合多环境配置管理 |
| 资源限制 | --cpus |
限制容器可使用的CPU核心数,如--cpus=0.5限制最多使用0.5个核心 |
| 资源限制 | --memory, -m |
限制容器可使用的内存上限,支持单位b/k/m/g,如--memory=512m |
| 资源限制 | --memory-swap |
限制容器可使用的交换分区大小,设置为-1则不限制 |
| 重启策略 | --restart |
容器重启策略,可选值no/on-failure/always/unless-stopped,生产环境推荐always |
| 数据挂载 | -v, --volume |
数据卷/绑定挂载,格式为宿主机路径/数据卷名:容器内路径:权限,权限可选ro(只读)/rw(读写) |
| 数据挂载 | --mount |
高级挂载方式,语法更清晰,功能更完善,生产环境推荐使用 |
| 网络配置 | --network |
指定容器加入的网络,默认加入bridge网络 |
| 网络配置 | --ip |
为容器指定静态IP地址,仅支持自定义网络 |
| 用户配置 | --user |
指定容器内进程运行的用户,生产环境严禁使用root用户运行 |
生产环境标准示例:后台运行nginx容器,指定名称、端口映射、自动重启策略、CPU/内存资源限制、只读挂载配置文件:
docker run -d --name nginx-prod -p 80:80 --restart=always --cpus=0.5 --memory=512m -v ./nginx.conf:/etc/nginx/nginx.conf:ro nginx:1.27.0-alpine
临时测试示例:交互式运行alpine容器,退出后自动删除容器,进入shell终端:
docker run -it --rm alpine:latest /bin/sh
带持久化与环境变量的数据库示例:运行MySQL 8.4 LTS版本容器,配置root密码、默认数据库、数据持久化、资源限制、自动重启:
docker run -d --name mysql-prod -p 3306:3306 -e MYSQL_ROOT_PASSWORD=MySecurePass123! -e MYSQL_DATABASE=app_db -v mysql-data:/var/lib/mysql --restart=always --cpus=1 --memory=1g mysql:8.4.0
3.1.2 docker create
仅创建容器,不启动容器,底层仅完成容器的namespace、cgroup、可写层创建,不启动容器内进程,适合需要提前配置容器、后续按需启动的精细化管控场景。 创建容器,配置与docker run完全一致,仅不启动容器:
docker create --name nginx-pre -p 8080:80 --restart=always nginx:1.27.0-alpine
启动已创建的容器:
docker start nginx-pre
3.2 容器状态管理
3.2.1 容器启动、停止与重启
启动已停止的容器,可同时启动多个容器:
docker start nginx-prod mysql-prod
优雅停止运行中的容器,先向容器内1号主进程发送SIGTERM信号,等待默认10秒后发送SIGKILL信号强制停止,给进程预留优雅关闭的时间,生产环境优先使用:
docker stop nginx-prod
自定义优雅停止的超时时间,单位为秒,给耗时较长的应用预留足够的关闭时间:
docker stop -t 30 mysql-prod
强制停止运行中的容器,直接向容器内1号主进程发送SIGKILL信号,立即终止进程,生产环境慎用,可能导致数据丢失或文件损坏:
docker kill nginx-prod
重启容器,相当于先执行stop再执行start,可自定义超时时间:
docker restart -t 30 nginx-prod
暂停运行中的容器,冻结容器内的所有进程,暂停期间不占用CPU资源,可通过unpause恢复:
docker pause nginx-prod
恢复被暂停的容器,继续运行容器内的所有进程:
docker unpause nginx-prod
3.2.2 容器查看与筛选
查看所有运行中的容器列表,默认仅展示运行中的容器:
docker ps
查看所有容器,包括已停止、已创建、已退出的容器:
docker ps -a
仅输出所有容器的ID,常用于批量操作,如批量停止、批量删除容器:
docker ps -aq
过滤容器列表,仅展示状态为已退出的容器:
docker ps --filter status=exited
过滤容器列表,仅展示名称包含nginx的容器:
docker ps --filter name=nginx
格式化输出容器核心信息,自定义展示列,便于快速查看关键数据:
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}\t{{.Image}}"
查看容器的详细元数据,包括IP地址、挂载信息、网络配置、环境变量、重启策略等所有配置信息,是容器问题排查的核心命令:
docker inspect nginx-prod
格式化输出容器的IP地址,快速获取容器内网IP:
docker inspect --format '{{.NetworkSettings.IPAddress}}' nginx-prod
格式化输出容器的所有挂载信息,排查数据持久化问题:
docker inspect --format '{{.Mounts}}' nginx-prod
3.3 容器进入与命令执行
3.3.1 docker exec(生产环境唯一推荐)
在运行中的容器内启动一个全新的进程,执行指定命令,是生产环境进入容器调试、执行命令的唯一推荐方式,退出终端不会影响容器的1号主进程,容器会继续正常运行。语法:docker exec [OPTIONS] CONTAINER COMMAND [ARG...]核心常用参数:
-it:交互式终端模式,进入容器shell终端必备-d, --detach:后台执行命令,不占用当前终端-e, --env:设置执行命令时的环境变量-u, --user:指定执行命令的用户
进入运行中的nginx容器,启动交互式shell终端(alpine镜像默认使用/bin/sh,无bash):
docker exec -it nginx-prod /bin/sh
进入ubuntu容器,启动bash终端:
docker exec -it ubuntu-prod /bin/bash
在容器内后台执行备份脚本,无需进入容器:
docker exec -d mysql-prod /bin/sh /backup/backup.sh
以指定用户执行命令,确保权限安全:
docker exec -it --user app nginx-prod /bin/sh
3.3.2 docker attach
直接挂载到容器的1号主进程的标准输入输出流,退出终端会直接终止容器的1号主进程,导致容器停止,仅适用于调试容器主进程的输出,生产环境严禁使用。 挂载到容器主进程终端:
docker attach nginx-prod
3.4 容器日志查看
查看容器内进程的标准输出与标准错误日志,是应用问题排查的核心命令,支持实时跟踪、历史日志筛选、日志截断等功能。语法:docker logs [OPTIONS] CONTAINER核心常用参数:
-f, --follow:实时跟踪日志输出,持续刷新新增日志-t, --timestamps:显示日志的时间戳,便于定位问题发生时间--tail N:仅输出最后N行日志,避免输出大量历史日志刷屏--since:仅输出指定时间之后的日志,支持时间戳、相对时间(如1h/1d)--until:仅输出指定时间之前的日志
实时跟踪nginx容器的日志,持续刷新新增请求日志:
docker logs -f nginx-prod
查看容器最后100行日志,同时显示时间戳,快速定位最近的问题:
docker logs -t --tail 100 nginx-prod
查看最近1小时内的容器日志,排查特定时间段的问题:
docker logs --since 1h nginx-prod
查看指定日期范围内的日志,精准定位历史问题:
docker logs --since 2026-03-01 --until 2026-03-10 nginx-prod
3.5 容器资源监控与进程查看
实时查看所有运行中容器的资源使用情况,包括CPU使用率、内存使用率、内存限制、网络IO、磁盘IO、进程数等,是生产环境容器性能监控的核心命令:
docker stats
仅查看指定容器的资源使用情况,同时关闭实时刷新,仅输出一次当前状态:
docker stats --no-stream nginx-prod mysql-prod
格式化输出资源监控数据,自定义展示列,便于对接监控系统:
docker stats --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemPerc}}\t{{.MemUsage}}"
查看容器内运行的所有进程,相当于在容器内执行top/ps命令,无需进入容器即可查看进程状态:
docker top nginx-prod
3.6 容器文件拷贝与导出
在宿主机与容器之间互相拷贝文件/目录,无需进入容器即可修改容器内的配置文件、提取容器内的日志/数据。 将宿主机当前目录的nginx.conf文件拷贝到容器内的指定路径:
docker cp ./nginx.conf nginx-prod:/etc/nginx/nginx.conf
将容器内的日志目录拷贝到宿主机的当前目录,用于日志分析与备份:
docker cp nginx-prod:/var/log/nginx ./nginx-logs
将运行中的容器文件系统导出为扁平的tar压缩包,仅保留当前文件系统状态,丢失分层、历史与元数据,仅用于基于容器制作基础镜像,不适合备份:
docker export -o nginx-prod-container.tar nginx-prod
3.7 容器删除
删除已停止的容器,可同时删除多个容器:
docker rm nginx-pre
强制删除容器,无论容器是否处于运行状态,都会直接终止容器进程并删除,生产环境慎用,可能导致数据丢失:
docker rm -f nginx-prod
批量删除所有已退出的容器,释放系统资源:
docker rm $(docker ps --filter status=exited -q)
批量强制删除所有容器,包括运行中的容器,仅适用于测试环境重置:
docker rm -f $(docker ps -aq)
四、数据卷与持久化核心命令
Docker容器的可写层生命周期与容器绑定,容器删除后可写层的数据会完全丢失,且容器可写层的读写性能远低于宿主机本地磁盘,因此生产环境必须通过数据卷实现数据持久化,确保容器删除、重建后数据不丢失。
Docker数据卷是由Docker管理的宿主机上的特殊目录,完全独立于容器的生命周期,支持多容器共享、权限管控、备份迁移,是Docker持久化的标准方案。
4.1 数据卷创建与管理
创建自定义命名数据卷,生产环境推荐使用命名数据卷,便于管理与迁移,避免匿名数据卷的混乱:
docker volume create mysql-data
查看本地所有数据卷列表,包括匿名数据卷与命名数据卷:
docker volume ls
查看数据卷的详细元数据,包括数据卷在宿主机上的挂载路径、创建时间、标签等,是数据卷问题排查的核心命令:
docker volume inspect mysql-data
删除指定数据卷,仅能删除未被任何容器引用的数据卷:
docker volume rm mysql-data
批量删除所有未被容器使用的数据卷,释放磁盘空间,-f参数强制删除无需确认:
docker volume prune -f
4.2 数据卷挂载使用
4.2.1 基础挂载(-v参数)
将命名数据卷挂载到容器内的指定路径,实现数据持久化,容器删除后数据卷内的数据完全保留,重建容器时重新挂载即可恢复数据:
docker run -d --name mysql-prod -v mysql-data:/var/lib/mysql mysql:8.4.0
设置挂载权限,将配置文件以只读模式挂载到容器内,防止容器内进程修改配置文件,提升安全性:
docker run -d --name nginx-prod -v ./nginx.conf:/etc/nginx/nginx.conf:ro nginx:1.27.0-alpine
4.2.2 高级挂载(--mount参数,生产环境推荐)
--mount参数语法更清晰,功能更完善,支持更多高级配置,生产环境优先使用,避免-v参数的语法歧义。 将命名数据卷挂载到容器内,等同于-v的基础功能,语法更明确:
docker run -d --name mysql-prod --mount type=volume,source=mysql-data,target=/var/lib/mysql mysql:8.4.0
绑定挂载宿主机目录,设置只读权限,防止容器修改宿主机文件:
docker run -d --name nginx-prod --mount type=bind,source=./nginx.conf,target=/etc/nginx/nginx.conf,readonly nginx:1.27.0-alpine
创建临时tmpfs挂载,数据仅存储在宿主机内存中,容器停止后数据自动清除,适合存储敏感临时数据:
docker run -d --name app-prod --mount type=tmpfs,target=/tmp,tmpfs-size=100m my-app:1.0.0
五、网络管理核心命令
Docker通过网络实现容器之间、容器与宿主机、容器与外部网络的通信,提供了多种网络驱动,适配不同的业务场景,核心默认网络包括:
- bridge(桥接网络):默认网络,所有未指定网络的容器都会加入该网络,同一桥接网络内的容器可互相通信,默认桥接网络不支持DNS名称解析,仅能通过IP互访
- host(主机网络):容器与宿主机共享网络命名空间,容器直接使用宿主机的IP与端口,无网络隔离,网络性能最高,适合对网络性能要求极高的场景
- none(无网络):容器没有任何网络接口,完全隔离,仅能通过本地回环接口通信,适合高安全要求的离线应用
- overlay(覆盖网络):跨主机的容器网络,用于Docker Swarm集群,实现不同宿主机上的容器之间的内网通信
生产环境推荐使用自定义桥接网络,相比默认桥接网络,支持容器间DNS名称解析(可通过容器名称互访)、更好的隔离性、更灵活的配置、更优的性能。
5.1 网络创建与管理
创建自定义桥接网络,指定网段、网关与网络名称,生产环境推荐为每个业务项目创建独立的自定义网络,实现业务隔离:
docker network create --driver bridge --subnet 172.20.0.0/16 --gateway 172.20.0.1 app-network
查看本地所有网络列表,包括默认网络与自定义网络:
docker network ls
查看网络的详细元数据,包括网段、网关、连接到该网络的所有容器及其IP地址,是网络问题排查的核心命令:
docker network inspect app-network
删除指定网络,仅能删除没有容器连接的网络:
docker network rm app-network
批量删除所有未被使用的网络,释放资源:
docker network prune -f
5.2 容器网络连接管理
启动容器时指定加入的自定义网络,同一网络内的容器可直接通过容器名称互相访问,无需端口映射:
docker run -d --name nginx-app --network app-network nginx:1.27.0-alpine
将运行中的容器连接到指定网络,一个容器可同时加入多个网络,实现网络隔离与互通:
docker network connect app-network mysql-prod
将容器从指定网络中断开,移除容器的网络接口:
docker network disconnect app-network mysql-prod
六、Docker Compose核心命令(V2最新稳定版)
Docker Compose是Docker官方的多容器应用编排工具,通过YAML文件定义应用所需的所有服务、网络、数据卷,通过一条命令完成所有服务的创建、启动、停止、销毁,是微服务、多组件应用部署的标准工具。
本文基于2026年最新稳定版Compose V2编写,该版本已完全集成到Docker CLI中,使用docker compose命令,替代已废弃的V1版本docker-compose命令,所有示例均基于最新Compose Specification规范编写。
6.1 核心前置说明
Compose的核心配置文件为compose.yaml(官方推荐文件名,兼容旧版docker-compose.yaml),以下为标准的多服务配置示例,所有后续命令均基于该配置文件:
services:
nginx:
image: nginx:1.27.0-alpine
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
networks:
- app-net
restart: always
depends_on:
- app
app:
build: ./app
environment:
- SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/app_db
- SPRING_PROFILES_ACTIVE=prod
networks:
- app-net
restart: always
depends_on:
- mysql
mysql:
image: mysql:8.4.0
environment:
- MYSQL_ROOT_PASSWORD=MySecurePass123!
- MYSQL_DATABASE=app_db
volumes:
- mysql-data:/var/lib/mysql
networks:
- app-net
restart: always
volumes:
mysql-data:
networks:
app-net:
driver: bridge
6.2 核心命令详解
校验compose.yaml文件的语法是否正确,格式化输出完整配置,提前排查配置错误,是启动服务前的必备步骤:
docker compose config
创建并启动compose文件中定义的所有服务、网络、数据卷,-d参数后台运行,--build参数启动前重新构建所有需要构建的镜像,--force-recreate参数强制重新创建所有容器,即使配置没有变化:
docker compose up -d --build
停止并删除compose文件中定义的所有容器、网络,-v参数同时删除所有定义的数据卷,--rmi all参数同时删除所有相关镜像,--remove-orphans参数删除compose文件中未定义的孤儿容器:
docker compose down -v
查看当前compose项目中所有服务的容器运行状态,包括容器名称、状态、端口映射等:
docker compose ps
查看服务的日志,-f参数实时跟踪日志,--tail N参数仅输出最后N行日志,可指定单个服务查看日志:
docker compose logs -f nginx
查看所有服务的日志,同时显示时间戳,仅输出最后200行:
docker compose logs -t --tail 200
在运行中的服务容器内执行命令,最常用于进入服务容器的交互式终端:
docker compose exec app /bin/sh
停止compose项目中的所有服务,不删除容器、网络、数据卷,可通过start命令重新启动:
docker compose stop
停止指定的单个服务:
docker compose stop nginx
启动已停止的所有服务:
docker compose start
重启所有服务,可自定义优雅停止的超时时间:
docker compose restart -t 30
查看compose项目中所有镜像的构建历史,排查镜像构建问题:
docker compose images
拉取compose文件中定义的所有服务的镜像,提前预热镜像,提升启动速度:
docker compose pull
七、镜像仓库与分发核心命令
镜像仓库用于存储和分发Docker镜像,分为公共仓库(如Docker Hub)和私有仓库(如Harbor、Docker Registry),该组命令用于仓库的登录、镜像的推送与拉取、仓库管理。
登录Docker Hub官方公共仓库,执行后输入密码即可完成登录,登录后可推送自己的镜像:
docker login -u your-docker-username
登录私有镜像仓库,需指定仓库地址,适用于企业内部私有仓库:
docker login registry.example.com -u your-username
退出已登录的镜像仓库,默认退出Docker Hub,指定地址则退出对应私有仓库:
docker logout registry.example.com
为本地镜像打标签,标签格式为仓库地址/项目名/镜像名:版本号,只有符合该格式的镜像才能推送到对应仓库:
docker tag my-app:1.0.0 registry.example.com/my-project/my-app:1.0.0
将打好标签的镜像推送到远程镜像仓库,推送前需先登录对应仓库:
docker push registry.example.com/my-project/my-app:1.0.0
同时推送镜像的所有标签:
docker push -a registry.example.com/my-project/my-app
从远程仓库搜索镜像,支持模糊搜索,可查看镜像的官方认证、星级等信息:
docker search nginx
仅搜索官方认证的镜像,过滤非官方镜像,提升安全性:
docker search --filter is-official=true nginx
八、高频易混淆命令与概念明确区分
8.1 docker run vs docker create
| 命令 | 核心功能 | 底层执行逻辑 | 适用场景 |
| docker run | 创建并启动容器 | 调用create创建容器 → 调用start启动容器内进程 | 快速启动容器,一步到位,日常开发测试最常用 |
| docker create | 仅创建容器,不启动 | 仅创建容器的namespace、cgroup、可写层,不启动进程 | 提前配置容器,后续按需启动,生产环境精细化管控 |
8.2 docker exec vs docker attach
| 命令 | 核心原理 | 退出终端的影响 | 生产环境适用性 |
| docker exec | 在运行的容器中启动一个全新的独立进程,分配新的终端 | 退出exec终端,仅终止新启动的进程,不会影响容器的1号主进程,容器继续正常运行 | 生产环境唯一推荐的容器调试方式,安全无风险 |
| docker attach | 直接挂载到容器的1号主进程的标准输入输出流 | 退出attach终端(Ctrl+C),会直接终止容器的1号主进程,导致容器停止 | 仅适用于调试容器主进程输出,生产环境严禁使用 |
8.3 docker rmi vs docker rm
| 命令 | 操作对象 | 核心功能 | 关键注意事项 |
| docker rmi | Docker镜像(Image) | 删除本地存储的镜像 | 必须先删除所有使用该镜像的容器,才能删除镜像;-f参数仅强制删除标签,底层共享层保留 |
| docker rm | Docker容器(Container) | 删除已创建的容器 | 只能删除已停止的容器,-f参数可强制删除运行中的容器,生产环境慎用,可能导致数据丢失 |
8.4 docker save vs docker export
| 命令 | 操作对象 | 输出内容 | 保留的信息 | 核心适用场景 |
| docker save | Docker镜像 | 镜像完整的分层tar包 | 保留镜像的所有分层、构建历史、标签、元数据、环境配置 | 镜像的备份、迁移、离线分发,导入后可直接用于启动容器 |
| docker export | Docker容器 | 容器文件系统的扁平tar包 | 丢失所有分层、构建历史、元数据,仅保留当前文件系统的快照 | 基于运行中的容器制作基础镜像,不适合镜像备份与迁移 |
8.5 CMD vs ENTRYPOINT(Dockerfile核心指令)
| 指令 | 核心作用 | 是否被docker run末尾的命令覆盖 | 核心适用场景 |
| CMD | 容器启动的默认命令与参数 | 会被docker run末尾的命令完全覆盖 | 为容器设置默认启动命令,允许用户在启动时灵活修改 |
| ENTRYPOINT | 容器启动的固定入口命令 | 不会被覆盖,docker run末尾的命令会被当作参数传递给ENTRYPOINT | 容器启动命令固定,仅需传递运行参数,如工具类镜像、固定入口的应用镜像 |
九、生产环境Docker命令最佳实践
- 镜像管理最佳实践
- 严禁使用
latest标签,必须使用固定的语义化版本号,确保不同环境的镜像一致性,避免版本漂移导致的线上问题 - 优先使用alpine、slim等精简基础镜像,减少镜像体积,降低攻击面,提升镜像拉取和容器启动速度
- 构建镜像时必须使用多阶段构建,仅保留运行时所需的文件,剔除构建工具、临时文件、源码,最小化镜像体积
- 镜像推送到仓库前,必须通过
docker scout cves扫描CVE安全漏洞,修复高危和严重漏洞后再上线生产环境 - 严禁使用
docker commit基于容器制作镜像,会导致镜像分层混乱、无法追溯、存在安全隐患,所有镜像必须通过Dockerfile构建
- 容器启动最佳实践
- 必须设置
--restart=always重启策略,确保宿主机重启、容器异常退出时自动恢复,提升服务可用性 - 必须设置CPU、内存资源限制,通过
--cpus和--memory参数限制容器的资源上限,防止单个容器耗尽宿主机资源,导致宿主机OOM宕机 - 严禁使用
--privileged特权模式运行容器,除非绝对必要,特权模式下容器拥有宿主机root权限,存在极大的安全风险 - 容器内进程严禁以root用户运行,必须在Dockerfile中创建普通用户,通过
--user参数指定运行用户,最小化权限 - 生产环境必须使用
-d后台模式运行容器,严禁使用-it交互式模式启动容器,避免终端关闭导致容器停止 - 仅暴露必要的端口,严禁将容器的所有端口都映射到宿主机,降低攻击面,容器间的内部通信通过自定义网络实现,无需端口映射
- 数据持久化最佳实践
- 生产环境必须使用命名数据卷实现数据持久化,严禁使用绑定挂载直接挂载宿主机目录,避免权限问题、路径依赖、安全风险
- 关键业务数据必须定期备份,通过
--volumes-from参数挂载数据卷,执行备份命令,确保数据可恢复 - 严禁将业务数据写入容器的可写层,容器删除后数据会完全丢失,且可写层的读写性能远低于数据卷,会影响应用性能
- 敏感配置文件通过只读模式挂载到容器内,防止容器内进程恶意修改配置文件,提升安全性
- 网络管理最佳实践
- 生产环境必须使用自定义桥接网络,严禁使用默认bridge网络,自定义网络支持容器间DNS名称解析,具备更好的隔离性和性能
- 为不同的业务项目创建独立的自定义网络,实现业务之间的网络隔离,避免跨业务的容器互访
- 容器之间的通信优先使用容器名称,而非IP地址,容器重启后IP可能发生变化,容器名称固定不变,确保服务调用的稳定性
- 对外提供服务的容器,仅映射必要的端口到宿主机,且通过防火墙限制访问来源,避免端口暴露到公网
- 运维安全最佳实践
- 必须配置容器日志轮转,通过
--log-driver和--log-opt参数配置日志驱动和轮转策略,防止日志文件占满宿主机磁盘空间 - 定期执行
docker system prune清理无用资源,释放磁盘空间,避免磁盘占满导致的线上故障 - 定期更新Docker Engine到最新稳定版,修复安全漏洞,提升稳定性和性能
- 严格管控Docker守护进程的访问权限,仅授权给必要的用户,严禁非授权用户访问Docker API
- 容器命名必须规范,采用
业务线-服务名-环境的命名格式,便于运维管理和问题排查
结尾:Docker高频命令速查表
| 命令分类 | 高频核心命令 | 核心功能 |
| 环境信息 | docker --version |
查看Docker版本 |
| 环境信息 | docker system info |
查看Docker系统信息 |
| 环境信息 | docker system df |
查看Docker磁盘使用情况 |
| 环境信息 | docker system prune -af |
清理所有无用资源 |
| 镜像管理 | docker pull 镜像名:版本 |
拉取镜像 |
| 镜像管理 | docker buildx build -t 镜像名:版本 . |
构建镜像 |
| 镜像管理 | docker images |
查看本地镜像列表 |
| 镜像管理 | docker rmi 镜像名:版本 |
删除镜像 |
| 镜像管理 | docker save -o 文件名.tar 镜像名:版本 |
导出镜像 |
| 镜像管理 | docker load -i 文件名.tar |
导入镜像 |
| 镜像安全 | docker scout cves 镜像名:版本 |
扫描镜像安全漏洞 |
| 容器管理 | docker run -d --name 容器名 -p 宿主机端口:容器端口 镜像名:版本 |
创建并启动容器 |
| 容器管理 | docker ps -a |
查看所有容器 |
| 容器管理 | docker start/stop/restart 容器名 |
启动/停止/重启容器 |
| 容器管理 | docker exec -it 容器名 /bin/sh |
进入容器终端 |
| 容器管理 | docker logs -f 容器名 |
实时查看容器日志 |
| 容器管理 | docker stats |
实时查看容器资源使用情况 |
| 容器管理 | docker inspect 容器名 |
查看容器详细信息 |
| 容器管理 | docker rm 容器名 |
删除容器 |
| 数据卷管理 | docker volume create 数据卷名 |
创建数据卷 |
| 数据卷管理 | docker volume ls |
查看数据卷列表 |
| 数据卷管理 | docker volume prune -f |
清理未使用的数据卷 |
| 网络管理 | docker network create 网络名 |
创建自定义网络 |
| 网络管理 | docker network ls |
查看网络列表 |
| 网络管理 | docker network inspect 网络名 |
查看网络详细信息 |
| 编排管理 | docker compose up -d --build |
启动Compose服务 |
| 编排管理 | docker compose down -v |
停止并删除Compose服务 |
| 编排管理 | docker compose logs -f 服务名 |
查看Compose服务日志 |
| 仓库管理 | docker login 仓库地址 |
登录镜像仓库 |
| 仓库管理 | docker push 镜像名:版本 |
推送镜像到仓库 |