Docker 命令大全汇总:常用场景与实操示例

这篇以命令示例为主,说明尽量简短。命令默认在 Linux 终端执行,涉及系统服务时通常需要加 sudo。执行删除、清理、覆盖数据之前,先确认容器和卷的用途。

示例中的容器名、镜像名、端口、目录均为演示值,请按实际环境替换。


一、安装 Docker

1. Ubuntu 或 Debian

sudo install -m 0755 -d /etc/apt/keyrings

. /etc/os-release

curl -fsSL "https://download.docker.com/linux/${ID}/gpg" \
  | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

sudo chmod a+r /etc/apt/keyrings/docker.gpg

echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/${ID} ${VERSION_CODENAME} stable" \
  | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt update
sudo apt install -y \
  docker-ce \
  docker-ce-cli \
  containerd.io \
  docker-buildx-plugin \
  docker-compose-plugin

2. CentOS

sudo yum install -y yum-utils

sudo yum-config-manager \
  --add-repo \
  https://download.docker.com/linux/centos/docker-ce.repo

sudo yum install -y \
  docker-ce \
  docker-ce-cli \
  containerd.io \
  docker-buildx-plugin \
  docker-compose-plugin

CentOS 7 已停止维护,旧环境中的软件源和依赖可能失效。Rocky Linux、AlmaLinux 等兼容发行版建议按官方文档选择对应仓库。

3. 启动并设置开机自启

sudo systemctl enable --now docker
sudo systemctl status docker

4. 验证安装

docker version
docker info
docker run --rm hello-world

5. 让普通用户免 sudo

sudo usermod -aG docker "$USER"
newgrp docker
docker ps

需要重新登录终端,用户组变更才会在全部会话中生效。

6. Docker Desktop

Windows 推荐先安装 WSL2:

wsl --install
winget install Docker.DockerDesktop

macOS 可使用 Homebrew:

brew install --cask docker
open -a Docker

二、配置国内镜像加速

编辑或新建 /etc/docker/daemon.json:

{
  "registry-mirrors": [
    "https://docker.1panel.live",
    "https://docker.m.daocloud.io"
  ],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m",
    "max-file": "3"
  }
}

重启 Docker:

sudo systemctl daemon-reload
sudo systemctl restart docker
docker info

查看生效的镜像源:

docker info | grep -A 10 "Registry Mirrors"

拉取镜像测试:

docker pull nginx:latest
docker pull alpine:3.20

截至 2026-09-17 的本机测试中,https://docker.1panel.live 返回 HTTP 200,https://docker.m.daocloud.io 返回 HTTP 401,后者是 Registry 的正常认证响应。第三方镜像站的可用性和政策会随时变化,不建议长期依赖。

阿里云、腾讯云、华为云等平台通常提供账号级加速地址,请优先使用控制台中分配的专属地址。要拉取私有镜像,优先使用自建 Harbor、云厂商 Registry 或受信任的私有仓库。

docker login registry.example.com
docker pull registry.example.com/team/app:1.0.0

不要把私有仓库凭据发送给来源不明的公共代理。


三、容器启动、停止与删除

1. 后台启动 Nginx

docker run -d \
  --name web \
  -p 8080:80 \
  -e TZ=Asia/Shanghai \
  -v web-data:/usr/share/nginx/html \
  --restart unless-stopped \
  nginx:latest

2. 前台交互运行

docker run --rm -it alpine:3.20 sh

退出后自动删除临时容器。

3. 启动常用参数

docker run -d \
  --name app \
  --hostname app01 \
  --network app-net \
  --restart on-failure:5 \
  --memory 1g \
  --cpus 1.5 \
  -p 127.0.0.1:18080:8080 \
  -e APP_ENV=production \
  -e TZ=Asia/Shanghai \
  -v /srv/app/config:/app/config:ro \
  -v app-data:/app/data \
  app:v1

4. 查看容器

docker ps
docker ps -a
docker ps -q
docker ps -a --format "table {{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Ports}}"

5. 启动与停止

docker start web
docker stop web
docker stop -t 30 web
docker restart web
docker kill web

