Docker基本命令看起来只是一堆以docker开头的指令,但真正上手后会发现,容器起不来、端口连不通、改完文件重启就丢,这些问题经常不是Docker本身不稳定,而是对命令的执行位置、参数顺序和生命周期理解有偏差。Docker CLI本质上是把用户输入转换成对Docker守护进程的API调用,所以每条命令背后都对应着镜像仓库、存储驱动、网络模式等一组动作。把这层关系搞清楚,再记命令就会顺很多。

一、先理解Docker基本命令在操作谁
Docker采用客户端-服务端架构,本地执行docker命令时,命令客户端会连接本机或远程的dockerd。很多人把docker命令当成直接操作容器的工具,其实它只是向守护进程发请求。理解这一点后再看命令输出会清晰很多,例如docker version能同时显示客户端和服务端版本,docker info能查看存储驱动、镜像数量、容器状态等。当怀疑守护进程异常时,这两条命令是最初的判断依据。
docker version docker info docker system df
其中docker system df专门用于查看镜像、容器、卷占用的磁盘空间,适合在宿主机磁盘告急时快速定位是哪一类资源膨胀。基本命令通常分为四类:镜像管理、容器生命周期、日志与调试、数据卷和网络。镜像管理围绕docker images、docker pull、docker rmi;容器生命周期围绕docker create、start、stop、restart、rm;调试则常用docker ps、logs、exec、inspect。不要只记docker run,因为run其实是create加start的组合,理解拆分过程有助于定位问题。
举一个简单场景:如果希望先创建容器、确认配置无误后再启动,可以先执行docker create,再执行docker start。大多数日常操作里docker run最方便,因为它一次完成拉取镜像、创建可写层、分配网络、启动进程这些动作。但一旦容器启动失败,拆开这些动作逐个排查反而更有效。比如镜像没拉下来、端口被占用、挂载路径不存在,它们的报错阶段和提示信息并不相同。
二、高频命令与参数该怎么用
docker run是参数最多的命令之一。最常用组合包括:-d表示后台运行,--name指定容器名字,-p映射端口,-v挂载数据卷,--restart设置重启策略。参数顺序并没有严格限制,但镜像名必须写在最后,后面跟的是容器启动后要执行的命令。有些人把命令写到镜像名后面导致解析错误,这是很常见的小问题。
docker run -d --name web \ -p 8080:80 \ -v /srv/web:/usr/share/nginx/html \ --restart unless-stopped \ nginx:latest
查看容器状态时,docker ps默认只显示正在运行的容器,加上-a才会包含已经退出的容器。这一点在排障时非常重要,因为如果容器启动后立刻退出,执行不带-a的docker ps会看不到它,容易误以为容器没有被创建。docker images则列出本地镜像,可以用--filter "dangling=true"查找悬空镜像,也就是没有名称和标签的中间镜像。清理空间时不要上来就执行docker rmi,先确认没有容器依赖该镜像。
docker ps -a --filter "status=exited"
docker images --filter "dangling=true"
docker inspect --format '{{.State.Status}}' web
日志与调试方面,docker logs适合查看容器标准输出和标准错误,docker exec用于在容器内部启动一个额外的调试进程。如果容器内部是精简镜像,bash可能并不存在,可以尝试使用/bin/sh。进入容器后如果还是找不到问题,docker port能直接显示容器的端口映射关系,避免凭记忆猜测端口。
docker logs --tail 100 -f web docker exec -it web /bin/sh docker port web
三、五个常见误区,提前避开
第一个误区是重复使用同一个容器名。如果之前执行过docker run --name web,即使容器已经退出,再次用同样的名字运行新容器会报名称冲突。原因是容器名在网络层和容器管理层具有唯一性。此时要么先执行docker rm web删除旧容器,要么直接使用docker start web恢复旧容器。很多误删容器的情况就是因为没有注意到这一点。
docker rm -f web docker run -d --name web -p 8080:80 nginx:latest
第二个误区是端口映射顺序写反。-p参数遵循“宿主端口:容器端口”的顺序,写成-p 80:8080时,访问宿主机的80端口,流量会进入容器的8080端口。如果容器内服务只监听80端口,外部自然连不上。遇到端口不通,先用docker port查看实际映射,再检查宿主机防火墙或安全组规则。不要一上来就重启容器或重启Docker服务。
docker port web ss -lntp | grep :8080
第三个误区是把docker exec和docker attach混用。attach连接到容器主进程的标准输入输出,适合查看主进程日志,但退出时可能影响容器;exec则是新开一个进程,即使执行exit也不会导致容器停止。调试时优先使用docker exec -it,尤其是需要执行多条命令、安装临时工具或查看文件内容时,它不会干扰容器主进程。
第四个误区是以为删除容器会保留数据。容器可写层的数据在docker rm后消失,只有挂载卷或宿主机目录中的数据会保留。修改容器内配置前,先想清楚是否需要持久化。第五个误区是把容器当虚拟机用,手动装软件、改配置,重启后各种异常。正确做法是写Dockerfile重新构建镜像,让环境可重复、可版本化。临时修改只能用于验证,不应作为长期运行的基础。
四、建立一套实用的排障顺序
遇到容器异常时,按固定顺序检查会更高效:先看状态,再看日志,最后查端口和挂载。如果容器创建后立刻退出,用docker ps -a确认容器是否存在,用docker logs查看报错信息。很多退出问题在日志里写得很清楚,比如配置文件错误、环境变量缺失、依赖服务没启动。不要急着重启Docker服务,那会中断所有容器的运行。
docker ps -a docker logs --tail 50 web docker inspect web
如果是端口访问不通,用docker port确认容器内端口映射是否正确,用curl在宿主机本地测试端口,再排查防火墙和安全组。这样能快速判断问题出在容器内部、宿主机网络,还是外部网络策略。如果是文件或配置丢失,确认是使用docker run -v挂载的路径还是容器可写层,路径写错是高频原因。挂载路径必须使用绝对路径,而且宿主目录需要提前存在,部分Docker版本会自动创建目录,但行为并不完全一致。
docker port web curl -I http://127.0.0.1:8080 docker diff web
最后养成几个习惯:所有容器都加--name,避免随机名字带来的管理成本;数据需要留存时显式挂载卷;测试命令尽量写进Dockerfile里固化;定期用docker system df和docker system prune处理无用资源。这些命令不复杂,但能减少大量意外。Docker基本命令并不零散,围绕镜像、容器、日志、存储四块展开,理解参数背后的原理后就不需要死记硬背。把每次容器异常当成排查练习,依次检查状态、日志、端口、挂载四个环节,很多问题会在几分钟内被定位。
Docker基本命令容器管理docker run修改时间:2026-09-22 00:16:55