引言
对日常开发者来说,Docker 的价值在于"一次构建、随处运行"。但真正卡住效率的,往往不是"会不会用",而是"记不住命令"。docker run 到底加不加 -it?镜像越积越多怎么清理?如何让两个容器互相访问?
这篇文章聚焦 Docker 核心命令,从真实开发高频场景出发,把最常用的命令按类别整理成一张可随时查阅的地图。建议收藏,需要时直接搜索关键词定位。
提示:本文假设你已经安装 Docker,可通过 docker --version 检查环境。
一、命令速查总览
先上一张总表,方便快速定位你需要的命令大类:
Docker 命令遵循统一格式:docker <对象> <操作> [参数]。例如 docker container ls 等价于 docker ps,理解这个规律后,很多命令可以举一反三。
二、镜像管理命令
镜像是容器的"模板",日常开发中最先接触的就是拉取和构建镜像。
2.1 拉取镜像:docker pull
# 拉取最新版
docker pull nginx
# 拉取指定版本(推荐在生产中显式指定 tag)
docker pull nginx:1.25
# 从指定仓库拉取
docker pull registry.example.com/myapp:latest2.2 构建镜像:docker build
# 基础构建:-t 指定镜像名和标签,. 表示构建上下文为当前目录
docker build -t myapp:1.0 .
# 指定 Dockerfile 路径
docker build -f docker/Dockerfile -t myapp:1.0 .
# 多阶段构建 + 传入构建参数
docker build --build-arg NODE_ENV=production -t myapp:1.0 .
# 构建时清除缓存
docker build --no-cache -t myapp:1.0 .构建优化建议:编写 .dockerignore 排除 node_modules、.git 等无关文件,能显著缩小构建上下文、加快构建速度。
2.3 查看与删除镜像
# 列出本地镜像
docker images
docker image ls
# 查看镜像详情(层级、环境变量、端口等)
docker inspect nginx:1.25
# 查看镜像构建历史
docker history nginx:1.25
# 删除镜像(强制删除加 -f)
docker rmi myapp:1.0
docker rmi <IMAGE_ID>
# 删除所有未被使用的镜像(慎用)
docker image prune -a2.4 标签与推送:docker tag / docker push
# 打标签(tag 本质是给镜像加一个别名)
docker tag myapp:1.0 myrepo/myapp:1.0
# 登录仓库后推送
docker login
docker push myrepo/myapp:1.02.5 镜像的离线传递:save / load
在没有外网的环境(内网、离线服务器)下,可以用 save/load 传递镜像:
# 导出镜像为 tar 包
docker save -o myapp.tar myapp:1.0
# 从 tar 包导入镜像
docker load -i myapp.tar三、容器管理命令
容器是运行中的镜像实例,这部分命令是日常使用频率最高的。
3.1 运行容器:docker run
docker run 的参数最丰富,先看一个典型的 Web 应用启动命令:
docker run -d \
--name myapp \
-p 8080:80 \
-v /data:/app/data \
-e ENV=production \
--restart unless-stopped \
myapp:1.0常用参数速查:
交互式容器(调试常用):
# 启动一个临时 Ubuntu 容器并进入 shell,退出后自动删除
docker run --rm -it ubuntu:22.04 bash3.2 查看容器:docker ps
# 查看运行中的容器
docker ps
# 查看所有容器(含已停止的)
docker ps -a
# 只显示容器 ID
docker ps -aq3.3 启停与删除
docker start myapp # 启动已停止的容器
docker stop myapp # 停止容器
docker restart myapp # 重启容器
# 删除容器(运行中的需加 -f)
docker rm myapp
docker rm -f myapp
# 一键删除所有已停止的容器
docker container prune3.4 进入容器与执行命令:docker exec
# 进入容器的 shell
docker exec -it myapp bash
# 直接执行单条命令
docker exec myapp ls -la /app
docker exec myapp cat /etc/hosts区别:docker exec 是在运行中的容器里执行新命令;docker attach 是连接容器的主进程(PID 1),通常用于查看启动进程的输出。
3.5 查看日志与状态:logs / stats / top
# 查看日志,-f 持续跟随,--tail 只看最近 N 行
docker logs -f --tail 100 myapp
# 实时查看资源占用(CPU、内存、网络、磁盘 I/O)
docker stats
# 查看容器内运行的进程
docker top myapp3.6 文件拷贝:docker cp
# 从宿主机拷贝到容器
docker cp ./config.json myapp:/app/config.json
# 从容器拷贝到宿主机
docker cp myapp:/app/logs ./logs四、网络管理命令
容器间通信和端口暴露都依赖网络。Docker 默认提供 bridge、host、none 三种网络。
4.1 常用命令
# 查看网络列表
docker network ls
# 创建自定义网络(推荐使用,便于容器间通过名字互访)
docker network create mynet
# 查看网络详情
docker network inspect mynet
# 运行容器时指定网络
docker run -d --network mynet --name web myapp:1.0
# 将已运行的容器连接到网络
docker network connect mynet db
# 断开连接 / 删除网络
docker network disconnect mynet db
docker network rm mynet4.2 关键概念
bridge(默认):容器通过虚拟网桥通信,跨容器需通过 -p 映射端口到宿主机。
host:容器直接使用宿主机网络,性能最好但隔离性差。
自定义网络:同一网络下的容器可以直接用容器名互相访问(内置 DNS 解析),这是多容器应用推荐的做法。
示例:让 web 容器通过容器名 db 访问数据库:
docker network create app-net
docker run -d --network app-net --name db mysql:8.0
docker run -d --network app-net --name web -e DB_HOST=db myapp:1.0五、数据卷与存储
容器删除后,容器内的数据会丢失。要持久化数据,需要挂载数据卷或宿主机目录。
5.1 数据卷(volume)—— 推荐方式
# 创建数据卷
docker volume create mydata
# 查看数据卷列表
docker volume ls
# 查看数据卷详情(含挂载点路径)
docker volume inspect mydata
# 挂载数据卷到容器
docker run -d -v mydata:/var/lib/mysql mysql:8.0
# 删除数据卷
docker volume rm mydata
# 清理所有未被使用的数据卷(慎用)
docker volume prune5.2 绑定挂载(bind mount)—— 开发环境常用
将宿主机目录直接挂载到容器,适合本地开发时实时同步代码:
docker run -d -v $(pwd)/src:/app/src myapp:1.0六、镜像构建进阶:BuildKit 与 Buildx
现代 Docker(19.03+)默认使用 BuildKit 引擎,通过 docker buildx 可以构建多架构镜像,这是 ARM 服务器(如 Apple Silicon、云厂商 ARM 实例)日益普及后的刚需。
6.1 检查与创建构建器
# 检查 buildx 是否可用
docker buildx version
# 创建并切换到新的多架构构建器
docker buildx create --name multiarch --use
# 启动构建器并查看详情
docker buildx inspect --bootstrap6.2 多架构构建
# 同时构建 amd64 和 arm64 镜像并推送到仓库
docker buildx build \
--platform linux/amd64,linux/arm64 \
-t myrepo/myapp:1.0 \
--push .注意:多架构镜像无法直接保存在本地,必须推送到镜像仓库才能完成架构分发。
七、实用技巧与常见排错
7.1 资源清理(日常维护必背)
# 一键查看 Docker 占用的磁盘空间
docker system df
# 清理所有未使用的资源(镜像、容器、网络、缓存,慎用)
docker system prune -a
# 分项清理
docker container prune # 清理停止的容器
docker image prune -a # 清理未使用的镜像
docker volume prune # 清理未使用的数据卷
docker network prune # 清理未使用的网络7.2 高频实用组合
# 停止并删除所有容器
docker stop $(docker ps -aq) && docker rm $(docker ps -aq)
# 删除所有 dangling(悬空)镜像
docker image prune -f
# 查看容器 IP 地址
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' myapp
# 实时追踪日志
docker logs -f --tail 50 myapp7.3 常见问题排查
总结与展望
掌握这些命令后,日常开发中的镜像构建、容器调试、网络互联、数据持久化基本都能覆盖。最后提炼几条核心建议:
分清"生命周期"四件事:run 启动、ps 查看、stop 停止、rm 删除——这是容器管理的骨架。
显式指定 tag:生产环境避免使用 latest,防止"同样的命令,不同的结果"。
容器互联用自定义网络:让容器通过名字互访,远比记 IP 可靠。
重视资源清理:定期 docker system df 和 prune,避免磁盘被镜像和悬空缓存占满。
随着云原生和异构计算(ARM/AMD)的普及,docker buildx 多架构构建正从"进阶技巧"变成"基础能力"。建议在日常 CI/CD 中尽早引入多架构构建,让交付的镜像具备更好的跨平台兼容性。
延伸阅读:多容器应用的编排与一键启停,请参阅《Docker Compose 实战指南》。
参考资料: