返回文章
笔记知识库Docker容器Docker Compose命令行部署运维

Docker 常用命令速查:镜像、容器、数据持久化与 Compose

Docker 常用命令速查:镜像、容器、数据持久化与 Compose 用于日常部署、启动服务、查看日志、进入容器、更新应用和清理资源。示例默认使用 Linux 容器,采用现代的 docker compose 插件命令。 本文是操作参考,未在实际环境执行示例。镜像标签仅作演示;正式部署应选择经过验证的版本,需要固定内容时

2026年9月22日阅读约 17 分钟0 条评论

Docker 常用命令速查:镜像、容器、数据持久化与 Compose

用于日常部署、启动服务、查看日志、进入容器、更新应用和清理资源。示例默认使用 Linux 容器,采用现代的 docker compose 插件命令。

本文是操作参考,未在实际环境执行示例。镜像标签仅作演示;正式部署应选择经过验证的版本,需要固定内容时使用镜像 digest。

1. 先理解几个概念

概念含义镜像 Image创建容器的模板,包含应用及其运行环境容器 Container镜像的运行实例,有独立进程、网络和可写层数据卷 VolumeDocker 管理的持久化存储,生命周期可以独立于容器绑定挂载 Bind mount将宿主机文件或目录映射到容器路径网络 Network连接容器;自定义 bridge 网络支持按容器名解析Compose用 YAML 描述并管理一组服务、网络和数据卷

一个镜像可以创建多个容器。停止或重启同一个容器会保留其可写层;删除并重建容器后,该层中的数据不再保留。数据库、上传文件等需要持久保存的内容应放在数据卷或绑定挂载中。

2. 环境与连接检查

docker version
docker info
docker compose version
docker context ls
docker context show
  • docker version 同时显示客户端和服务端信息;只有客户端正常不代表 Docker Engine 可用。

  • 出现 “Cannot connect to the Docker daemon” 时,先确认 Docker Desktop 或 Docker Engine 已启动,再检查当前 context 和权限。

  • Windows 上使用 Docker Desktop 时,本文的 nginx、Redis 示例需要 Linux 容器模式。

  • 当前 context 可能指向远程主机,执行修改和清理命令前应确认目标。

  • 旧教程里的 docker-compose 是旧版独立命令;本文统一使用 docker compose。

3. 镜像:拉取、查看、构建与传输

docker pull nginx:stable
docker image ls
docker image inspect nginx:stable
docker history nginx:stable

docker images 是 docker image ls 的常用别名。镜像名一般为 仓库/名称:标签;省略标签时默认使用 latest,但它只是一个标签,不保证代表最新版本。

在含有 Dockerfile 的项目目录构建:

docker build -t demo-app:1.0 .
docker build --pull -t demo-app:1.0 .
docker build --no-cache -t demo-app:1.0 .
  • -t 设置镜像名称和标签。

  • 最后的 . 是构建上下文;用 .dockerignore 排除依赖缓存、Git 目录及不应进入构建上下文的文件。

  • --pull 尝试获取更新的基础镜像。

  • --no-cache 不使用构建层缓存,但不等同于更新基础镜像;需要时可与 --pull 组合使用。

离线保存和加载:

docker image save -o demo-app-1.0.tar demo-app:1.0
docker image load -i demo-app-1.0.tar

save/load 传输镜像,不包含运行中容器的数据卷、端口映射等运行配置。

推送到镜像仓库的示例:

docker login registry.example.com
docker tag demo-app:1.0 registry.example.com/team/demo-app:1.0
docker push registry.example.com/team/demo-app:1.0

仓库地址需要替换。不要把密码或令牌直接写进命令历史;自动化流程可通过标准输入配合 --password-stdin。是否允许推送由仓库权限决定。

4. 容器:创建、启动、停止与删除

启动一个本机可访问的 Nginx:

docker run -d --name web -p 127.0.0.1:8080:80 --restart unless-stopped nginx:stable

然后访问 http://localhost:8080。

参数含义-d后台运行--name web给容器命名,后续可按名称操作-p 127.0.0.1:8080:80将宿主机本地回环地址的 8080 端口转发到容器 80 端口--restart unless-stopped自动重启,手动停止的容器不会因该策略自动恢复-it交互输入并分配终端,常用于 Shell--rm容器退出后自动删除,适合一次性任务-e KEY=value设置环境变量--env-file .env从文件读取环境变量--mount挂载数据卷或宿主机路径

-p 8080:80 通常发布到宿主机所有接口;-p 127.0.0.1:8080:80 明确只绑定本机回环地址。EXPOSE 或 --expose 本身不会发布宿主机端口。应用仍须在容器内监听可被容器网络访问的地址,通常为 0.0.0.0。

查看与控制:

docker ps
docker ps -a
docker stop -t 30 web
docker start web
docker restart web
  • docker run 创建并启动新容器。

  • docker start 启动已存在的容器,不会重新拉取镜像或改变创建参数。

  • docker stop 请求进程正常退出,超过指定等待时间后会强制结束。

  • docker restart 重启同一个容器,不会自动部署新镜像。

删除示例,仅在容器已不需要时执行:

