1. 项目概述为什么我们需要一份“带图”的Docker命令指南如果你刚开始接触Docker面对终端里那一串串命令是不是感觉像在看天书docker run后面那一长串参数到底什么意思docker ps -a和docker ps有什么区别镜像、容器、仓库这些概念搅在一起让人头大。网上的教程要么太零散要么太理论看完了还是不敢动手。这正是我当初的困惑也是我决定整理这份“带图示”的常用命令清单的初衷。这份指南的核心价值在于可视化和场景化。我不打算仅仅罗列35条命令而是要把每一条命令背后的容器状态、数据流向、网络关系用最直观的图示画出来。让你一眼就能看懂“执行这个命令时Docker引擎在后台做了什么”。比如当你输入docker run -d -p 8080:80 nginx我会画图告诉你Docker从哪拉取镜像如何在宿主机上创建一个隔离的容器进程又是如何将宿主机的8080端口“映射”到容器内的80端口。这种理解远比死记硬背命令参数要深刻得多。它适合所有层次的开发者新手可以把它当作入门地图按图索骥安全操作有一定经验的用户可以用来查漏补缺深化理解特别是那些容易混淆的命令组合团队技术负责人则可以将其作为内部培训的参考资料统一团队对Docker基础操作的认知。接下来我们就从最核心的“镜像、容器、数据、网络”这四大维度拆解这些命令并配上我精心绘制的示意图。2. 核心概念与命令全景图在深入具体命令之前我们必须先建立清晰的Docker核心概念模型。你可以把Docker想象成一个高度自动化的物流仓库系统。镜像就是货物的标准包装箱蓝图。它是一个只读的模板里面包含了运行某个软件所需的所有依赖、代码、环境配置。比如nginx:latest这个镜像就是一份已经配置好Nginx Web服务器的“标准箱”设计图。镜像本身是静止的存储在镜像仓库中。容器是根据蓝图创建并运行起来的实际箱子。当你基于一个镜像启动容器时Docker会从这张只读的蓝图中创建一个可写的“容器层”然后运行里面指定的应用程序。容器是动态的、有生命周期的创建、运行、停止、删除。多个容器可以基于同一个镜像创建彼此隔离。仓库是存放所有蓝图的仓库。Docker Registry就是这样的仓库最著名的公共仓库是Docker Hub。你可以从中拉取pull公共蓝图也可以将自己打包好的蓝图推送push上去。理解了这些我们来看命令的全景图。Docker命令主要围绕对镜像和容器的生命周期管理展开辅以对数据、网络等资源的配置。其核心逻辑链如下镜像获取 - 容器创建与运行 - 容器状态管理 - 数据与网络配置 - 容器与镜像清理下面的示意图概括了这个核心流程及对应的关键命令让你对Docker的操作体系有一个全局视野 示意图描述一张流程图中心是“用户与Docker守护进程”。左侧是“镜像流”从“Docker Hub/私有仓库”通过pull箭头指向“本地镜像列表”再通过run箭头指向“运行的容器”。右侧是“容器生命周期”是一个循环create-start- (pause/unpause) -stop-rm。下方是“数据管理”有volume create、cp等命令指向容器。上方是“信息查看”有ps、images、logs、inspect等命令像探照灯一样照向容器和镜像。整个图清晰地展示了命令之间的关联。有了这个全景图我们就不会在具体的命令中迷失方向。接下来我们进入实战环节我会为每个重要命令配上状态变化图。3. 镜像管理获取与构建你的“蓝图”镜像是一切的基础。管理镜像就是管理你的软件交付物。3.1 搜索与拉取镜像在你从仓库拉取蓝图之前可能需要先看看有哪些可用的蓝图。docker search [关键词]这个命令用于从Docker Hub等注册表搜索公开的镜像。例如docker search nginx会列出所有包含“nginx”的镜像并显示星级、是否官方等信息。注意搜索结果中的OFFICIAL标记很重要通常建议优先选择官方镜像它们在安全性和维护上更有保障。docker pull [镜像名:标签]这是最常用的命令之一用于将镜像从远程仓库下载到本地。如果不指定标签默认拉取latest标签。命令示例docker pull ubuntu:20.04操作解析Docker客户端会联系配置的镜像仓库默认为Docker Hub找到名为ubuntu、标签为20.04的镜像清单然后分层下载镜像的各个只读层到本地存储目录。图示说明 示意图描述左侧是“Docker Hub远程仓库”里面有一个标有ubuntu:20.04的叠层方块表示分层镜像。一个标有pull的箭头指向右侧的“本地Docker镜像存储”。右边是本地存储箭头落下后同样堆叠的ubuntu:20.04镜像层被创建出来。3.2 查看与清理本地镜像本地镜像多了需要查看和管理。docker images或docker image ls列出本地所有镜像。显示信息包括仓库名、标签、镜像ID、创建时间和大小。常用参数-a显示所有镜像包括中间层镜像通常无标签。-q只显示镜像ID常用于批量操作如docker rmi $(docker images -q)。--digests显示镜像的摘要信息SHA256哈希值用于唯一性验证。docker rmi [镜像ID或镜像名]删除本地的一个或多个镜像。如果镜像有多个标签需要先删除所有标签才能删除镜像层本身。命令示例docker rmi myapp:v1 old-ubuntu操作解析Docker会检查要删除的镜像是否被容器即使已停止所使用。如果存在依赖的容器删除会失败提示你需要先删除容器。这是Docker的一种保护机制。图示说明 示意图描述左边是“本地镜像存储”有两个镜像一个标有myapp:v1一个标有old-ubuntu。一个红色的rmi箭头穿过它们。右边是“操作结果”myapp:v1和old-ubuntu的图标被打上红叉表示已被删除而其他镜像如nginx:latest保持不变。3.3 构建与标记镜像从无到有创建自己的“蓝图”。docker build [选项] 上下文路径这是Docker的核心命令之一用于根据Dockerfile构建镜像。-t选项用于为构建出的镜像打标签。命令示例docker build -t my-webapp:1.0 .关键解析命令末尾的.指的是“构建上下文”路径。Docker客户端会将这个目录下的所有文件通常通过.dockerignore过滤打包发送给Docker守护进程然后守护进程根据该目录下的Dockerfile指令逐步执行构建。切记不要将/或根目录作为上下文否则会发送大量无用文件极慢且可能失败。实操心得在Dockerfile同目录执行构建是最常见的做法。使用-f参数可以指定不同位置的Dockerfile如docker build -f ./docker/Dockerfile.prod -t myapp:prod .。docker tag [源镜像] [目标镜像]为本地镜像创建一个新的标签引用。这常用于在推送到私有仓库前将镜像重命名为符合仓库规范的名称。命令示例docker tag my-webapp:1.0 myregistry.com/project/my-webapp:1.0操作解析这个操作并不复制镜像数据只是创建了一个指向同一镜像层的新标签类似于给文件创建一个快捷方式。执行docker images你会看到两个标签但镜像ID相同。4. 容器生命周期从创建到销毁的完整旅程容器是镜像的运行实例管理容器是日常工作的核心。4.1 创建与启动容器这是让“蓝图”变成“运行中箱子”的关键步骤。docker run [选项] 镜像 [命令] [参数]这是最复杂也最强大的命令。它集pull如果本地不存在、create、start于一体。核心选项解析-d后台运行detached mode。容器会在后台启动终端返回容器ID。-it这是-i保持标准输入打开和-t分配一个伪终端的组合通常一起使用用于启动一个可交互的容器比如进入容器的Shell。docker run -it ubuntu bash--name为容器指定一个自定义名称而不是使用随机生成的ID。便于后续管理。-p端口映射格式为-p [宿主机端口]:[容器端口]。这是连接容器内外网络的关键。-p 8080:80意味着将宿主机的8080端口流量转发到容器的80端口。-v挂载数据卷格式为-v [宿主机目录]:[容器目录]。用于持久化容器内数据或共享配置文件。-e设置环境变量格式为-e KEYVALUE。常用于向容器传递配置。--rm容器停止后自动删除。非常适合运行一次性任务或测试。命令示例docker run -d --name my-nginx -p 80:80 -v /my/nginx.conf:/etc/nginx/nginx.conf:ro nginx操作解析Docker检查本地是否有nginx:latest镜像没有则先拉取。然后创建一个名为my-nginx的容器将宿主机的80端口映射到容器的80端口并将宿主机的/my/nginx.conf文件以只读(ro)方式挂载到容器的/etc/nginx/nginx.conf。最后以后台模式启动容器。图示说明 示意图描述图分为上下两部分。上半部分是“宿主机系统”标有“80端口”和“/my/nginx.conf文件”。下半部分是“容器内部”标有“80端口”和“/etc/nginx/nginx.conf”。中间是容器边界。有两个箭头一个双向箭头连接宿主机80端口和容器80端口上面标着-p 80:80另一个单向箭头带锁图标表示只读从宿主机文件指向容器内文件上面标着-v ...:ro。容器内部运行着Nginx进程。4.2 查看容器状态与信息掌握容器的实时动态。docker ps [选项]列出容器。这是使用频率最高的命令之一。常用选项不加选项默认只显示正在运行的容器。-a显示所有容器包括已停止的。-q只显示容器ID。-l显示最近创建的容器。-f根据条件过滤如docker ps -f statusexited显示已退出的容器。输出解读CONTAINER ID短ID、IMAGE、COMMAND、CREATED、STATUSUp 2 hours/Exited (0) 5 minutes ago、PORTS、NAMES。docker logs [容器名/ID]获取容器的日志输出。这对于调试应用问题至关重要。常用选项-f实时跟踪follow日志输出类似于tail -f。--tail N仅显示最后N行日志如docker logs --tail 100 myapp。-t显示时间戳。实操心得对于复杂的微服务应用建议在启动容器时使用-e或--log-driver配置更结构化的日志驱动如json-file并配合docker logs --details查看更丰富的信息。docker inspect [容器名/ID]以JSON格式返回容器或镜像的底层详细信息。这是一个“瑞士军刀”命令可以查看容器的所有配置网络设置、挂载卷、IP地址、环境变量等。命令示例docker inspect my-nginx | grep IPAddress快速获取容器IP高级用法结合--format使用Go模板语法来提取特定信息例如docker inspect --format{{.NetworkSettings.IPAddress}} my-nginx docker inspect --format{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}} my-nginx4.3 控制容器运行状态对运行中的容器进行干预。docker start/stop/restart [容器名/ID]start启动一个已停止的容器。容器会保留之前的所有配置和文件更改。stop优雅地停止一个运行中的容器。Docker会先发送SIGTERM信号允许应用进行清理超时后再发送SIGKILL强制终止。restart重启容器相当于stop后start。docker pause/unpause [容器名/ID]pause暂停容器内所有进程。使用cgroups freezer功能进程被“冻住”不占用CPU但内存状态保留。常用于故障排查或临时节省资源。unpause恢复被暂停的容器。图示说明 示意图描述一个容器图标内部有活动的齿轮表示进程在运行。一个“pause”按钮按下后齿轮被一个冰晶图标冻住进程停止。按下“unpause”后冰晶消失齿轮恢复转动。docker exec [选项] 容器 命令在正在运行的容器中执行额外命令。这是与容器交互、进行调试的神器。命令示例docker exec -it my-nginx bash以交互模式进入容器的bash shell。docker exec my-nginx cat /etc/hosts在容器内执行一条简单命令并返回结果。与docker run -it的区别run是创建新容器并执行命令通常是启动进程而exec是在已存在的运行中容器内执行额外命令。4.4 删除与清理容器释放资源。docker rm [选项] 容器删除一个或多个已停止的容器。常用选项-f强制删除正在运行的容器先发送SIGKILL停止它。-v删除容器时同时删除与之关联的匿名数据卷由-v /container/path这种不带宿主机路径的格式创建。这是一个好习惯可以避免产生孤儿卷。批量清理# 删除所有已停止的容器 docker container prune # 或者使用组合命令 docker rm $(docker ps -aq)重要提示使用docker rm $(docker ps -aq)前请务必确认docker ps -a列出的容器都是你确定要删除的此操作不可逆。生产环境慎用。5. 数据与网络管理连接与持久化的艺术容器默认是易失的数据和网络需要专门配置才能满足实际需求。5.1 数据卷管理持久化你的数据数据卷是独立于容器生命周期的数据存储方式。docker volume create [卷名]创建一个命名的数据卷。这是管理持久化数据的推荐方式。命令示例docker volume create mydata操作解析Docker会在宿主机的特定目录Linux下通常是/var/lib/docker/volumes/下创建一个以卷名命名的目录。这个卷可以被一个或多个容器挂载。docker run -v的两种用法绑定挂载-v /宿主机/绝对路径:/容器路径。直接将宿主机的目录或文件挂载进容器。灵活性高但依赖宿主机路径。命名卷挂载-v 卷名:/容器路径。使用docker volume create创建的卷。由Docker管理与宿主机路径解耦是更纯净的持久化方式。命令示例# 绑定挂载 docker run -v /home/user/app/config:/app/config myapp # 命名卷挂载 docker run -v mydata:/var/lib/mysql mysqldocker cp [宿主机路径] 容器:容器路径与docker cp 容器:容器路径 [宿主机路径]在宿主机和容器之间复制文件/目录。这是一个临时性的数据交换手段不适合作为持久化方案。命令示例# 从容器复制到宿主机 docker cp my-nginx:/etc/nginx/nginx.conf ./nginx.conf.backup # 从宿主机复制到容器 docker cp ./custom.html my-nginx:/usr/share/nginx/html/5.2 网络管理让容器彼此通信Docker提供了多种网络模式理解它们对部署多容器应用至关重要。docker network ls列出Docker引擎管理的所有网络。默认会看到bridge默认、host、none三个网络。docker network create [网络名]创建一个自定义的桥接网络。相比于默认的bridge自定义网络提供了更好的容器发现通过容器名互访和隔离性。命令示例docker network create my-app-net高级选项可以指定子网、网关等如docker network create --subnet172.20.0.0/16 --gateway172.20.0.1 my-net。docker run --network在启动容器时指定其加入的网络。命令示例# 将容器连接到自定义网络 docker run -d --name web --network my-app-net nginx docker run -d --name app --network my-app-net myapp-image操作解析这样在app容器中你可以直接通过ping web或http://web来访问web容器因为Docker内置的DNS解析器会将容器名解析为它在my-app-net网络中的IP。这是Docker Compose和Swarm服务发现的基础。图示说明 示意图描述图中有两个并排的容器一个标着web一个标着app。它们被一个云状的图形包围上面标着“my-app-net”网络。两个容器之间有一条双向箭头上面写着“通过容器名直接通信如 ping web”。云状网络外部是“默认bridge网络”上面有一个孤立的容器表示不在此自定义网络中的容器无法通过容器名直接访问它们。6. 系统信息与维护命令了解Docker引擎本身的状态并进行维护。docker version显示Docker客户端和服务器守护进程的版本信息。用于检查安装是否成功及版本号。docker info显示详细的Docker系统信息包括容器和镜像数量、存储驱动、内核版本、CPU/内存总量、注册表镜像地址等。这是诊断Docker环境问题的第一手资料。docker system df类似于Linux的df命令显示Docker磁盘使用情况。可以清晰看到镜像、容器、数据卷和构建缓存各占用了多少空间非常直观。docker system prune [选项]一键清理“垃圾”回收磁盘空间。这是一个危险但常用的命令。命令详解docker system prune默认删除所有已停止的容器、未被任何容器使用的网络、所有悬空镜像未被任何标签引用的镜像、以及构建缓存。-a额外删除所有未被容器使用的镜像而不仅仅是悬空镜像。--volumes危险额外删除所有未被容器使用的数据卷。使用建议定期执行docker system prune是保持开发环境整洁的好习惯。但在执行-a和--volumes前务必三思确认没有重要数据。生产环境应有更规范的生命周期管理而非依赖此命令。7. 35条常用命令速查与分类表为了方便查阅我将35条最常用的Docker命令分类整理如下。这张表可以作为你的桌面速查指南。类别命令描述常用选项/示例镜像管理docker pull拉取镜像docker pull nginx:alpinedocker images列出本地镜像docker images -adocker rmi删除镜像docker rmi old-imagedocker build构建镜像docker build -t myapp .docker tag标记镜像docker tag myapp myrepo/myapp:v1docker search搜索镜像docker search mysql容器生命周期docker run创建并运行容器docker run -d -p 80:80 --name web nginxdocker create只创建不启动容器docker create --name temp ubuntudocker start启动容器docker start webdocker stop停止容器docker stop webdocker restart重启容器docker restart webdocker pause暂停容器docker pause webdocker unpause恢复容器docker unpause webdocker kill强制停止容器docker kill webdocker rm删除容器docker rm -f web容器交互与信息docker ps列出容器docker ps -adocker logs查看容器日志docker logs -f --tail 50 webdocker exec在运行中容器执行命令docker exec -it web bashdocker attach附加到运行中容器docker attach web(慎用)docker inspect查看容器/镜像详情docker inspect webdocker top查看容器内进程docker top webdocker stats实时查看容器资源统计docker statsdocker diff查看容器文件系统变化docker diff webdocker port查看容器端口映射docker port webdocker rename重命名容器docker rename old newdocker update更新容器配置如资源限制docker update --memory 512M web数据管理docker volume create创建数据卷docker volume create dbdatadocker volume ls列出数据卷docker volume lsdocker volume inspect查看数据卷详情docker volume inspect dbdatadocker volume rm删除数据卷docker volume rm dbdatadocker volume prune清理未使用的数据卷docker volume prunedocker cp宿主机与容器间复制文件docker cp file.txt web:/app/网络管理docker network ls列出网络docker network lsdocker network create创建网络docker network create mynetdocker network connect将容器连接到网络docker network connect mynet webdocker network disconnect断开容器与网络的连接docker network disconnect mynet webdocker network inspect查看网络详情docker network inspect bridgedocker network rm删除网络docker network rm mynetdocker network prune清理未使用的网络docker network prune系统与维护docker version显示版本信息docker versiondocker info显示系统信息docker infodocker system df查看磁盘使用docker system dfdocker system prune清理无用资源docker system prune -adocker login/logout登录/登出镜像仓库docker login myregistry.comdocker push推送镜像到仓库docker push myrepo/myapp:v1docker events获取Docker守护进程实时事件docker events --filter typecontainerdocker wait阻塞直到容器停止输出退出码docker wait webdocker export将容器文件系统导出为tar包docker export web web.tardocker import从tar包导入内容创建镜像docker import web.tar myimage:olddocker save将镜像保存为tar归档文件docker save -o nginx.tar nginxdocker load从tar归档文件加载镜像docker load -i nginx.tardocker history查看镜像构建历史docker history nginx8. 常见问题排查与实战技巧实录理论懂了命令也记了但实际操作中总会遇到各种“坑”。这里分享几个我踩过并总结出来的高频问题与解决技巧。8.1 容器启动失败端口已被占用问题现象执行docker run -p 80:80 nginx时报错Error response from daemon: driver failed programming external connectivity on endpoint...: Bind for 0.0.0.0:80 failed: port is already allocated。排查思路确认占用者在宿主机上使用netstat -tulpn | grep :80或ss -tulpn | grep :80命令查看是哪个进程占用了80端口。常见原因宿主机本身运行了Nginx/Apache等Web服务。之前启动的另一个Docker容器已经映射了宿主机的80端口。解决方案停止冲突服务如果宿主机服务不需要可以停止它如sudo systemctl stop nginx。修改映射端口将宿主机端口改为其他未被占用的端口如-p 8080:80。查找并停止冲突容器使用docker ps -a查找可能映射了80端口的旧容器用docker stop和docker rm清理它。实操心得养成先检查端口再运行容器的习惯。对于生产环境最好使用非特权端口1024进行映射如8080、8443等避免与系统服务冲突。8.2 容器内应用无法访问外部网络或宿主机服务问题现象在容器内ping www.baidu.com失败或者容器内应用无法连接宿主机上运行的数据库如localhost:3306。排查思路检查容器网络docker exec -it [容器名] bash进入容器检查cat /etc/resolv.conf看DNS配置ping 8.8.8.8检查基础网络连通性。理解“localhost”在容器内部localhost或127.0.0.1指的是容器自己而不是宿主机。这是最常见的误解。连接宿主机服务在Linux宿主机上可以使用宿主机的Docker网桥IP通常是172.17.0.1或宿主机的真实局域网IP。在Docker Desktop for Mac/Windows上可以使用特殊主机名host.docker.internal来指向宿主机。解决方案示例 假设宿主机MySQL运行在3306端口容器内应用需要连接它。错误配置jdbc:mysql://localhost:3306/db这只会连接到容器内部的3306端口正确配置Linuxjdbc:mysql://172.17.0.1:3306/db正确配置Docker Desktopjdbc:mysql://host.docker.internal:3306/db8.3 数据卷权限问题Permission Denied问题现象使用-v挂载宿主机目录到容器后容器内应用报错无法写入该目录提示Permission Denied。原因分析容器内进程通常以非root用户如nginx用户UID可能是101运行。如果挂载的宿主机目录权限过于严格例如属主是宿主机上的某个特定用户且没有其他用户写权限容器内进程就会因UID不同而无法写入。解决方案放宽宿主机目录权限简单安全性低在宿主机上执行chmod 777 /host/data。不推荐用于生产环境。调整宿主机目录属主推荐找出容器内应用运行的用户UID可以在Dockerfile中用RUN id查看或进入运行中的容器查看。假设容器内用户UID是101nginx用户常见UID则在宿主机上执行sudo chown -R 101:101 /host/data。这样容器内UID为101的用户就拥有了该目录的权限。在Dockerfile中主动管理用户最佳实践在构建镜像时明确创建具有特定UID的用户和组并确保需要写入的目录权限正确。这样只要宿主机目录的权限匹配这个UID就不会有问题。使用命名数据卷Docker管理的命名卷会自动处理好权限问题这是最省心的方式。对于需要与宿主机交互的配置文件可以考虑使用绑定挂载但保持文件为只读:ro运行时配置通过环境变量传入。8.4 Docker Desktop启动失败虚拟化支持未检测到问题现象在Windows或macOS上启动Docker Desktop时提示“Docker Desktop failed to start because virtualization support wasnt detected”或类似错误。排查与解决步骤确认BIOS/UEFI设置重启电脑进入BIOS/UEFI设置确保Intel VT-xIntel CPU或AMD-VAMD CPU的虚拟化技术已启用。不同主板设置位置不同通常在“Advanced” - “CPU Configuration”或“Security” - “Virtualization”下。Windows 特定检查Hyper-V 和 Windows 虚拟机监控程序平台在“启用或关闭Windows功能”中确保Hyper-V和Windows 虚拟机监控程序平台已被勾选并启用。启用后需要重启。WSL 2确保已安装并启用WSL 2。在PowerShell管理员中运行wsl --set-default-version 2。其他虚拟化软件冲突关闭或卸载可能与Hyper-V冲突的第三方虚拟化软件如 VMware Workstation、VirtualBox 的旧版本。某些游戏反作弊软件或安全软件也可能干扰。macOS 特定检查确保系统版本满足Docker Desktop要求通常是较新的macOS版本。对于Apple Silicon (M1/M2) Mac确保下载的是Apple Chip版本的Docker Desktop。最终手段完全卸载Docker Desktop包括清理数据重启电脑然后重新安装最新稳定版。查阅Docker官方文档对应操作系统的故障排除指南。掌握这些命令和技巧你就能从容应对大多数Docker日常操作。记住最好的学习方式就是动手实践。从一个简单的docker run hello-world开始逐步尝试构建自己的镜像组合多个容器你会在实践中不断加深理解。