Docker 参考手册


Docker 参考手册


一、核心概念详解

1. Image(镜像)

镜像是一个由多个只读层(layers)组成的联合文件系统快照,包含运行容器所需的文件系统内容和配置元数据(如环境变量、入口点、暴露端口等)。可以理解为软件的"安装包 + 环境说明书"。

⚠️ 注意:以下路径为 Docker 内部存储结构,切勿手动修改或删除。仅用于调试或理解原理。

bash 复制代码
/var/lib/docker/image/<storage-driver>/imagedb/content/sha256/<镜像ID>
/var/lib/docker/overlay2/  # 实际文件层(overlay2 驱动)

查看镜像分层

bash 复制代码
docker inspect nginx:latest | grep "RootFS"
# 输出示例:
"RootFS": {
  "Type": "layers",
  "Layers": [
    "sha256:6c7de...a017",  # 基础操作系统层
    "sha256:5c7de...b028",  # 软件安装层
    "sha256:8f9eg...c039"   # 配置层
  ]
}

核心特性

  • 分层结构:每层只读,基于前一层叠加
  • 层共享:多个镜像可共享相同基础层
  • 不可变性:镜像内容一旦创建不可更改

2. Inspect(检查)

docker inspect 是 Docker 的详细信息查询工具,可查看镜像或容器的所有底层配置。

⚠️ 注意:以下路径为 Docker 内部存储结构,切勿手动修改或删除

bash 复制代码
# 镜像元数据
/var/lib/docker/image/overlay2/imagedb/content/sha256/<镜像ID>

# 容器元数据
/var/lib/docker/containers/<容器ID>/config.v2.json

常用命令示例

bash 复制代码
# 查看镜像完整信息
docker inspect nginx:latest

# 提取特定字段(Go 模板语法)
docker inspect -f '{{.Config.ExposedPorts}}' nginx:latest
# 输出:map[80/tcp:{}]

# 查看容器 IP 地址
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <容器名>

# 查看挂载信息
docker inspect -f '{{.Mounts}}' <容器名>

Inspect 核心返回字段

字段 说明 示例值
Id 完整 SHA256 ID sha256:6c7de...a017
Config.Env 环境变量数组 ["PATH=/usr/bin", "NODE_ENV=production"]
Config.ExposedPorts 声明的端口 map[3000/tcp:{}]
RootFS.Layers 分层信息 sha256:xxxxx...
NetworkSettings.IPAddress 容器内网 IP 172.17.0.3

二、Dockerfile 完整指令集

1. 基础指令

dockerfile 复制代码
FROM node:18-alpine          # 指定基础镜像(必须是第一行)
LABEL maintainer="name@email.com"  # 维护者信息(替代已废弃的 MAINTAINER)
LABEL version="1.0"          # 添加元数据标签
WORKDIR /app                 # 设置工作目录

2. 文件操作指令

指令 功能 示例 ADD 与 COPY 区别
COPY 复制本地文件到镜像 COPY . . 仅支持本地文件,推荐首选
ADD 复制并自动解压 ADD app.tar.gz /app 支持 URL,自动解压 tar/zip

ADD 使用场景

dockerfile 复制代码
# 正确:自动解压 tar 文件
ADD https://example.com/app.tar.gz /app/
ADD dist.tar.gz /usr/share/nginx/html/

# 错误:用 ADD 复制普通文件
ADD package.json /app/   # 应使用 COPY

3. 配置与执行指令

dockerfile 复制代码
ENV NODE_ENV=production    # 设置环境变量
ARG VERSION=1.0           # 构建参数(可被 --build-arg 覆盖)

RUN npm install           # 构建时执行命令
CMD ["npm", "start"]      # 容器启动时执行(可被覆盖)
ENTRYPOINT ["node"]       # 容器入口命令(固定)
EXPOSE 3000               # 声明容器监听端口(不自动发布,主要用于文档和工具链识别)
USER appuser             # 切换用户(安全考虑)

三、文件系统映射总览

