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 <仓库/镜像:标签>
相关推荐
私人珍藏库2 小时前
[Windows] Chrome_Win64_v142.0.7444.163 便携版
前端·chrome
三天不学习3 小时前
GitLab Docker 安装完整配置项说明
docker·容器·gitlab
victory04315 小时前
K8S节点GPU插件plugin检测GPU排查问题办法
云原生·容器·kubernetes
究極の法則に通じた野犬5 小时前
K8S定位POD启动失败问题- status Unknown
云原生·容器·kubernetes
HappRobot6 小时前
WebLogic服务器的JVM参数调整
服务器·jvm·chrome
北冥有鱼被烹6 小时前
【微知】Ubuntu中如何安装docker?
ubuntu·docker
mr_orange_klj9 小时前
K8S多环境配置的AI问答
云原生·容器·kubernetes
幻灭行度9 小时前
docker镜像导入到K8S的containerd中
java·docker·kubernetes
虎头金猫9 小时前
随时随地处理图片文档!Reubah 加cpolar的实用体验
linux·运维·人工智能·python·docker·开源·visual studio