白狗子的博客

「天上浮云如白衣,斯须改变如苍狗。」——杜甫

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

© 2025 My Blog. Built with Nuxt.js v4