Docker 概念 宿主机存储位置 查看方式
Image 镜像 /var/lib/docker/image/overlay2/imagedb/content/sha256/<ID> docker inspect <镜像>
Container 容器 /var/lib/docker/containers/<容器ID>/config.v2.json docker inspect <容器>
Layer 层 /var/lib/docker/overlay2/<层ID>/ `docker inspect <镜像>
Volume 卷 /var/lib/docker/volumes/<卷名>/_data docker volume inspect <卷名>
Network 网络 /var/lib/docker/network/files/local-kv.db docker network inspect <网络名>
Dockerfile 指令 无对应文件,构建时临时执行 docker history <镜像>

四、Dockerfile 最佳实践

1. 分层优化

dockerfile 复制代码
# ❌ 错误:每层都增加体积
RUN apt-get update
RUN apt-get install -y python3
RUN apt-get install -y git

# ✅ 正确:合并命令并清理缓存
RUN apt-get update && apt-get install -y \
    python3 \
    git \
    && rm -rf /var/lib/apt/lists/*

2. .dockerignore 文件(必须添加)

bash 复制代码
# 与 Dockerfile 同级目录创建 .dockerignore
node_modules
npm-debug.log
.git
.gitignore
.env
Dockerfile
.dockerignore

作用 :避免无用文件进入镜像,减少镜像体积 80%

3. 多阶段构建

dockerfile 复制代码
# 阶段 1:构建
FROM node:18 AS builder
WORKDIR /app
COPY . .
RUN npm ci && npm run build

# 阶段 2:运行(仅保留编译产物)
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html

效果 :最终镜像仅保留运行必要文件,体积从 500MB 降至 20MB


五、命令速查表

1. 镜像管理

bash 复制代码
docker build -t app:v1 .              # 构建镜像
docker images                         # 列出镜像
docker tag app:v1 user/app:v1         # 打标签
docker push user/app:v1               # 推送
docker pull user/app:v1               # 拉取
docker rmi app:v1                     # 删除镜像

2. 容器管理

bash 复制代码
docker run -d -p 80:80 --name web nginx  # 运行容器
docker ps -a                          # 列出所有容器
docker exec -it web bash              # 进入容器
docker logs -f web                    # 查看日志
docker stop web                       # 停止容器
docker rm -f web                      # 强制删除容器
docker restart web                    # 重启容器

3. 数据与网络

bash 复制代码
docker volume create db-data          # 创建卷
docker run -v db-data:/data mysql     # 挂载卷
docker network create mynet           # 创建网络
docker run --network mynet app        # 指定网络

4. 系统与排错

bash 复制代码
docker inspect web                    # 查看详情
docker stats                          # 资源监控
docker system df                      # 磁盘占用
docker system prune                   # 清理停止的容器、无用网络、构建缓存
docker system prune -a                # 额外删除所有未被使用的镜像(谨慎!)

六、CI/CD 完整流程示例

GitLab CI 配置

yaml 复制代码
# .gitlab-ci.yml
stages:
  - build
  - test
  - push
  - deploy

variables:
  IMAGE: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA

build:
  script:
    - docker build -t $IMAGE .
    - docker tag $IMAGE $CI_REGISTRY_IMAGE:latest

test:
  script:
    - docker run --rm $IMAGE npm test

push:
  script:
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
    - docker push $IMAGE
    - docker push $CI_REGISTRY_IMAGE:latest

deploy:
  script:
    # ⚠️ 此为简化示例,生产环境应使用容器编排工具(如 Docker Compose、K8s)或部署脚本管理生命周期。
    - ssh user@server "docker pull $IMAGE && docker stop app && docker rm -f app && docker run -d --name app $IMAGE"

七、快速索引(按功能)

功能 命令
构建镜像 docker build -t <名>:<标签> .
运行容器 docker run -d -p <主机>:<容器> <镜像>
进入容器 docker exec -it <容器> bash
查看日志 docker logs -f <容器>
查看详情 docker inspect <容器/镜像>
删除容器 docker rm -f <容器>
删除镜像 docker rmi <镜像>
清理系统 docker system prune -a
推送镜像 docker push <仓库/镜像:标签>
拉取镜像 docker pull <仓库/镜像:标签>
相关推荐
绘梨衣5471 小时前
Docker+FastAPI+MySQL 项目部署报错汇总
mysql·docker·fastapi
百年੭ ᐕ)੭*⁾⁾4 小时前
docker使用neo4j
docker·容器·neo4j
春风有信6 小时前
【2026.05.01】Windows10安装Docker Desktop 4.71.0.0步骤及问题解决
运维·docker·容器
U盘失踪了7 小时前
python curl转python脚本
开发语言·chrome·python
sthnyph10 小时前
docker compose安装redis
redis·docker·容器
W.A委员会11 小时前
Docker基本使用流程
运维·docker·容器
晓晨的博客12 小时前
ROS1录制的bag包转换为ROS2格式
前端·chrome
gwjcloud12 小时前
Kubernetes从入门到精通(进阶篇)03
云原生·容器·kubernetes
GuokLiu12 小时前
260502-Clawith-Docker安装过程
运维·docker·容器·claw
JesseDev13 小时前
Docker lnmp环境快速搭建开箱即用
运维·docker·容器