Docker-操作手册
2026年10月16日·Admin·2 次浏览
Docker:操作手册
面向本机 / Linux 服务器日常运维:安装与配置、镜像与容器、数据卷、网络、Compose、排查与清理。服务级部署见同目录各 Docker-*.md。
相关笔记: [[Docker-镜像加速]] · [[Docker-重启策略]] · [[Docker-Windows-exec-TTY]] · 配置样本见
附件/Docker配置/
1. 概念速览
| 概念 | 说明 |
|---|---|
| 镜像 Image | 只读模板(层叠文件系统),用 仓库:标签 标识,如 nginx:1.27 |
| 容器 Container | 镜像的运行实例;可启停、删;默认与宿主机隔离 |
| 仓库 Registry | 存镜像的地方(Docker Hub、私有仓库、国内镜像站) |
| 数据卷 Volume | Docker 管理的持久化存储,生命周期可独立于容器 |
| 绑定挂载 Bind | 把宿主机目录/文件直接挂进容器 |
| 网络 Network | 容器互通与端口映射的基础;Compose 常自动建网 |
常用关系:镜像 → run/create → 容器;数据用 卷 / 绑定挂载 持久化;多服务用 Compose。
2. 安装与守护进程
2.1 确认已安装
docker version # Client / Server 都有输出才算可用
docker info # 存储驱动、镜像源、运行中容器数等
systemctl status docker # systemd 发行版
2.2 当前用户免 sudo(可选)
sudo usermod -aG docker "$USER"
# 重新登录后生效;临时:newgrp docker
2.3 开机自启
sudo systemctl enable --now docker
2.4 常用 daemon 配置
配置文件:/etc/docker/daemon.json(改完需重启 Docker)。
sudo systemctl daemon-reload
sudo systemctl restart docker
常见项:
| 配置 | 作用 |
|---|---|
registry-mirrors |
拉取加速,见 [[Docker-镜像加速]] |
log-driver / log-opts |
限制日志体积,避免打满磁盘 |
data-root |
改 Docker 数据根目录(迁移磁盘时) |
日志体积示例:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "50m",
"max-file": "3"
}
}
3. 镜像操作
3.1 拉取 / 查看 / 删除
docker pull nginx:latest
docker images # 或 docker image ls
docker image inspect nginx
docker rmi nginx:latest # 有容器在用会失败,先停删容器
docker image prune # 删悬空镜像(无标签)
docker image prune -a # 删所有未被容器引用的镜像(慎用)
3.2 标签与导出导入
docker tag nginx:latest myreg.example/nginx:1.27
docker save -o nginx.tar nginx:latest
docker load -i nginx.tar
docker export <容器> -o rootfs.tar # 导出容器文件系统(不是完整镜像层)
docker import rootfs.tar myimg:v1
3.3 构建本地镜像
docker build -t myapp:1.0 .
docker build -t myapp:1.0 -f Dockerfile.prod .
# BuildKit(推荐)
DOCKER_BUILDKIT=1 docker build -t myapp:1.0 .
.dockerignore 可排除 node_modules、.git 等,加快构建、减小上下文。
4. 容器生命周期
4.1 运行
# 前台(Ctrl+C 停)
docker run --rm -it ubuntu:22.04 bash
# 后台守护
docker run -d --name web --restart=unless-stopped -p 8080:80 nginx
# 常用参数
# -d 后台
# --name 容器名
# -p 宿主:容器 端口映射(可多次)
# -e KEY=val 环境变量
# -v /宿:/容 绑定挂载
# --mount 更明确的挂载语法(见第 5 节)
# --network 指定网络
# --restart 见 [[Docker-重启策略]]
# --rm 退出后自动删除容器
# -it 交互 + TTY(进 shell 必备)
# --user 指定 uid:gid
# --memory --cpus 资源限制
4.2 启停与删除
docker ps # 运行中
docker ps -a # 含已停止
docker start|stop|restart web
docker stop -t 20 web # 优雅停止等待秒数
docker kill web # 强杀(SIGKILL)
docker rm web # 删已停止容器
docker rm -f web # 强制停并删
docker rename web web-old
4.3 创建但不启动
docker create --name web -p 8080:80 nginx
docker start web
适合先写好参数、稍后再启(本库部分服务笔记也用此模式)。
4.4 进容器与拷文件
docker exec -it web sh # 或 bash(镜像里有哪个用哪个)
docker exec web nginx -t # 非交互执行一条命令
docker cp ./conf.d web:/etc/nginx/conf.d
docker cp web:/var/log/nginx/access.log ./
Windows 宿主机上 exec / TTY 注意点见 [[Docker-Windows-exec-TTY]]。
4.5 改已有容器(有限)
多数创建参数(端口、挂载、环境变量)不能事后改,需重建。可改的例如:
docker update --restart=unless-stopped web
docker update --memory 512m --cpus 1.0 web
5. 数据持久化
容器可写层默认会随 docker rm 丢失(未用卷时)。生产数据务必挂载。
5.1 绑定挂载 vs 命名卷
| 方式 | 示例 | 特点 |
|---|---|---|
| 绑定挂载 | -v /data/mysql:/var/lib/mysql |
路径固定、好备份;权限/ SELinux 需注意 |
| 命名卷 | -v mysql_data:/var/lib/mysql |
Docker 管理路径;迁移方便、跨容器共享清晰 |
docker volume ls
docker volume create mysql_data
docker volume inspect mysql_data
docker volume rm mysql_data # 无容器使用时
docker volume prune # 删未使用卷(慎用)
5.2 --mount 写法(推荐写进脚本时更清晰)
docker run -d --name web \
--mount type=bind,source=/opt/nginx/html,target=/usr/share/nginx/html,readonly \
--mount type=volume,source=nginx_logs,target=/var/log/nginx \
nginx
5.3 权限提示
- LinuxServer 等镜像常用
PUID/PGID对齐宿主机用户。 - 绑定目录权限不对时,容器内会出现 Permission denied;先
ls -ln看 uid/gid。 - 只读配置可加
:ro,防止容器改坏宿主机文件。
6. 网络
6.1 端口映射
-p 8080:80 # 宿主 8080 → 容器 80(TCP)
-p 127.0.0.1:8080:80 # 仅本机访问
-p 6881:6881/udp # UDP
查看实际映射:
docker port web
ss -lntp | grep 8080 # 宿主机侧
6.2 网络模式(简表)
| 模式 | 说明 |
|---|---|
bridge(默认) |
虚拟网桥;容器间靠 IP/容器名(自定义网络下)互通 |
host |
共用宿主机网络栈;无 -p,性能好但隔离弱 |
none |
无网 |
| 自定义 bridge | Compose / docker network create 常用;支持 DNS 容器名解析 |
docker network ls
docker network create appnet
docker network connect appnet web
docker network disconnect appnet web
docker network inspect appnet
两容器要互访:挂到同一自定义网络,用容器名当主机名(比默认 bridge + link 更清晰)。
6.3 看容器 IP
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' web
7. 日志与排障
7.1 日志
docker logs web
docker logs -f --tail 200 web
docker logs --since 30m web
docker logs --until 2026-08-01T12:00:00 web
日志占满磁盘:配 daemon.json 的 log-opts,或清理:
truncate -s 0 $(docker inspect --format='{{.LogPath}}' web)
7.2 状态与事件
docker stats # CPU / 内存实时
docker top web
docker events --since 1h
docker inspect web | less
7.3 常见故障对照
| 现象 | 排查方向 |
|---|---|
| 端口占用 / 起不来 | docker logs;ss -lntp;-p 是否冲突 |
| 拉镜像超时 | 镜像加速 [[Docker-镜像加速]];DNS;代理 |
| 容器秒退 | docker ps -a 看 EXIT;docker logs;入口命令是否错误 |
| 权限拒绝 | 挂载目录 uid/gid;:ro 是否误用;AppArmor/SELinux |
| 磁盘暴涨 | docker system df;未清镜像/卷/日志 |
| 改配置不生效 | 多数需重建容器;确认挂载路径是否打对 |
健康检查(镜像或 Compose 可配):
docker inspect --format='{{.State.Health.Status}}' web
8. Docker Compose
适合多容器、长期配置(推荐把 compose.yml 放在项目目录;本库样本在 附件/Docker配置/)。
8.1 基本命令(Compose V2 插件)
docker compose up -d # 创建并后台启动
docker compose up -d --build # 先构建再启动
docker compose ps
docker compose logs -f web
docker compose exec web sh
docker compose stop
docker compose down # 停并删容器、默认网络(默认不删命名卷)
docker compose down -v # 连同匿名/声明卷一起删(危险)
docker compose pull
docker compose restart web
指定文件:
docker compose -f docker-compose.yaml -f override.yaml up -d
8.2 最小示例
services:
web:
image: nginx:1.27
container_name: web
restart: unless-stopped
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html:ro
environment:
TZ: Asia/Shanghai
要点:
- 同一 compose 项目内服务名可作 DNS 主机名。
restart策略建议优先unless-stopped,见 [[Docker-重启策略]]。- 密钥用
.env(勿提交 Git)或外部密钥管理,不要写进镜像。
9. 资源限制与安全(常用)
docker run -d --name web \
--memory=512m --memory-swap=512m \
--cpus=1.0 \
--pids-limit=200 \
--read-only \
--security-opt no-new-privileges:true \
nginx
| 建议 | 说明 |
|---|---|
少用 --privileged |
权限过大,仅调试临时用 |
少用 host 网络 |
除非确实需要 |
| 根目录挂载要克制 | 避免 -v /:/host 一类 |
| 仅暴露必要端口 | 管理口绑 127.0.0.1 或走反向代理 + 认证 |
10. 清理与磁盘
docker system df # 空间占用总览
docker container prune # 删已停止容器
docker image prune -a # 删未用镜像
docker volume prune # 删未用卷
docker network prune
docker builder prune # 构建缓存
docker system prune -a # 较猛:未用容器/网络/镜像等
docker system prune -a --volumes # 含未用卷(数据会丢,确认后再用)
清理前先 docker ps -a、docker volume ls 确认没有要留的数据。
11. 日常运维速查
# 总览
docker ps -a && docker images && docker volume ls && docker network ls
# 进容器排障
docker logs -f --tail 100 <名>
docker exec -it <名> sh
# 重建(改端口/挂载/环境后的标准做法)
docker stop <名> && docker rm <名>
docker run ... # 或 compose up -d
# 备份命名卷(示例:停服后打包)
docker run --rm -v mysql_data:/data -v "$(pwd)":/backup alpine \
tar czf /backup/mysql_data.tgz -C /data .
12. 与本库其它笔记
| 笔记 | 内容 |
|---|---|
| [[Docker-镜像加速]] | daemon.json 镜像源 |
| [[Docker-重启策略]] | always / unless-stopped 等 |
| [[Docker-Nginx]] | 反向代理与站点挂载 |
| [[Docker-MySQL]] · [[Docker-Redis]] | 数据库类容器要点 |
其它 Docker-*.md |
具体应用一键部署备忘 |
附录:命令分组备忘
镜像 pull / images / rmi / build / tag / save / load
容器 run / create / start / stop / rm / exec / cp / logs / update
卷 volume create / ls / inspect / rm / prune
网络 network create / connect / ls / inspect
系统 info / system df / system prune / events / stats
编排 compose up / down / logs / exec / ps / pull