Docker 常用命令速查
1. 镜像(Image)操作
基础命令
| 命令 | 作用 | 例子 |
|---|
docker pull | 从仓库拉取镜像 | docker pull nginx:latest |
docker images | 列出本地镜像 | docker images / docker images --no-trunc |
docker search | 搜索镜像(官方仓库) | docker search nginx |
docker build | 从 Dockerfile 构建镜像 | docker build -t myapp:1.0 . |
docker tag | 给镜像打标签 | docker tag myapp:1.0 myrepo/myapp:1.0 |
docker rmi | 删除镜像 | docker rmi myapp:1.0 / docker rmi -f $(docker images -q) |
docker inspect | 查看镜像详细信息 | docker inspect nginx:latest |
docker save | 导出镜像为 tar 文件 | docker save -o nginx.tar nginx:latest |
docker load | 从 tar 文件导入镜像 | docker load -i nginx.tar |
build 常用参数
docker build \
-t myapp:1.0 \ # 镜像名:标签
-f Dockerfile.prod \ # 指定 Dockerfile 路径(默认 ./Dockerfile)
--build-arg VERSION=1.0 \ # 传递构建参数(对应 ARG 指令)
--no-cache \ # 跳过缓存,全量重新构建
. # 构建上下文(通常是当前目录)
Dockerfile 关键指令
| 指令 | 作用与区别 | 注意 |
|---|
FROM | 基础镜像(第一行) | 不能省略。如 FROM ubuntu:20.04 或 FROM scratch(空镜像) |
WORKDIR | 设置容器工作目录 | 不存在时自动创建。RUN/CMD 等指令在此目录执行。多次写会累加路径 |
RUN | 执行 shell 命令(构建时) | 每条 RUN 产生新的镜像层。合并多条命令减少层数:RUN apt-get update && apt-get install -y xxx |
COPY | 复制本地文件/目录到镜像 | 比 ADD 更明确,优先用。路径相对于构建上下文 |
ADD | 复制文件,支持远程 URL 和自动解压 tar | 一般不用(除非需要自动解压)。远程 URL 应用 RUN wget 代替 |
ENV | 设置环境变量 | ENV KEY=value 或 ENV KEY1=val1 KEY2=val2。容器内可用,构建时后续行也可用 |
ARG | 构建参数(仅构建时可用) | ARG VERSION=1.0。docker build --build-arg VERSION=2.0 覆盖。容器内不可用 |
CMD | 容器默认启动命令 | 仅最后一条生效。可被 docker run 的命令行覆盖。推荐 JSON 数组形式:CMD ["python", "app.py"] |
ENTRYPOINT | 容器启动入口点 | 不易被覆盖(需 --entrypoint 强制)。与 CMD 搭配:ENTRYPOINT 是主程序,CMD 是默认参数 |
EXPOSE | 声明容器监听端口 | 仅文档作用,不做端口映射。映射还需 docker run -p |
VOLUME | 声明数据卷挂载点 | VOLUME ["/data"]。仅标记用,真正挂载需 docker run -v |
USER | 指定运行用户 | 默认 root。安全起见,非 root 用户应存在:RUN useradd -m appuser && USER appuser |
LABEL | 添加元数据标签 | LABEL version="1.0" maintainer="xxx@example.com"。docker inspect 可查 |
常见坑
- ENV vs ARG:ENV 在构建和容器运行时都可用;ARG 仅构建时有效。容器内看不到 ARG。
- CMD vs ENTRYPOINT:
CMD ["sh", "-c", "python app.py"] 是 shell 形式(建议用数组形式避免 shell 解析坑);ENTRYPOINT 通常配 CMD:ENTRYPOINT ["python"] + CMD ["app.py"] 这样 docker run myapp --debug 会变成 python --debug。
- RUN 缓存:如果构建上下文没变,RUN 会用缓存。改代码后第一次 build 要
--no-cache 重建。
- COPY vs ADD:一般只用 COPY。ADD 自动解压 tar 可能不符合预期。
2. 容器(Container)操作
基础命令
| 命令 | 作用 | 例子 |
|---|
docker run | 创建并启动容器 | docker run -d -p 8080:80 nginx |
docker ps | 列出运行中的容器 | docker ps / docker ps -a(全部) |
docker logs | 查看容器日志 | docker logs myapp / docker logs -f myapp(跟踪) |
docker exec | 在运行中容器执行命令 | docker exec -it myapp bash |
docker stop | 优雅停止容器 | docker stop myapp |
docker start | 启动已停止的容器 | docker start myapp |
docker restart | 重启容器 | docker restart myapp |
docker rm | 删除容器 | docker rm myapp / docker rm -f myapp(强制) |
docker inspect | 查看容器详细信息 | docker inspect myapp |
docker stats | 实时查看容器资源占用 | docker stats myapp / docker stats --no-stream(单次) |
docker top | 查看容器内运行的进程 | docker top myapp |
docker cp | 在主机与容器间复制文件 | docker cp myapp:/data/file.txt ./ / docker cp ./file.txt myapp:/data/ |
docker diff | 查看容器文件系统变化 | docker diff myapp |
docker run 常用参数详解
docker run \
-d \ # detach,后台运行
--name myapp \ # 容器名称
-p 8080:80 \ # 端口映射:主机:容器(-p 8080:80/udp 指定协议)
-v /host/data:/container/data \ # 数据卷挂载:绑定挂载(bind mount)
-v named-volume:/data \ # 使用命名卷
-e ENV_VAR=value \ # 环境变量
-e ENV_FROM_FILE \ # 从 --env-file 读取
--rm \ # 容器停止后自动删除
--network mynet \ # 指定网络
-w /app \ # 工作目录(覆盖 WORKDIR)
--restart=always \ # 重启策略(no/always/unless-stopped/on-failure:3)
-u appuser \ # 运行用户(覆盖 USER)
--privileged \ # 以特权模式运行(危险!给容器完整宿主权限)
--cap-add=NET_ADMIN \ # 添加特定 Linux 能力
-m 512m \ # 内存限制
--cpus=1 \ # CPU 数限制
--memory-swap=1g \ # 内存+交换区限制
nginx:latest # 镜像:标签
logs 常用参数
docker logs \
-f \ # follow,持续输出
-n 100 \ # 显示最后 N 行
--tail=50 \ # 等价于 -n 50
--timestamps \ # 显示时间戳
--since 2024-01-01 \ # 显示时间戳之后的日志
--until 2024-01-02 \ # 显示时间戳之前的日志
myapp
exec 常用
docker exec -it myapp bash # 进入容器交互式 bash
docker exec -u root myapp whoami # 以 root 用户执行
docker exec myapp ps aux # 查看容器内进程(不交互)
3. 数据卷与网络
数据卷(Volume)
| 类型 | 命令 | 区别与应用 |
|---|
| 绑定挂载 (bind mount) | docker run -v /host/path:/container/path myapp | 直接挂载宿主目录。同步双向,修改立即可见。用于开发阶段代码热更新 |
| 命名卷 (named volume) | docker volume create mydata <br> docker run -v mydata:/data myapp | Docker 管理的卷。数据存储位置由 Docker 控制(/var/lib/docker/volumes/)。生产推荐 |
| 匿名卷 | docker run -v /data myapp | 不指定名称。Docker 自动生成 UUID 作卷名。难以管理,不推荐 |
卷操作命令
docker volume create mydata # 创建命名卷
docker volume ls # 列出所有卷
docker volume inspect mydata # 查看卷详细信息(路径等)
docker volume prune # 删除未被使用的卷
docker volume rm mydata # 删除指定卷
docker run -v mydata:/data --mount type=volume,source=mydata,target=/data myapp # --mount 方式
网络(Network)
docker network create mynet # 创建自定义网络(bridge 类型)
docker network ls # 列出所有网络
docker network inspect mynet # 查看网络详情(关联容器等)
docker network connect mynet container1 # 容器连接网络(容器运行中)
docker network disconnect mynet container1 # 容器断开网络
docker network prune # 删除未被使用的网络
docker network rm mynet # 删除指定网络
# 启动容器加入网络
docker run -d --name app --network mynet nginx
网络模式
| 模式 | 用途 | 命令 |
|---|
| bridge(默认) | 容器间通过网络通信 | docker run -d nginx(自动 bridge) |
| host | 容器共享宿主网络栈,性能最好 | docker run --network host nginx |
| none | 容器无网络 | docker run --network none nginx |
| container | 容器共享另一容器网络 | docker run --network container:web nginx |
自定义 bridge 网络的好处:容器间可用容器名 DNS 解析(而默认 bridge 网络不行),简化跨容器通信。
4. 镜像与容器清理
| 操作 | 命令 | 说明 |
|---|
| 删除未使用容器 | docker container prune | 删除所有停止的容器。加 -f 跳过确认 |
| 删除未使用镜像 | docker image prune | 删除未被容器引用的镜像。-a 删除所有不用镜像 |
| 删除未使用卷 | docker volume prune | 删除未被挂载的卷。注意数据丢失! |
| 删除未使用网络 | docker network prune | 删除未被使用的网络 |
| 一键清理(谨慎) | docker system prune | 清理容器、镜像、卷、网络。-a 更激进。确保不需要数据后再用! |
| 查看磁盘占用 | docker system df | 列出各组件占用空间 |
磁盘占用排查
# 查看磁盘占用概览
docker system df
# 查看各镜像大小
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"
# 查看各容器大小(包括日志)
docker ps -a --format "table {{.Names}}\t{{.Size}}"
# 查看具体卷占用
du -sh /var/lib/docker/volumes/*/
# 清理容器日志(容器运行中)
docker exec myapp bash -c "truncate -s 0 /var/log/app.log"
# 或直接清理宿主日志文件
truncate -s 0 /var/lib/docker/containers/容器ID/容器ID-json.log
5. Docker Compose
常用子命令
| 命令 | 作用 | 例子 |
|---|
docker compose up | 启动所有服务 | docker compose up -d / docker compose up --build |
docker compose down | 停止并删除服务 | docker compose down / docker compose down -v(删卷) |
docker compose ps | 列出 compose 管理的容器 | docker compose ps |
docker compose logs | 查看服务日志 | docker compose logs -f web |
docker compose exec | 在服务容器执行命令 | docker compose exec web bash |
docker compose build | 构建镜像(不启动) | docker compose build / docker compose build --no-cache |
docker compose pull | 拉取镜像 | docker compose pull |
docker compose restart | 重启服务 | docker compose restart web |
docker compose stop | 停止服务(不删) | docker compose stop web |
docker compose start | 启动已停止服务 | docker compose start web |
compose 文件关键字段
version: '3.9'
services:
web:
image: nginx:latest # 使用现有镜像
# build: . # 或从 Dockerfile 构建
# build:
# context: .
# dockerfile: Dockerfile.prod
# args:
# VERSION: 1.0
container_name: my-web # 容器名
ports:
- "8080:80" # 端口映射
- "443:443/tcp"
volumes:
- ./data:/app/data # 绑定挂载
- app-data:/data # 命名卷
environment: # 环境变量
- DATABASE_URL=postgres://db:5432/mydb
- DEBUG=true
# env_file: .env # 或从文件读取
networks:
- backend # 自定义网络
depends_on:
- db # 服务依赖
restart: always # 重启策略
healthcheck: # 健康检查
test: ["CMD", "curl", "-f", "http://localhost/health"]
interval: 10s
timeout: 3s
retries: 3
start_period: 40s
command: python app.py # 覆盖 CMD
working_dir: /app # 工作目录
user: appuser # 运行用户
# 资源限制
deploy:
resources:
limits:
cpus: '1'
memory: 512M
reservations:
cpus: '0.5'
memory: 256M
db:
image: postgres:13
environment:
POSTGRES_DB: mydb
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
volumes:
- db-data:/var/lib/postgresql/data
networks:
- backend
# 定义命名卷
volumes:
app-data:
db-data:
# 定义网络
networks:
backend:
driver: bridge
常用模式
# 后台启动并查看日志
docker compose up -d && docker compose logs -f
# 完整重建(包括卷)
docker compose down -v && docker compose up -d --build
# 查看服务配置(合并后的)
docker compose config
# 验证 compose 文件格式
docker compose config --quiet
# 进入服务容器
docker compose exec web bash
# 一次性运行命令(不启动服务)
docker compose run --rm web python manage.py migrate
6. 排查与高频组合命令
快速诊断套路
# 1. 容器启动失败?查日志
docker logs myapp
docker logs myapp --tail 50 --timestamps
# 2. 进去容器看看
docker exec -it myapp bash
# 在容器内执行:ps aux, netstat -tlnp, env
# 3. 检查网络连通性
docker exec myapp curl http://service:8080/health
docker exec myapp ping db
# 4. 检查资源占用
docker stats myapp
# 5. 查看容器所有配置
docker inspect myapp | jq .
# 6. 看镜像的分层
docker history myapp:1.0
常用组合
# 构建 + 启动 + 查看日志
docker build -t myapp . && docker run -d --name myapp myapp && docker logs -f myapp
# 清理所有停止容器并查看磁盘占用
docker container prune -f && docker system df
# 修改配置后重启
docker compose down && docker compose up -d --build
# 导出容器为镜像(容器改动打包)
docker commit myapp myapp:backup
# 查找特定镜像的所有容器
docker ps -a --filter ancestor=nginx
# 批量删除镜像(危险!)
docker rmi $(docker images -q nginx)
# 实时监控多个容器日志
docker logs -f myapp1 myapp2 myapp3
# 进容器改文件后,验证改动后查看差异
docker exec myapp cat /config.json
docker diff myapp
性能排查
# 容器内可用资源(宿主总资源)
docker run alpine free -h
# 查看容器实际使用
docker stats --no-stream
# 查看容器内存峰值(需在容器停止后)
docker inspect myapp | grep -A 5 Memory
# 查看容器初始化时间
docker events --filter container=myapp --since 10m
# 检查日志大小(单个容器日志可能很大)
du -h /var/lib/docker/containers/容器ID/
网络排查
# 检查容器能否解析 DNS
docker exec myapp nslookup db
# 测试容器间连通
docker exec web curl http://db:5432
# 查看容器网络配置
docker inspect myapp --format='{{.NetworkSettings.Networks}}'
# 进入 bridge 网络的 container namespace(调试用)
docker run -it --network container:myapp nicolaka/netshoot sh
# 查看宿主网桥
ip link show | grep docker
7. 速查表(最常用的 10 条)
# 拉镜像
docker pull nginx
# 启动容器
docker run -d -p 8080:80 --name web nginx
# 查看日志
docker logs -f web
# 进入容器
docker exec -it web bash
# 列出容器
docker ps -a
# 构建镜像
docker build -t myapp:1.0 .
# 启动 compose
docker compose up -d
# 查看资源占用
docker stats
# 清理垃圾
docker system prune -a
# 导出镜像
docker save -o app.tar myapp:1.0 && docker load -i app.tar
更新日期:2026-07-11 用途:快速查阅,配合官方文档深化理解。命令参数持续变化,遇到新版本时以 docker <command> --help 为准。