stop 默认先发送终止信号,等待 10 秒后强制结束。kill 会直接结束进程,可能造成数据损坏。

6. 暂停与恢复

docker pause web
docker unpause web

7. 删除容器

docker rm web
docker rm -f web
docker rm -v web

容器必须先停止才能执行普通的 docker rm。-v 会删除该容器创建的匿名卷,不会自动删除命名卷,但仍需先确认数据是否重要。

8. 批量操作

docker stop $(docker ps -q)
docker rm $(docker ps -aq)
docker rm -f $(docker ps -aq)

最后一条会删除全部容器,只应在确认没有业务数据依赖时使用。

9. 容器改名

docker rename web web-old

10. 查看容器信息

docker inspect web
docker inspect -f '{{.State.Status}}' web
docker inspect -f '{{.NetworkSettings.IPAddress}}' web
docker inspect -f '{{json .Mounts}}' web

四、查看容器日志

1. 实时查看最新日志

docker logs -f --tail 100 web

2. 带时间戳查看

docker logs -f -t --tail 200 web

3. 查看最近一段时间

docker logs --since 30m web
docker logs --since 2026-09-17T08:00:00 web
docker logs --until 2026-09-17T10:00:00 web

4. 只看错误关键词

docker logs web 2>&1 | grep -iE "error|exception|failed"

5. 导出日志

docker logs -t web > web.log 2>&1

6. 查看日志文件位置

docker inspect -f '{{.LogPath}}' web

7. 限制日志体积

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m",
    "max-file": "3"
  }
}

该配置通常只对新建容器生效。已有容器要生效,需要使用相同数据卷重新创建。

docker inspect -f \
  '{{.HostConfig.LogConfig.Type}} {{.HostConfig.LogConfig.Config}}' \
  web

五、进入容器并执行命令

1. 进入交互式 Shell

docker exec -it web bash
docker exec -it web sh

如果镜像中没有 Bash,就使用 sh。

2. 指定用户和目录

docker exec -it -u root -w /app web bash
docker exec -it -u 1000:1000 web sh

3. 只执行一条命令

docker exec web ls -lah /app
docker exec web env
docker exec web cat /etc/os-release
docker exec -u root web id

4. 在容器中执行数据库命令

docker exec -it mysql mysql -uroot -p
docker exec -it redis redis-cli
docker exec -it postgres psql -U postgres

5. 复制文件

docker cp ./config.yml web:/app/config.yml
docker cp web:/app/logs/app.log ./app.log
docker cp ./html/. web:/usr/share/nginx/html/

6. 查看容器进程

docker top web
docker exec web ps aux

7. attach 与 exec 的区别

docker attach web

attach 连接的是容器主进程。按 Ctrl+C 可能导致主进程结束。想进入独立 Shell,优先使用 docker exec。


六、镜像管理

1. 查看镜像

docker images
docker image ls
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.ID}}\t{{.Size}}"

2. 拉取镜像

docker pull nginx
docker pull nginx:1.27
docker pull alpine:3.20

3. 查看镜像详情与构建历史

docker image inspect nginx:latest
docker history nginx:latest

4. 标记镜像

docker tag app:v1 registry.example.com/team/app:v1
docker tag app:v1 registry.example.com/team/app:latest

5. 推送镜像

docker login registry.example.com
docker push registry.example.com/team/app:v1

6. 删除镜像

docker image rm nginx:latest
docker rmi nginx:latest

如果一个镜像仍被容器使用,先确认容器是否可以删除,再决定删除镜像。

7. 查看悬空镜像

docker images -f dangling=true

悬空镜像通常是 <none>:<none>,一般可以清理:

docker image prune

8. 清理所有未使用镜像

docker image prune -a

注意:-a 不只清理悬空镜像,还会删除没有被任何容器使用的带标签镜像。再次使用时需要重新拉取或重新构建。

9. 导出与导入镜像

docker save -o app-v1.tar app:v1
gzip app-v1.tar

gzip -d app-v1.tar.gz
docker load -i app-v1.tar

也可以直接流式处理:

docker save app:v1 | gzip > app-v1.tar.gz
gzip -dc app-v1.tar.gz | docker load