docker stop web
docker rm web

docker rm -f web 会强制终止并删除容器,应用可能来不及完成正常退出。删除容器会丢失其可写层;正常的 docker rm 不会删除命名数据卷或宿主机绑定目录。

临时交互式容器:

docker run --rm -it alpine:3 sh

5. 日志、进入容器与运行状态

docker logs --tail 100 web
docker logs -f --since 10m web
docker exec -it web sh
docker top web
docker stats --no-stream
docker inspect --format "{{json .State}}" web
docker port web
  • docker logs 主要读取容器标准输出和标准错误,受日志驱动及其配置影响;应用只写内部日志文件时,这里可能看不到。

  • -f 持续跟踪日志,按 Ctrl+C 退出跟踪,一般不会停止容器。

  • docker exec 在正在运行的容器内启动新进程;已停止的容器不能直接 exec。

  • 精简镜像不一定有 Bash,优先尝试 sh;distroless 等镜像可能连 Shell 都没有。

  • docker inspect 的 State 可用于查看退出码、OOMKilled、错误和健康检查状态。状态为 running 不代表应用已准备好接收请求。

复制文件和检查 Nginx 配置:

docker cp web:/etc/nginx/nginx.conf ./nginx.conf
docker exec web nginx -t

docker cp 可在宿主机和容器之间复制文件,包括从已停止容器中提取文件。临时改动容器内的配置通常无法经受删除重建,应回写到源码、镜像或挂载文件中。

6. 数据卷与绑定挂载

命名数据卷:适合数据库等服务数据

创建数据卷并启动开启 AOF 的 Redis:

docker volume create redis-data
docker run -d --name demo-redis --mount "type=volume,source=redis-data,target=/data" redis:7-alpine redis-server --appendonly yes
docker volume ls
docker volume inspect redis-data

Redis 将数据写入挂载的 /data。删除 demo-redis 后,redis-data 仍保留;重建时挂载同一数据卷可以复用数据。数据卷持久化不能代替备份,也不能保证跨版本升级兼容。

绑定挂载:适合配置、静态资源与本地开发

Linux/macOS 示例:

docker run -d --name web-static -p 127.0.0.1:8081:80 --mount "type=bind,source=/absolute/path/site,target=/usr/share/nginx/html,readonly" nginx:stable

Windows PowerShell 示例:

docker run -d --name web-static -p 127.0.0.1:8081:80 --mount "type=bind,source=C:/work/site,target=/usr/share/nginx/html,readonly" nginx:stable

选择对应平台的一条执行,并将 source 替换成已存在的绝对路径。

  • source 是宿主机路径,target 是容器路径;Linux 容器的目标路径使用 Linux 格式。

  • readonly 将挂载设为只读,适合无需写入的静态文件和配置。

  • 绑定挂载会遮住镜像在目标目录下的原有内容,目录看起来“空了”时先检查挂载路径。

  • 使用远程 Docker context 时,绑定挂载的源路径属于 Docker 服务端主机,不是运行 CLI 的本地电脑。

  • -v 也是常见挂载语法,--mount 的字段更明确;默认情况下,它会在绑定源路径不存在时报错,有助于发现路径拼错。

7. 容器网络与服务互访

以下命令假定前面的 web 和 demo-redis 容器仍存在:

docker network create app-net
docker network connect app-net web
docker network connect app-net demo-redis
docker network ls
docker network inspect app-net

连接同一个自定义网络后,容器中的客户端可通过 demo-redis:6379 连接 Redis,无需为容器之间的访问发布宿主机端口。

  • 容器内的 localhost 指当前容器自己,不是宿主机,也不是其他容器。

  • 容器互访使用容器名或 Compose 服务名,以及容器内部端口。

  • 宿主机访问容器通常使用已发布的端口。

  • Docker Desktop 下,容器访问宿主机服务常用 host.docker.internal;原生 Linux Engine 通常需要额外配置,例如创建容器时添加 --add-host=host.docker.internal:host-gateway,并确保宿主机服务的监听地址和防火墙允许访问。

8. Docker Compose:管理一组服务

在项目目录创建 compose.yaml:

services:
  web:
    image: nginx:stable
    ports:
      - "127.0.0.1:8080:80"
    restart: unless-stopped

  redis:
    image: redis:7-alpine
    command: ["redis-server", "--appendonly", "yes"]
    volumes:
      - redis-data:/data
    restart: unless-stopped

volumes:
  redis-data:

这是两个服务的管理示例,Nginx 默认不会自动使用 Redis。若前面的 web 容器占用了 8080 端口,先停止它,或把 Compose 的宿主机端口改成其他值。

在 compose.yaml 所在目录执行:

docker compose config --quiet
docker compose up -d
docker compose ps
docker compose logs -f --tail 100
docker compose logs -f web
docker compose exec web sh
docker compose stop
docker compose start
docker compose down

命令行为config --quiet校验配置而不打印解析后的内容up -d创建并启动服务,按需要重建发生变化的容器stop停止服务,保留容器start启动已存在的服务容器restart重启现有容器,不应用新的创建配置down停止并删除项目容器及默认创建的网络,默认保留命名数据卷down -v还会删除 Compose 管理的命名卷及附属匿名卷,可能丢失业务数据;external 卷不在删除范围内

