首页 > 工具箱 > Docker 常用命令

Docker 常用命令

按使用场景分组的 Docker 命令速查,重点标了几个真出过事的地方(latest 标签、prune -adown -v)。要把 docker run 的一长串参数转成 compose 文件,用 docker 转 compose

镜像

拉取、构建、查看、清理镜像。镜像是只读模板,容器是它的运行实例。

命令 说明
docker pull nginx:1.27 拉取指定 tag 的镜像。别用 latest,线上一定钉死版本,否则重建时拉到的可能不是同一个东西
docker images 列出本地镜像,看 REPOSITORY / TAG / SIZE
docker build -t myapp:1.0 . 按当前目录的 Dockerfile 构建并打 tag,最后那个点是构建上下文
docker build --no-cache -t myapp:1.0 . 不用缓存重建。改了 apt / npm 源却没生效时用它
docker build --platform linux/amd64 -t myapp . 在 M 系列 Mac 上构建给 x86 服务器用的镜像
docker rmi nginx:1.27 删除镜像;有容器在用会拒绝,加 -f 强删
docker tag myapp:1.0 registry.example.com/myapp:1.0 打一个新名字,推私有仓库前必须先 tag 成仓库地址开头
docker push registry.example.com/myapp:1.0 推到远端仓库,先 docker login
docker save -o myapp.tar myapp:1.0 把镜像导成 tar,内网机器之间搬运用
docker load -i myapp.tar 从 tar 导入镜像
docker history myapp:1.0 看镜像每一层是哪条指令产生的、占多大,排查体积必备

容器生命周期

跑起来、停下去、删掉。容器默认是一次性的,数据要落到卷上。

命令 说明
docker run -d --name web -p 8080:80 nginx 后台跑一个容器,宿主 8080 映射到容器 80
docker run -it --rm alpine sh 交互式进去看一眼,退出即自动删除,临时排查最常用
docker run -d --restart=always ... 宿主重启后自动拉起;只想在异常退出时重启用 on-failure
docker run -e TZ=Asia/Shanghai ... 传环境变量。容器默认是 UTC,日志时间对不上多半是这个
docker run --env-file .env ... 从 .env 批量传环境变量
docker run -v /data/mysql:/var/lib/mysql ... 挂宿主目录进容器,数据持久化靠它
docker run --memory=512m --cpus=1.5 ... 限制内存和 CPU。不限的话一个容器能吃光整台机器
docker ps 看运行中的容器;加 -a 看全部(含已退出的)
docker stop web 优雅停止,先发 SIGTERM,10 秒后才 SIGKILL
docker start web / docker restart web 启动 / 重启已有容器
docker rm web 删除容器;加 -f 连运行中的一起删
docker rename web web-old 改容器名字
docker update --restart=no web 改已有容器的重启策略等参数,不用重建

进容器排查

八成的线上问题都从这几条开始。

命令 说明
docker logs -f --tail 200 web 跟踪最后 200 行日志。最常用的一条
docker logs --since 10m web 只看最近 10 分钟的日志
docker exec -it web sh 进容器里的 shell。Alpine 只有 sh,Debian 系可以用 bash
docker exec -it web env 看容器里实际生效的环境变量,比猜配置快
docker inspect web 输出容器的完整 JSON:挂载、网络、环境、健康检查全在里面
docker inspect -f '{{.NetworkSettings.IPAddress}}' web 只取容器 IP,-f 后面是 Go 模板
docker stats 实时看各容器的 CPU / 内存 / 网络,相当于容器版 top
docker top web 看容器里的进程列表
docker port web 看端口映射关系
docker diff web 看容器相对镜像改动过哪些文件,排查「谁往容器里写东西了」
docker cp web:/app/log.txt ./ 从容器里拷文件出来,反过来写 ./x web:/app/ 就是拷进去

网络与卷

容器之间怎么互相找到,数据放哪里。

命令 说明
docker network ls 列出网络。默认的 bridge 网络里容器不能用名字互访
docker network create mynet 建一个自定义 bridge 网络,同一网络里可以直接用容器名当主机名访问
docker network connect mynet web 把已有容器接进某个网络
docker run --network host ... 直接用宿主网络,省一层 NAT,但端口会冲突,且 macOS / Windows 上行为不同
docker volume ls / create / rm 管理命名卷。比挂宿主目录更干净,权限问题也少
docker volume inspect mydata 看卷在宿主上的真实路径
docker run -v mydata:/var/lib/mysql ... 用命名卷而不是宿主路径

Compose

多容器编排。新版是 docker compose(空格),老版是 docker-compose(连字符)。

命令 说明
docker compose up -d 按 compose 文件后台起全套服务
docker compose up -d --build 先重新构建再起,改了代码要加这个
docker compose down 停掉并删除容器与网络;加 -v 连卷一起删(会丢数据
docker compose ps 看这套编排里各服务的状态
docker compose logs -f web 只跟某个服务的日志
docker compose exec web sh 进某个服务的容器
docker compose restart web 只重启某个服务
docker compose config 把 compose 文件展开成最终生效的样子,排查变量替换问题
docker compose pull 更新所有服务的镜像

清理

磁盘满了通常就是这几样堆出来的。

命令 说明
docker system df 先看空间都被什么占了:镜像、容器、卷、构建缓存
docker system prune 删掉停止的容器、悬空镜像、无用网络
docker system prune -a --volumes 连没被容器引用的镜像和卷一起删,很危险,确认数据都在别处再用
docker image prune -a 删除所有没被容器使用的镜像
docker builder prune 清构建缓存。BuildKit 的缓存能悄悄涨到几十 G
docker container prune 删除所有已停止的容器

几个常被问到的

  • 镜像和容器的区别:镜像是只读模板(像安装包),容器是它跑起来的实例(像进程)。同一个镜像可以起很多个容器,容器删掉镜像还在。
  • 容器一启动就退出:容器的生命周期跟着主进程走,主进程一结束容器就没了。后台服务必须在前台运行(nginx 要 daemon off;),不能用 systemctl start 那套。
  • 改了文件重启就没了:容器可写层是临时的,docker rm 之后全丢。要留住的东西必须挂卷。
  • 宿主访问不到端口:检查 -p 宿主端口:容器端口 的顺序,以及容器里的程序是不是只监听了 127.0.0.1——那样容器外面永远连不上,要改成 0.0.0.0
  • 容器之间怎么互相访问:放进同一个自定义网络,然后直接用容器名当主机名。默认 bridge 网络不带这个 DNS。
  • 相关:docker 转 composeK8s 常用命令Linux 常用命令Git 常用命令YAML/JSON 互转