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 <仓库/镜像:标签> |