这篇以命令示例为主,说明尽量简短。命令默认在 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
前两类主要影响运行状态和镜像缓存,后两类可能直接删除持久化数据。执行任何清理命令前,先运行对应命令的查询模式,确认目标范围,并完成外部备份。