Docker 常用命令速查
太阳作者太阳
原创内容采用 CC-4.0 协议发布,转载请注明出处
DockerDocker Compose部署运维

Docker 常用命令速查

以 Ubuntu 上的 Docker Engine 和 Compose v2 为主。Compose v2 使用 docker compose,不是旧的 docker-compose

安装

Ubuntu 官方仓库

删除可能冲突的软件包,此操作不会删除已有镜像、容器和卷:

sudo apt remove \
  $(dpkg --get-selections \
    docker.io docker-compose docker-compose-v2 docker-doc \
    podman-docker containerd runc |
    cut -f1)

添加 Docker 官方仓库:

sudo apt update
sudo apt install -y ca-certificates curl

sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
  -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

sudo tee /etc/apt/sources.list.d/docker.sources > /dev/null <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF

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

启动并验证:

sudo systemctl enable --now docker.service containerd.service
sudo docker run --rm hello-world
sudo docker compose version

免 sudo 使用

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

docker 组具有接近 root 的主机权限,不要随意添加用户。

更新与卸载

# 更新
sudo apt update
sudo apt install --only-upgrade docker-ce docker-ce-cli containerd.io \
  docker-buildx-plugin docker-compose-plugin

# 卸载软件包,不删除 /var/lib/docker 中的数据
sudo apt purge docker-ce docker-ce-cli containerd.io \
  docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras

基础信息

docker version
docker info
docker --help
docker system df
docker system df -v

镜像

docker search IMAGE
docker pull IMAGE:TAG
docker image ls
docker image inspect IMAGE
docker image history IMAGE

docker build -t IMAGE:TAG .
docker build --pull --no-cache -t IMAGE:TAG .

docker tag IMAGE:TAG REGISTRY/OWNER/IMAGE:TAG
docker push REGISTRY/OWNER/IMAGE:TAG
docker image rm IMAGE

登录镜像仓库:

printf '%s' "$REGISTRY_TOKEN" |
  docker login REGISTRY --username OWNER --password-stdin

docker logout REGISTRY

容器

创建与查看

docker run -d \
  --name CONTAINER \
  --restart unless-stopped \
  -p HOST_PORT:CONTAINER_PORT \
  IMAGE:TAG

docker ps
docker ps -a
docker inspect CONTAINER
docker top CONTAINER
docker port CONTAINER

日志与终端

docker logs --tail 200 CONTAINER
docker logs -f --since 10m CONTAINER

docker exec -it CONTAINER sh
docker exec -u 0 -it CONTAINER sh

docker cp ./FILE CONTAINER:/PATH/FILE
docker cp CONTAINER:/PATH/FILE ./

启停与删除

docker stop CONTAINER
docker start CONTAINER
docker restart CONTAINER
docker kill CONTAINER

docker rm CONTAINER
docker rm -f CONTAINER

网络与数据卷

# 网络
docker network ls
docker network create NETWORK
docker network inspect NETWORK
docker network rm NETWORK

# 数据卷
docker volume ls
docker volume create VOLUME
docker volume inspect VOLUME
docker volume rm VOLUME

挂载命名卷:

docker run -d \
  --name CONTAINER \
  --mount type=volume,src=VOLUME,dst=/DATA_PATH \
  IMAGE:TAG

Docker Compose

检查与启动

docker compose config
docker compose config --quiet
docker compose config --services

docker compose pull
docker compose up -d
docker compose up -d --build
docker compose up -d --force-recreate
docker compose up -d --no-deps SERVICE

指定配置文件和项目名:

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

查看与执行

docker compose ls
docker compose ps
docker compose images
docker compose top
docker compose stats

docker compose logs --tail 200
docker compose logs -f SERVICE

docker compose exec SERVICE sh
docker compose run --rm SERVICE COMMAND

启停与删除

docker compose stop
docker compose start
docker compose restart

# 删除容器和默认网络,保留命名卷
docker compose down

# 同时删除孤立容器
docker compose down --remove-orphans

# 同时删除项目卷,可能丢失业务数据
docker compose down --volumes

清理

先查看占用:

docker system df -v
docker ps -a --size
docker buildx du

按类型清理:

docker container prune
docker image prune
docker image prune -a
docker network prune
docker volume prune
docker builder prune
docker buildx prune

整体清理:

# 不清理卷
docker system prune
docker system prune -a

# 同时清理未使用的卷,执行前确认数据
docker system prune -a --volumes

# 只处理一周以前的对象
docker system prune --filter "until=168h"

prune 只判断对象是否仍被引用,不判断数据是否还有用。清理卷前先运行 docker volume inspect VOLUME

监控与日志

# CPU、内存、网络和磁盘 I/O
docker stats
docker stats --no-stream
docker compose stats

# daemon 事件
docker system events

# 健康状态与重启次数
docker inspect --format '{{.State.Health.Status}}' CONTAINER
docker inspect --format '{{.RestartCount}}' CONTAINER

# Docker 服务日志
sudo systemctl status docker --no-pager
sudo journalctl -u docker --since "30 minutes ago"
sudo journalctl -u docker -f

docker stats 适合临时排查。长期监控可以接入 Prometheus、cAdvisor 和 Grafana。

限制容器日志占用

/etc/docker/daemon.json 中使用自动轮转的 local 日志驱动:

{
  "log-driver": "local"
}
sudo dockerd --validate --config-file=/etc/docker/daemon.json
sudo systemctl restart docker

此配置只影响之后新建的容器。文件已有其他配置时需要合并,不要直接覆盖。

代理

daemon 代理用于拉取镜像;~/.docker/config.json 中的代理用于构建过程和新建容器。两者不是同一项配置。

Docker daemon 代理

Docker Engine 23.0 及以上可在 /etc/docker/daemon.json 中配置:

{
  "proxies": {
    "http-proxy": "http://PROXY_HOST:PORT",
    "https-proxy": "http://PROXY_HOST:PORT",
    "no-proxy": "localhost,127.0.0.1,.example.internal"
  }
}
sudo dockerd --validate --config-file=/etc/docker/daemon.json
sudo systemctl restart docker

systemd 方式适用于旧版本。在 /etc/systemd/system/docker.service.d/http-proxy.conf 中写入:

[Service]
Environment="HTTP_PROXY=http://PROXY_HOST:PORT"
Environment="HTTPS_PROXY=http://PROXY_HOST:PORT"
Environment="NO_PROXY=localhost,127.0.0.1,.example.internal"
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo systemctl show --property=Environment docker

构建和容器代理

~/.docker/config.json

{
  "proxies": {
    "default": {
      "httpProxy": "http://PROXY_HOST:PORT",
      "httpsProxy": "http://PROXY_HOST:PORT",
      "noProxy": "localhost,127.0.0.1,.example.internal"
    }
  }
}

临时指定:

docker build --build-arg HTTP_PROXY="http://PROXY_HOST:PORT" .
docker run --rm --env HTTP_PROXY="http://PROXY_HOST:PORT" IMAGE

不要在 Dockerfile 中用 ENV 固化代理。容器内的 127.0.0.1 指向容器自己,不是宿主机。

排查入口

docker ps -a
docker logs --tail 200 CONTAINER
docker inspect --format \
  '{{.State.Status}} {{.State.ExitCode}} {{.State.Error}}' \
  CONTAINER

docker compose config --quiet
docker compose ps -a
docker compose logs --tail 200 SERVICE

docker info
sudo journalctl -u docker -n 200 --no-pager