Compose 默认给服务创建共同网络,服务之间可通过服务名访问,例如 redis:6379。

需要指定配置文件或项目名时:

docker compose -f compose.prod.yaml -p demo-prod up -d

后续管理同一项目时保持相同的 -f 和 -p。项目名影响默认容器、网络和数据卷命名;切换项目名后出现“数据没了”,可能只是连接了另一组卷。

补充:

  • Compose 的 .env 通常用于 YAML 中的变量替换,不会自动把所有变量注入容器;注入需要使用服务的 environment 或 env_file。

  • depends_on 的简单写法只控制启动顺序,不保证依赖服务已就绪;需要等待健康状态时应配置 healthcheck 和相应依赖条件,应用本身也应能重试连接。

9. 更新应用:区分拉取镜像、构建与重启

服务直接使用仓库镜像

docker compose pull
docker compose up -d

pull 获取镜像,但不会自动替换正在运行的容器;up -d 才会按镜像和配置变化重建服务。必要时只操作指定服务,例如 docker compose pull web、docker compose up -d web。

服务在 Compose 中配置了 build

docker compose up -d --build

这会先构建,再按需要重建启动。若还要更新 Dockerfile 的基础镜像:

docker compose build --pull
docker compose up -d

上面的 Nginx/Redis 示例只有 image 字段;本地项目需要实际配置 build 后,构建流程才适用。

关键区别:

  • 修改 Dockerfile 或进入镜像的代码:需要重新构建和部署。

  • 修改端口、环境变量、挂载等创建参数:需要重建容器。

  • 只执行 restart:继续使用现有镜像和创建配置。

  • 通过绑定挂载修改文件:容器能看到文件变化,但应用可能仍需热加载、配置 reload 或重启。

更新前备份重要数据。恢复旧镜像可以回退应用版本,但数据库结构迁移不一定能随之回退。

10. 资源占用与清理

先查看资源占用:

docker system df
docker system df -v
docker ps -a
docker volume ls

按需清理,每条命令的范围不同:

命令清理范围与注意事项docker rm 容器名删除指定已停止容器,其可写层随之删除docker image rm 镜像名:标签移除指定镜像引用;实际回收空间取决于共享层和其他引用docker image prune删除未使用的悬空镜像docker image prune -a删除没有任何容器引用的镜像,范围比默认 prune 大docker container prune删除所有已停止容器,包括其可写层docker builder prune清理构建缓存,之后构建可能变慢docker network prune删除未被容器使用的自定义网络docker system prune综合清理已停止容器、未使用网络、悬空镜像及未使用构建缓存;默认不清理数据卷docker volume rm 卷名删除指定未被容器引用的卷,卷内数据会丢失

“没有容器使用”不等于“没有价值”。卷可能保存着等待恢复的数据库,停止的容器也可能有尚未提取的文件。清理前确认数据位置和备份,不要把批量删卷或 compose down -v 当成普通重启步骤。

11. 常见问题的排查顺序

容器启动后马上退出或不断重启

docker ps -a
docker logs --tail 200 容器名
docker inspect --format "{{json .State}}" 容器名

检查启动命令、环境变量、配置文件、依赖服务和资源限制。容器的主进程结束后容器就会退出;Web 服务通常应以前台模式运行。

退出码 137 表示进程被 SIGKILL 终止,可能是内存不足,也可能是人为或超时强制结束;结合 OOMKilled 和宿主机日志判断,不能只看退出码。

提示端口已被占用

先检查其他容器及宿主机进程是否占用端口。端口格式是 宿主机端口:容器端口,可以只更改左侧,例如将 8080:80 改为 8081:80。

提示容器名已存在

使用 docker ps -a 找到旧容器。需要继续使用它时执行 start;需要替换时,先确认持久化数据,再停止并删除旧容器,或者为新容器换名。

重建后配置或数据消失

检查数据是否只写在容器可写层中,是否挂载了正确目录或卷,以及 Compose 项目名是否改变。

容器运行正常但网页打不开

依次确认:应用是否启动完成、是否监听正确地址和端口、端口是否发布、访问的是否为正确宿主机,以及防火墙和代理设置。

12. 高频命令速记

需求命令拉取镜像docker pull 镜像:标签查看运行中 / 所有容器docker ps / docker ps -a跟踪日志docker logs -f --tail 100 容器名进入容器docker exec -it 容器名 sh停止 / 启动 / 重启docker stop / start / restart 容器名查看状态与配置docker inspect 容器名查看资源占用docker stats --no-stream查看磁盘占用docker system df构建镜像docker build -t 名称:标签 .启动 Compose 项目docker compose up -d查看 Compose 日志docker compose logs -f --tail 100拉取并部署更新依次执行 docker compose pull、docker compose up -d构建并部署更新docker compose up -d --build停止并移除 Compose 容器docker compose down,默认保留命名卷

官方资料

Discussion

评论

0 条已通过审核

留下评论

友善交流,请勿发布广告或无关内容。