Docker 参考手册


Docker 参考手册


一、核心概念详解

1. Image(镜像)

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

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

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

查看镜像分层

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 内部存储结构,切勿手动修改或删除

# 镜像元数据
/var/lib/docker/image/overlay2/imagedb/content/sha256/<镜像ID>

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

常用命令示例

# 查看镜像完整信息
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 IDsha256:6c7de...a017
Config.Env环境变量数组["PATH=/usr/bin", "NODE_ENV=production"]
Config.ExposedPorts声明的端口map[3000/tcp:{}]
RootFS.Layers分层信息sha256:xxxxx...
NetworkSettings.IPAddress容器内网 IP172.17.0.3

二、Dockerfile 完整指令集

1. 基础指令

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 使用场景

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

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

3. 配置与执行指令

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.jsondocker inspect <容器>
Layer 层/var/lib/docker/overlay2/<层ID>/docker inspect <镜像> | grep Layers
Volume 卷/var/lib/docker/volumes/<卷名>/_datadocker volume inspect <卷名>
Network 网络/var/lib/docker/network/files/local-kv.dbdocker network inspect <网络名>
Dockerfile 指令无对应文件,构建时临时执行docker history <镜像>

四、Dockerfile 最佳实践

1. 分层优化

# ❌ 错误:每层都增加体积
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 文件(必须添加)

# 与 Dockerfile 同级目录创建 .dockerignore
node_modules
npm-debug.log
.git
.gitignore
.env
Dockerfile
.dockerignore

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

3. 多阶段构建

# 阶段 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. 镜像管理

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. 容器管理

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. 数据与网络

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

4. 系统与排错

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

六、CI/CD 完整流程示例

GitLab CI 配置

# .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 <仓库/镜像:标签>
<think>嗯,用户想要了解Docker运维手册,可能需要一些基本的信息,或者是更深入的运维技巧。首先,我应该先确定Docker运维手册通常包含哪些内容。比如安装配置、日常操作、镜像管理、网络存储、监控日志、安全性和常见问题这些方面。 用户可能是一个刚开始接触Docker的运维人员,或者是需要优化现有流程的开发者。他们可能希望有一个结构化的指南,帮助他们高效地管理Docker环境。所以,手册的结构要清晰,分章节介绍各个部分,这样用户查找起来方便。 接下来要考虑用户的潜在需求。比如,他们可能不仅需要基础操作,还关心安全性设置,或者如何监控容器性能。这时候需要涵盖安全最佳实践,比如非root用户运行,镜像漏洞扫描,以及使用监控工具如Prometheus和Grafana。 另外,用户可能遇到常见问题,比如容器启动失败或网络问题,所以手册中应该包含故障排除的步骤和解决方法。提供示例命令会更有帮助,比如docker logs查看日志,docker inspect检查容器配置。 还要考虑不同层次的用户。有些可能已经熟悉基础,需要高级内容,比如多主机网络配置或CI/CD集成。而新手则需要从安装和基本命令开始。因此手册应该兼顾基础和进阶内容,结构上由浅入深。 可能还需要包括资源链接,如官方文档和社区支持,方便用户进一步学习。同时,强调备份和恢复策略,这对生产环境尤为重要,用户可能会忽略这一点,但数据丢失的风险很高。 最后,整理内容时要使用简洁明了的语言,避免术语过多,必要时给出命令示例。确保每个部分都有明确的标题,方便快速查阅。这样用户在使用手册时能高效找到所需信息,提升他们的运维效率。以下</think>是一份 **Docker 运维手册**的简要介绍,涵盖 Docker 的日常运维关键点,适合开发、测试及生产环境的管理参考: --- ### **1. Docker 安装与配置** -fsSL https://get.docker.com | bash -s docker ``` - 国内镜像加速(阿里云、腾讯云等): 修改 `/etc/docker/daemon.json`,添加镜像仓库地址: ```json { "registry-mirrors": ["https://<your-mirror>.mirror.aliyuncs.com"] } ``` - **权限管理** - 将用户加入 `docker` 组(避免频繁使用 `sudo`): ```bash sudo usermod -aG docker $USER ``` --- ### **2. 容器生命周期管理** - **常用命令** ```bash # 启动/停止容器 docker start/stop <container_name> # 查看运行中的容器 docker ps # 查看所有容器(包括已停止的) docker ps -a # 删除容器 docker rm <container_name> # 强制删除(运行中的容器docker rm -f <container_name> ``` - **自动重启策略** 通过 `--restart` 参数设置容器崩溃或宿主机重启后的行为: ```bash docker run --restart=always <image_name> ``` --- ### **3. 镜像管理** - **拉取与推送** ```bash docker pull <image:tag> docker push <your-registry/image:tag> ``` - **清理无用镜像** ```bash # 删除所有悬空镜像(未被任何容器引用的中间层镜像) docker image prune # 删除未被使用的镜像 docker image prune -a ``` - **构建镜像最佳实践** - 使用多阶段构建(减少最终镜像体积)。 - 避免在 Dockerfile 中存储敏感信息(如密码、密钥)。 --- ### **4. 数据持久化与卷管理** - **绑定挂载(Bind Mount)** ```bash docker run -v /宿主机路径:/容器路径 <image_name> ``` - **Volume 卷管理** ```bash # 创建卷 docker volume create <volume_name> # 查看卷列表 docker volume ls # 清理未使用的卷 docker volume prune ``` --- ### **5. 网络配置** - **自定义网络** ```bash # 创建自定义网络 docker network create --driver bridge my_network # 将容器接入指定网络 docker run --network=my_network <image_name> ``` - **端口映射** ```bash docker run -p 8080:80 <image_name> # 宿主机8080映射容器80端口 ``` --- ### **6. 日志与监控** - **查看容器日志** ```bash docker logs <container_name> # 实时追踪日志 docker logs -f <container_name> ``` - **资源监控** - 使用 `docker stats` 查看实时资源占用: ```bash docker stats ``` - 集成 Prometheus + Grafana 监控 Docker 集群。 --- ### **7. 安全最佳实践** 1. **容器以非 root 用户运行** 在 Dockerfile 中指定用户: ```Dockerfile RUN useradd -R appuser /app USER appuser ``` 2. **定期扫描镜像漏洞** 使用工具如 `Trivy` 或 `Docker Scout`: ```bash trivy image <your-image:tag> ``` 3. **限制容器资源** ```bash docker run --memory=512m --cpus=1 <image_name> ``` --- ### **8. 常见问题排查** - **容器启动失败** - 查看日志:`docker logs <container_name>` - 检查配置:`docker inspect <container_name>` - **网络不通** - 验证防火墙规则(iptables/ufw)。 - 检查容器是否在同一网络中。 --- ### **9. 备份与恢复** - **容器快照** 通过 `commit` 生成临时镜像(慎用,推荐使用 Dockerfile 重建): ```bash docker commit <container_id> backup-image:latest ``` - **卷备份** 将 Volume 数据打包并存储: ```bash docker run --rm -v <volume_name>:/data -v $(pwd):/backup alpine tar czf /backup/volume_backup.tar.gz /data ``` --- ### **10. 进阶工具链** - **编排工具**:Docker Compose(单机)、Kubernetes(集群)。 - **CI/CD 集成**:结合 Jenkins/GitLab CI 实现自动化构建与部署。 --- **推荐资源**: - 官方文档:[https://docs.docker.com](https://docs.docker.com) - 社区支持:Docker Forum、Stack Overflow 通过以上手册,可以系统化管理 Docker 环境,提升运维效率与稳定性。根据实际需求,可进一步扩展具体场景的详细操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pumpkin84514

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值