七、修改已有容器的常用参数

Docker 容器的端口、环境变量、挂载、网络、镜像等参数通常不能原地修改。docker update 只能调整部分运行时参数。

1. 可以尝试动态修改的参数

docker update --restart unless-stopped web
docker update --memory 1g --memory-swap 1g web
docker update --cpus 1.5 web
docker update --pids-limit 512 web
docker update --cpuset-cpus 0-1 web

2. 修改端口、环境变量或挂载

先备份配置:

docker inspect web > web-inspect.json
docker inspect -f '{{json .Mounts}}' web | jq .

停止旧容器并保留旧容器:

docker stop web
docker rename web web-old

使用新参数创建新容器:

docker run -d \
  --name web \
  -p 8081:80 \
  -e TZ=Asia/Shanghai \
  -v web-data:/usr/share/nginx/html \
  --restart unless-stopped \
  nginx:latest

验证新容器:

docker ps
docker logs -f --tail 100 web
curl -I http://127.0.0.1:8081

确认无误后再删除旧容器:

docker rm web-old

3. 使用 Compose 重建

修改 compose.yaml 后执行:

docker compose up -d
docker compose up -d --force-recreate
docker compose ps

Compose 会保留命名卷,并重建参数发生变化的容器。普通 docker compose down 通常保留命名卷:

docker compose down

下面这条会同时删除卷并销毁其中的数据:

docker compose down -v

八、Docker 磁盘与容量检查

1. 查看总体占用

docker system df
docker system df -v

2. 查看容器、镜像、卷和网络

docker ps -s
docker images
docker volume ls
docker network ls

3. 查看数据目录

