Docker 常用命令
按使用场景分组的 Docker 命令速查,重点标了几个真出过事的地方(latest 标签、prune -a、down -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 ... |
用命名卷而不是宿主路径 |
| 命令 | 说明 |
|---|---|
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 转 compose、K8s 常用命令、Linux 常用命令、Git 常用命令、YAML/JSON 互转。