DK-02 常用命令
02 · 常用命令(Common Commands)
📅 预计 60 分钟 | ⭐ = 重要知识点 | 📌 中英术语见文末
🛠 本讲命令基于 Docker 引擎,均可直接运行
2.0 先给直觉:遥控器上的按钮
上一讲认识了容器和镜像这对"货物"和"模板",这一讲给遥控器配齐按钮:怎么把镜像拿回来(pull)、怎么开箱(run)、怎么开关(start/stop)、怎么进去检修(exec)、怎么打扫卫生(prune)。
命令再多,本质就两件事:管镜像 和 管容器。按这个主线记,就不会乱。
💡 记忆口诀:镜像用
docker image ...,容器用docker container ...;不带子命令的docker images/docker ps是它们的简写。
2.1 镜像管理:把"模板"拿回来
拉取与查看 ⭐
docker pull nginx:1.25 # 从镜像仓库拉取 nginx 1.25 版本
docker images # 列出本机所有镜像
docker pull 会显示一层层下载进度——这正是第 1 讲说的"分层拉取":公共层已存在时秒过,只下载缺失层。实际输出大概长这样:
$ docker pull nginx:1.25
1.25: Pulling from library/nginx
...
Digest: sha256:0d4e23accc7d...
Status: Downloaded newer image for nginx:1.25
docker.io/library/nginx:1.25
结尾的 docker.io/library/nginx:1.25 是镜像的完整名字:docker.io(仓库地址)、library(组织)、nginx(仓库名)、1.25(标签)。平时用简写 nginx:1.25,Docker 会自动补全默认地址。
docker images 输出类似:
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx 1.25 a6bd71f48f68 2 weeks ago 187MB
hello-world latest d2c94e258dcb 4 months ago 13.3kB
- REPOSITORY:镜像所属仓库名。
- TAG:版本标签,
latest是默认标签,不要在生产用它精确指定版本。 - IMAGE ID:镜像唯一标识,取前若干位即可指代,如
docker rmi a6bd71f48f68。
删除与打标签
docker rmi nginx:1.25 # 删除指定镜像(有容器在用会失败)
docker tag nginx:1.25 mynginx:v1 # 给镜像加个别名标签,不复制、只引用
docker tag 很有意思:它不改动镜像内容,只是给同一个镜像 ID 多起一个名字。上传私有仓库、指定版本部署时常用。
查看镜像细节
docker history nginx:1.25 # 查看镜像的分层历史(每个 RUN/COPY 一层)
docker image inspect nginx:1.25 # 查看镜像的详细元数据(JSON 格式)
⚠️ 常见错误
rmi与rm混淆:docker rmi删镜像,docker rm删容器,字母只差一个 i。- 镜像被容器占用删不掉:先
docker rm 容器或删掉该容器,再docker rmi。 - 滥用
latest:latest会变,今天拉和三个月后拉可能不是同一个版本,交付时要锁定具体版本号。
2.2 容器生命周期:开箱、使用、关箱
创建并运行 ⭐
docker run -d -p 8080:80 --name web nginx:1.25
参数拆解(高频,务必记牢):
-d:后台运行(detach),终端不被占住。-p 8080:80:端口映射,宿主机 8080 → 容器 80(详见第 3 讲)。--name web:给容器起名,后续用名字操作比用 ID 方便。nginx:1.25:镜像名 + 标签。
docker run 会先检查本地镜像,没有则自动 pull,然后创建并启动容器。运行一次 = 新建一个容器,哪怕镜像相同。
其他常用参数:
docker run -it --rm ubuntu bash # -it 交互式终端;--rm 退出后自动删除容器
docker run -d --restart=always nginx # 崩溃/重启后自动拉起
查看容器状态 ⭐
docker ps # 只看运行中的容器
docker ps -a # 看所有容器(含已停止的),-a 是 all
docker ps 输出的关键列:
- CONTAINER ID:容器 ID,前几位即可指代。
- STATUS:如
Up 5 minutes、Exited (0)。 - PORTS:端口映射,如
0.0.0.0:8080->80/tcp。
启动、停止、重启、删除
docker start web # 启动一个已停止的容器(复用原容器,不新建)
docker stop web # 优雅停止(发 SIGTERM,等超时后 SIGKILL)
docker restart web # 重启
docker rm web # 删除容器(停止后才能删;或加 -f 强删)
进入运行中的容器检修 ⭐
docker exec -it web bash # 进入容器内部,开一个交互式 shell
容器里操作完 exit 退出,容器继续运行——exec 只是"进去看看",不影响主进程。
exec 不只能开 shell,还能直接在容器里执行单条命令:
docker exec web ls /etc/nginx # 在容器里执行一条命令,不进交互终端
docker exec -it db mysql -uroot -p # 直接跑容器的 mysql 客户端
这种"单条命令"用法在排错时尤其好用:不用进去,一条命令就能看到容器里的文件、进程、网络状态。
文件拷贝与资源限制
容器和宿主机之间传文件,用 docker cp(类比 scp):
docker cp ./config.conf web:/etc/nginx/conf.d/ # 宿主机 → 容器
docker cp web:/var/log/nginx/access.log ./ # 容器 → 宿主机
给容器划资源边界,防止一个容器把整台机器吃满:
docker run -d --memory=512m --cpus=1 --name app nginx # 限制内存 512MB、CPU 1 核
docker stats # 实时看各容器 CPU / 内存占用
内存超限的容器会被内核 OOM 杀掉(第 6 讲展开)。生产环境务必给容器设资源上限,这是"多容器共享一台机器"的秩序保障。
容器命名规则
--name 不是随便起的,规则和变量名类似:只能由字母、数字、-、_ 组成,且同一台机器上容器名唯一。名字冲突时 docker run 会直接报 Conflict,需要换名或先删旧的。
一句话速查表
| 想做什么 | 命令 |
|---|---|
| 拉镜像 | docker pull 镜像:标签 |
| 看本地镜像 | docker images |
| 删镜像 | docker rmi 镜像 |
| 新建并跑容器 | docker run -d --name 名 镜像 |
| 看运行中的容器 | docker ps |
| 看所有容器 | docker ps -a |
| 停/启容器 | docker stop 名 / docker start 名 |
| 删容器 | docker rm 名 |
| 进容器 | docker exec -it 名 bash |
| 看日志 | docker logs -f 名 |
| 看占用 | docker system df |
| 清理 | docker system prune |
这张表不用背,多敲几遍自然记住;真记不清时查它比翻文档快。
⚠️ 常见错误
run和start分不清:run= 新建 + 启动;start= 启动已存在的容器。容器没了,start会报No such container。stop不是删除:stop只是让容器进入exited状态,镜像、容器文件都还在。- 没加
-it就用exec bash:会立刻退出,看不到交互界面;要-it才有真正的终端。 - 主进程一退容器就停:如果
docker run nginx前台运行、看不到日志就退出,先docker logs看主进程是不是崩了。 - 不给容器设资源上限:生产多容器同机时,一个没限制的容器可能拖垮整台机器。
2.3 查看与清理:会开箱也要会收拾
查看容器内发生了什么
docker logs web # 查看容器日志
docker logs -f web # -f 跟随输出(类似 tail -f),排错首选
docker top web # 查看容器内的进程
docker stats # 实时看各容器的 CPU / 内存占用
docker inspect web # 查看容器全部配置(JSON 格式,最全)
排错三板斧:docker ps -a 看状态 → docker logs 看日志 → docker inspect 看配置。
网络相关命令在容器排查里也很常用(第 3 讲详细展开,这里先混个脸熟):
docker network ls # 列出所有网络
docker port web # 查看容器端口映射
docker inspect web # 里头的 NetworkSettings 字段能看到容器的 IP 和网络
磁盘与清理 ⭐
docker system df # 看镜像、容器、卷、构建缓存各占多少磁盘
docker system prune # 清理:停止的容器、无用网络、悬空镜像、构建缓存
docker system prune -a # 更强:连"没被任何容器使用"的镜像也一起清
更精准的子命令:
docker container prune # 只删已停止的容器
docker image prune # 只删悬空镜像(dangling,没标签的)
docker volume prune # 只删没有被容器引用的卷(小心,数据没了)
容器生命周期状态 ⭐
容器状态是概念题常客,一张图记住:
created(已创建未启动)
↓ docker start
running(运行中)
↓ 主进程退出 / docker stop
exited(已停止)
↓ docker rm
(消失)
此外还有 paused(暂停,进程挂起不占 CPU)和 restarting(正在重启)两种状态。
⚠️ 常见错误
prune误删数据:docker system prune -a会删掉没被使用的镜像,volume prune会删卷——删除前先docker system df看清楚。- 查不到日志就瞎猜:容器一启动就退,十有八九问题在日志里,先
docker logs再动容器配置。 - 忘记回收资源:频繁
run测试后磁盘会积攒一堆悬空镜像和停止的容器,养成定期docker system prune的习惯。
📌 双语术语表(本讲)
| 中文 | English | 记忆点 |
|---|---|---|
| 拉取镜像 | pull | 从仓库下载 |
| 删除镜像 | rmi | remove image |
| 打标签 | tag | 给镜像加别名 |
| 运行容器 | run | 新建并启动 |
| 后台运行 | detached / -d |
不占终端 |
| 交互终端 | interactive tty / -it |
进入容器操作 |
| 启动/停止 | start / stop | 复用容器 |
| 删除容器 | rm | remove container |
| 进入容器 | exec | 进去检修 |
| 查看日志 | logs | 排错第一步 |
| 清理 | prune | 打扫卫生 |
| 悬空镜像 | dangling image | 没标签的镜像 |
| 文件拷贝 | cp | 容器与宿主机互传 |
| 内存限制 | memory limit | --memory=512m |
| CPU 限制 | cpu limit | --cpus=1 |
⭐ 本讲考点清单
docker pull/docker images/docker rmi/docker tag的用法docker run常用参数:-d、-p、--name、-it、--rm、--restartrun= 新建 + 启动;start= 启动已存在的容器stop只停止不删除;rm删除;ps -a看所有容器exec -it进入运行中的容器,退出不影响主进程- 容器状态流转:created → running → exited → (删除)
logs -f/inspect/stats是排错三板斧system df看占用,prune清理;volume prune会删数据- 镜像被容器占用时删不掉,先删容器
latest标签不锁定版本,生产用具体版本号docker cp在容器与宿主机之间传文件--memory/--cpus给容器划资源上限,防 OOM- 容器名唯一,命名规则:字母、数字、
-、_ - 镜像完整名字 = 仓库地址 + 组织 + 仓库名 + 标签