sudo du -sh /var/lib/docker
sudo du -sh /var/lib/docker/* | sort -h

4. 查看卷占用

docker system df -v | grep -i volume
docker volume inspect app-data

5. 分级清理

先查看会清理什么:

docker container prune
docker image prune
docker builder prune
docker volume prune
docker network prune

确认后执行:

docker container prune -f
docker image prune -f
docker builder prune -f
docker network prune -f

清理未使用卷:

docker volume prune
docker volume prune -f

卷通常保存数据库、上传文件和配置,删除前必须先备份。

6. 一键清理

docker system prune

该命令会删除已停止容器、未使用网络、悬空镜像和构建缓存。

docker system prune -a

该命令还会删除未使用的带标签镜像。

docker system prune -a --volumes

这条命令会进一步删除未使用卷,可能直接导致数据永久丢失。生产环境不建议直接执行,至少先完成备份和依赖确认。


九、容器移植与数据迁移

1. 只迁移镜像,不带数据

源机器:

docker save app:v1 | gzip > app-v1.tar.gz

把文件复制到目标机器后:

gzip -dc app-v1.tar.gz | docker load
docker images | grep app

然后在新机器上重新创建容器:

docker run -d \
  --name app \
  -p 8080:8080 \
  -e TZ=Asia/Shanghai \
  -v app-data:/app/data \
  --restart unless-stopped \
  app:v1

镜像不包含运行参数、端口、环境变量和卷数据,这些都要单独迁移或重建。

2. 通过 Registry 迁移镜像

源机器:

docker tag app:v1 registry.example.com/team/app:v1
docker login registry.example.com
docker push registry.example.com/team/app:v1

目标机器:

docker login registry.example.com
docker pull registry.example.com/team/app:v1

这种方式适合跨机器、跨机房和 CI/CD 环境。

3. 备份命名卷

先停止写入:

docker stop app

备份:

docker run --rm \
  -v app-data:/data:ro \
  -v "$PWD":/backup \
  alpine:3.20 \
  sh -c 'tar czf /backup/app-data.tar.gz -C /data .'

查看备份:

ls -lh app-data.tar.gz

4. 恢复命名卷

目标机器创建同名卷:

docker volume create app-data

恢复数据:

docker run --rm \
  -v app-data:/data \
  -v "$PWD":/backup \
  alpine:3.20 \
  sh -c 'tar xzf /backup/app-data.tar.gz -C /data'

启动容器:

docker start app

如果备份来自其他用户或系统,恢复后要检查文件和目录权限。

5. 迁移绑定目录

源机器:

sudo tar czf app-bind.tar.gz -C /srv/app .

目标机器:

sudo mkdir -p /srv/app
sudo tar xzf app-bind.tar.gz -C /srv/app

也可以使用 rsync:

rsync -avP /srv/app/ user@target:/srv/app/

6. 数据库优先使用逻辑备份

MySQL:

docker exec mysql \
  sh -c 'exec mysqldump -uroot -p"$MYSQL_ROOT_PASSWORD" --all-databases' \
  > mysql-all.sql

PostgreSQL:

docker exec -t postgres \
  pg_dumpall -U postgres > postgres-all.sql

直接复制数据库文件时,必须保证数据库已经完全停止并完成刷盘,否则备份可能不一致。

7. export 与 import 的适用场景

docker export app > app-rootfs.tar
cat app-rootfs.tar | docker import - app-flat:v1

docker export 导出的是容器文件系统快照,不包含挂载卷、端口、环境变量、入口命令、标签和镜像层。它不适合作为完整容器迁移方案,优先使用镜像 save/load 加卷备份。

8. 跨架构迁移

docker image inspect nginx:latest \
  -f '{{.Architecture}} {{.Os}}'

amd64 和 arm64 镜像通常不能直接互换。跨架构时,应拉取对应架构的镜像,或使用 buildx 构建多架构镜像。


十、Docker Compose 常用示例

1. compose.yaml

services:
  web:
    image: nginx:1.27
    container_name: web
    ports:
      - "8080:80"
    environment:
      TZ: Asia/Shanghai
    volumes:
      - ./html:/usr/share/nginx/html:ro
      - web-data:/var/cache/nginx
    restart: unless-stopped

volumes:
  web-data:

2. 管理服务

docker compose up -d
docker compose ps
docker compose logs -f web
docker compose restart web
docker compose stop web
docker compose start web
docker compose down

3. 重建单个服务

docker compose up -d --force-recreate web
docker compose build --no-cache web
docker compose up -d web

4. 查看最终配置

docker compose config

现代 Docker 版本推荐使用 docker compose。旧的 docker-compose 是 Python V1 命令,已经停止维护。


十一、网络常用命令

1. 查看网络

docker network ls
docker network inspect bridge

2. 创建自定义网络

docker network create app-net
docker network create --subnet 172.30.0.0/24 app-net

3. 启动容器加入网络

docker run -d --name api --network app-net app:v1
docker run -d --name db --network app-net postgres:16

同一自定义网络中的容器可以通过容器名互相访问:

docker exec -it api sh
ping db

4. 连接和断开网络

docker network connect app-net web
docker network disconnect app-net web

5. 查看端口

docker port web
docker inspect -f '{{json .NetworkSettings.Ports}}' web
ss -lntp | grep 8080

十二、资源查看与限制

1. 实时查看资源

docker stats
docker stats web db
docker stats --no-stream

2. 启动时限制资源

docker run -d \
  --name app \
  --memory 1g \
  --memory-swap 1g \
  --cpus 1.5 \
  --pids-limit 512 \
  app:v1

3. 修改部分资源限制

docker update --memory 2g --memory-swap 2g app
docker update --cpus 2 app
docker update --pids-limit 1024 app

4. 查看容器内进程

docker top app
docker exec app ps -eo pid,ppid,user,cmd

十三、健康检查与重启策略

1. 启动时添加健康检查

docker run -d \
  --name web \
  --health-cmd "curl -fsS http://127.0.0.1/ || exit 1" \
  --health-interval 30s \
  --health-timeout 5s \
  --health-retries 3 \
  --health-start-period 20s \
  --restart unless-stopped \
  nginx:latest

2. 查看健康状态

docker ps
docker inspect -f '{{json .State.Health}}' web

3. 常见重启策略

docker run -d --restart=no --name c1 nginx
docker run -d --restart=always --name c2 nginx
docker run -d --restart=unless-stopped --name c3 nginx
docker run -d --restart=on-failure:5 --name c4 nginx

手动停止的容器不会在 Docker 守护进程重启后自动恢复,unless-stopped 通常更适合服务器长期运行场景。


十四、安全相关示例

1. 使用非 root 用户

docker run --rm -it -u 1000:1000 alpine:3.20 id

2. 只读根文件系统

docker run -d \
  --name web \
  --read-only \
  --tmpfs /tmp \
  --tmpfs /var/run \
  --tmpfs /var/cache/nginx \
  nginx:latest

3. 减少 Linux 能力

docker run -d \
  --name app \
  --cap-drop ALL \
  --cap-add NET_BIND_SERVICE \
  --security-opt no-new-privileges \
  app:v1

4. 禁止容器直接使用宿主机网络

除非明确需要,否则不要随意使用:

docker run --network host nginx

host 网络会减少网络隔离,端口也可能与宿主机服务冲突。


十五、故障排查常用命令

1. 容器启动后立即退出

docker ps -a
docker logs web
docker inspect -f '{{.State.ExitCode}} {{.State.Error}}' web

2. 查看容器配置和状态

docker inspect web | jq .
docker inspect -f '{{json .Config.Env}}' web
docker inspect -f '{{json .Mounts}}' web
docker inspect -f '{{json .NetworkSettings.Networks}}' web

3. 查看实时事件

docker events
docker events --filter container=web
docker events --since 30m

4. 端口被占用

ss -lntp | grep 8080
docker ps --format "table {{.Names}}\t{{.Ports}}"
docker port web

5. 容器内 DNS 或网络异常

docker exec -it web sh
cat /etc/resolv.conf
ping -c 3 8.8.8.8
nslookup example.com

6. 检查 Docker 服务

sudo systemctl status docker
sudo journalctl -u docker -n 100 --no-pager
sudo journalctl -u docker -f

7. 检查 Docker 信息

docker info
docker version
docker context ls

8. 检查磁盘是否写满

df -h
df -i
docker system df -v

磁盘写满或 inode 耗尽都会导致容器无法启动、日志写入失败或镜像无法拉取。


十六、最常用命令速查

容器

docker ps -a
docker run -d --name web -p 8080:80 nginx
docker start web
docker stop web
docker restart web
docker logs -f --tail 100 web
docker exec -it web sh
docker inspect web
docker rm web

镜像

docker images
docker pull nginx:latest
docker tag nginx:latest registry.example.com/team/nginx:latest
docker push registry.example.com/team/nginx:latest
docker image inspect nginx:latest
docker image rm nginx:latest
docker image prune
docker image prune -a

磁盘

docker system df
docker system df -v
docker container prune
docker image prune
docker builder prune
docker volume prune
docker system prune
docker system prune -a --volumes

数据

docker volume ls
docker volume inspect app-data
docker run --rm -v app-data:/data -v "$PWD":/backup alpine sh
docker save app:v1 | gzip > app-v1.tar.gz
gzip -dc app-v1.tar.gz | docker load

Compose

docker compose up -d
docker compose ps
docker compose logs -f
docker compose restart
docker compose down
docker compose down -v

十七、迁移前检查清单

  • 确认源机器和目标机器的 CPU 架构一致。
  • 记录镜像版本、启动命令、端口、环境变量、网络、挂载和重启策略。
  • 使用 docker inspect 保存旧容器配置。
  • 镜像通过 Registry 或 docker save/load 迁移。
  • 命名卷先执行 tar 归档,再复制到目标机器。
  • 绑定目录先停止写入,再使用 tar 或 rsync 同步。
  • 数据库使用 mysqldump、pg_dumpall 等逻辑备份。
  • 复制完成后检查目录权限、SELinux 标签和磁盘空间。
  • 先在测试端口启动,确认日志和数据正常,再切换正式流量。
  • 保留旧容器和旧数据,直到新环境稳定运行。

十八、最后提醒

最需要谨慎的四类命令:

docker rm -f $(docker ps -aq)
docker image prune -a
docker volume prune -f
docker system prune -a --volumes

前两类主要影响运行状态和镜像缓存,后两类可能直接删除持久化数据。执行任何清理命令前,先运行对应命令的查询模式,确认目标范围,并完成外部备份。

发表评论