Docker 容器化技术标准操作指南
目的
Docker 是一款基于 Go 语言的开源容器化技术,实现了“一次镜像,处处运行”的愿景。本指南旨在帮助读者系统掌握 Docker 的核心原理、常用命令、镜像构建(Dockerfile)及镜像仓库管理,实现应用的全生命周期容器化管理。
核心思路
- 理解原理再动手—— 掌握 Namespace、Cgroups、UnionFS 三大基石,才能更好地理解容器行为。
- 镜像分层,缓存复用—— Dockerfile 的每条指令生成一个只读层,合理编排指令顺序可最大化利用构建缓存。
- 一次构建,到处运行—— 镜像标准化确保开发、测试、生产环境一致性。
- 安全与效率并重—— 选择最小基础镜像、使用多阶段构建、定期更新镜像。
一、Docker 原理与架构
1.1 什么是容器化
容器化是操作系统级虚拟化的实现方式,通过内核命名空间(Namespace)和控制组(Cgroup)技术,将应用及其依赖环境封装为独立进程。
容器 vs 虚拟机:
| 对比维度 | 容器 | 虚拟机 |
|---|---|---|
| 启动速度 | 秒级 | 分钟级 |
| 镜像大小 | MB 级 | GB 级 |
| 资源开销 | 低(共享内核) | 高(完整 OS) |
| 隔离级别 | 进程级隔离 | 硬件级隔离 |
容器共享主机系统的内核,每个隔离的工作负载都不需要整个操作系统实例,因此资源效率更高。
1.2 Docker 核心架构
Docker 采用C/S(客户端-服务器)架构:
┌─────────────────┐ ┌─────────────────────────────────────┐ │ Docker Client │ ───► │ Docker Daemon │ │ (docker CLI) │ │ (后台守护进程,处理构建/运行/分发) │ └─────────────────┘ └─────────────────────────────────────┘ │ ▼ ┌─────────────────────┐ │ Images Registry │ │ (Docker Hub / 私有) │ └─────────────────────┘- Docker Daemon:后台服务进程,负责镜像构建、容器管理和网络配置。
- Docker Client:命令行工具,通过 REST API 与守护进程通信。
- Images Registry:镜像仓库,存储和分发镜像。
1.3 三大底层核心技术
Docker 底层的核心技术包括Linux 命名空间(Namespaces)、控制组(Cgroups)和 Union 文件系统(UnionFS)。
1.3.1 Namespace(命名空间)—— 实现隔离
命名空间保证容器之间彼此互不影响,每个容器都有自己独立的命名空间:
| 命名空间类型 | 作用 |
|---|---|
| pid | 隔离进程 ID,不同命名空间可有相同 PID |
| net | 隔离网络设备、IP 地址、路由表 |
| ipc | 隔离进程间通信资源(信号量、消息队列等) |
| mnt | 隔离文件系统挂载点,类似 chroot |
| uts | 隔离主机名和域名 |
| user | 隔离用户和组 ID |
1.3.2 Cgroups(控制组)—— 实现资源限制
Cgroups 用于限制和分配容器的资源使用(CPU、内存、磁盘 IO 等),防止某个容器耗尽宿主机资源。
1.3.3 UnionFS(联合文件系统)—— 实现分层存储
镜像采用分层存储设计,每条指令(如RUN、COPY)生成一个只读层,最终通过 UnionFS 组合成完整文件系统。这种设计使得:
- 多个镜像可共享相同的基础层,节省磁盘空间
- 构建时可复用未变更的缓存层,加速构建
二、Docker 安装
2.1 通过官方脚本安装(推荐)
curl-fsSLhttps://get.docker.com|shsudosystemctlenabledockersudosystemctl startdocker2.2 验证安装
docker--versiondockerinfo三、Docker 常用命令
Docker 命令虽多,但日常高频使用的只有十几条。以下按功能场景分类整理。
3.1 镜像管理(Images)
| 命令 | 说明 | 示例 |
|---|---|---|
docker images/docker image ls | 查看本地镜像列表 | docker images |
docker pull <镜像名>[:标签] | 从仓库拉取镜像 | docker pull nginx:1.25 |
docker build -t <镜像名>:<标签> <路径> | 构建镜像 | docker build -t myapp:v1 . |
docker rmi <镜像ID或名称> | 删除镜像 | docker rmi nginx:1.25 |
docker tag <源镜像> <目标镜像> | 给镜像打标签 | docker tag myapp:v1 myregistry/myapp:v1 |
3.2 容器生命周期(Container)
| 命令 | 说明 | 示例 |
|---|---|---|
docker run [选项] <镜像> | 创建并启动容器 | docker run -d -p 8080:80 --name web nginx |
docker ps | 查看运行中的容器 | docker ps -a(含已停止) |
docker stop <容器> | 停止容器 | docker stop web |
docker start <容器> | 启动已停止的容器 | docker start web |
docker restart <容器> | 重启容器 | docker restart web |
docker rm <容器> | 删除容器 | docker rm -f web(强制删除) |
docker logs <容器> | 查看容器日志 | docker logs -f --tail 200 web |
docker exec -it <容器> <命令> | 进入容器内部 | docker exec -it web /bin/bash |
docker inspect <容器> | 查看容器详细信息 | docker inspect web |
docker cp <源> <目标> | 宿主机与容器间拷贝文件 | docker cp test.txt web:/app/ |
docker run常用参数详解:
| 参数 | 说明 |
|---|---|
-d | 后台运行(Detached),否则日志会霸占终端 |
-p 宿主机端口:容器端口 | 端口映射,如-p 8080:80 |
-v 宿主机路径:容器路径 | 挂载数据卷,防止容器删除后数据丢失 |
--name <容器名> | 给容器起名,便于管理 |
--restart=always | 容器退出后自动重启 |
-e KEY=value | 设置环境变量 |
--network=<网络> | 指定容器网络模式 |
3.3 网络管理(Network)
| 命令 | 说明 |
|---|---|
docker network ls | 列出所有网络 |
docker network create <网络名> | 创建自定义网络 |
docker network connect <网络> <容器> | 将容器连接到网络 |
docker network disconnect <网络> <容器> | 将容器从网络断开 |
3.4 数据卷管理(Volume)
| 命令 | 说明 |
|---|---|
docker volume ls | 列出所有卷 |
docker volume create <卷名> | 创建卷 |
docker volume rm <卷名> | 删除卷 |
3.5 清理维护(Cleanup)
# 一键清理所有未使用的资源(容器、网络、镜像、构建缓存)dockersystem prune# 只清理悬空镜像(<none> 标签的镜像)dockerimage prune# 查看 Docker 磁盘使用情况dockersystemdf四、Dockerfile 镜像构建
Dockerfile 是一个文本文件,包含用户在命令行中构建镜像时可能调用的所有命令。
4.1 Dockerfile 核心指令
Dockerfile 支持以下核心指令:
| 指令 | 说明 | 示例 |
|---|---|---|
FROM | 必须,指定基础镜像 | FROM ubuntu:22.04 |
RUN | 执行构建命令并生成新层 | RUN apt-get update && apt-get install -y nginx |
COPY | 复制文件/目录到镜像(仅本地) | COPY . /app |
ADD | 类似 COPY,支持 URL 和 tar 自动解压 | ADD app.tar.gz /app/ |
ENV | 设置环境变量(运行时持久存在) | ENV NODE_ENV=production |
ARG | 定义构建时变量(仅构建阶段有效) | ARG VERSION=1.0 |
WORKDIR | 设置工作目录 | WORKDIR /app |
EXPOSE | 声明容器监听端口(文档说明) | EXPOSE 80 |
CMD | 指定容器启动默认命令(可被覆盖) | CMD ["nginx", "-g", "daemon off;"] |
ENTRYPOINT | 指定容器启动固定入口(不可被覆盖) | ENTRYPOINT ["nginx"] |
VOLUME | 创建挂载点 | VOLUME /data |
USER | 设置运行用户 | USER nginx |
LABEL | 添加元数据 | LABEL maintainer="dev@example.com" |
HEALTHCHECK | 检查容器健康状态 | `HEALTHCHECK CMD curl -f http://localhost/ |
4.2 指令执行顺序与缓存机制
Docker 按顺序执行 Dockerfile 中的指令。每条指令生成一个独立的镜像层,Docker 会检查指令是否与缓存匹配,若指令或依赖文件未变更,则复用缓存层。
缓存失效的关键规则:COPY或ADD后的文件变更会导致后续所有指令的缓存失效。
优化策略:将高频变更的指令(如代码复制)放在 Dockerfile末尾,减少缓存重建范围。
4.3 实战示例:构建一个 Nginx 应用镜像
# 1. 指定基础镜像 FROM nginx:1.25-alpine # 2. 设置维护者标签 LABEL maintainer="dev@example.com" # 3. 设置工作目录 WORKDIR /usr/share/nginx/html # 4. 复制静态文件(放在后面,利用缓存) COPY ./html /usr/share/nginx/html # 5. 复制自定义配置 COPY nginx.conf /etc/nginx/nginx.conf # 6. 声明端口 EXPOSE 80 # 7. 启动命令(使用默认 CMD) CMD ["nginx", "-g", "daemon off;"]构建命令:
dockerbuild-tmy-nginx:v1.4.4 ARG 与 ENV 的深度解析
ARG和ENV是 Dockerfile 中最容易混淆的两个指令,它们在作用阶段和生命周期上有本质区别。
| 特性 | ARG | ENV |
|---|---|---|
| 作用阶段 | 仅构建时(docker build) | 构建时 + 运行时 |
| 是否持久化到镜像 | 否(除非显式传递) | 是 |
| 能否被覆盖 | 可通过--build-arg覆盖 | 可通过docker run -e覆盖 |
| 典型用途 | 指定版本号、编译选项等构建参数 | 配置应用运行环境 |
ARG 使用示例
# 定义构建参数(可设置默认值) ARG NODE_VERSION="20" ARG ALPINE_VERSION="3.21" # 在 FROM 中使用构建参数 FROM node:${NODE_VERSION}-alpine${ALPINE_VERSION} AS base WORKDIR /src COPY package*.json ./ RUN npm ci构建时传参:
dockerbuild --build-argNODE_VERSION=22--build-argALPINE_VERSION=3.19-tmyapp:v1.ENV 使用示例
# 设置运行时环境变量(持久存在于镜像中) ENV NODE_ENV=production \ PORT=3000 CMD ["node", "app.js"]运行时覆盖:
dockerrun-eNODE_ENV=development-ePORT=8080myapp:v1ARG 与 ENV 的协作模式
常通过ARG接收外部输入,再赋值给ENV,实现灵活且持久的配置管理:
ARG DB_HOST=localhost ARG DB_PORT=5432 ENV DATABASE_URL=postgresql://$DB_HOST:$DB_PORT/mydb⚠️ 安全警告:构建参数和环境变量不适合传递密码等敏感信息,因为它们会在镜像元数据中暴露。应使用 Docker 的secret 挂载或SSH 挂载功能。
4.5 多阶段构建(Multi-stage Builds)
多阶段构建通过多个FROM指令将构建过程拆分为多个阶段,最终仅复制所需文件到最终镜像,显著减小镜像体积。
# ========== 第一阶段:构建阶段 ========== FROM golang:1.21 AS builder WORKDIR /app COPY . . RUN go build -o myapp # ========== 第二阶段:运行阶段 ========== FROM alpine:3.18 WORKDIR /app COPY --from=builder /app/myapp . CMD ["./myapp"]最终镜像仅包含编译好的二进制文件 + Alpine 基础镜像,不包含 Go 编译工具链。
4.6 Dockerfile 最佳实践
- 选择最小基础镜像:优先使用 Alpine、Slim 等轻量级官方镜像,缩小镜像体积并减少漏洞。
- 使用多阶段构建:分离构建环境和运行环境,减小最终镜像大小。
- 合并 RUN 指令:用
&&连接多个命令,减少镜像层数。 - 优化指令顺序:将不易变更的指令放在前面,易变更的(如代码复制)放在后面,最大化缓存命中。
- 使用
.dockerignore:排除无关文件(如node_modules、.git),避免构建上下文过大。 - 指定镜像版本标签:避免使用
latest,使用明确的版本号如nginx:1.25-alpine。 - 定期重建镜像:使用
--no-cache选项获取最新的安全补丁。
五、镜像仓库管理
5.1 镜像仓库概述
Docker 镜像是通过镜像仓库进行存储和分发的。镜像仓库分为两类:
| 类型 | 说明 | 典型代表 |
|---|---|---|
| 公有仓库 | 公开访问,适合开源项目 | Docker Hub、阿里云容器镜像服务 |
| 私有仓库 | 仅授权用户可访问,适合企业 | Harbor、Docker Registry |
5.2 Docker Hub 基本操作
# 登录 Docker Hubdockerlogin# 给本地镜像打上仓库标签dockertag myapp:v1 username/myapp:v1# 推送到 Docker Hubdockerpush username/myapp:v1# 从 Docker Hub 拉取dockerpull username/myapp:v1# 登出dockerlogout5.3 搭建私有镜像仓库:Harbor
Harbor 是由 VMware 开发并开源的企业级 Docker 镜像仓库,提供RBAC 权限管理、LDAP 集成、日志审核、镜像复制和漏洞扫描等高级功能。
环境要求
- 操作系统:Linux(CentOS 7/8 或 Ubuntu 18.04/20.04)
- 硬件:至少2 核 CPU、4GB 内存、20GB 磁盘空间
安装步骤
Step 1:安装 Docker 和 Docker Compose
# 安装 Dockercurl-fsSLhttps://get.docker.com|shsudosystemctlenabledockersudosystemctl startdocker# 安装 Docker Composesudocurl-L"https://github.com/docker/compose/releases/download/v2.23.0/docker-compose-$(uname-s)-$(uname-m)"-o/usr/local/bin/docker-composesudochmod+x /usr/local/bin/docker-composeStep 2:下载并解压 Harbor 安装包
# 从 GitHub Releases 下载最新版本wgethttps://github.com/goharbor/harbor/releases/download/v2.10.0/harbor-offline-installer-v2.10.0.tgztarxvf harbor-offline-installer-v2.10.0.tgz-C/opt/cd/opt/harborStep 3:配置 harbor.yml
# 核心配置项hostname:registry.example.com# 访问域名或 IPhttp:port:80https:# 生产环境建议启用 HTTPSport:443certificate:/path/to/cert.pemprivate_key:/path/to/key.pemharbor_admin_password:Harbor12345# 管理员密码data_volume:/data/harbor# 镜像存储路径Step 4:执行安装
./install.shStep 5:验证安装
docker-composeps# 所有服务状态应为 Up使用 Harbor 私有仓库
# 1. 在 Docker 客户端配置信任(HTTP 仓库需配置 insecure-registries)# 编辑 /etc/docker/daemon.json{"insecure-registries":["registry.example.com"]}sudosystemctl restartdocker# 2. 登录私有仓库dockerlogin registry.example.com# 3. 给镜像打标签dockertag myapp:v1 registry.example.com/myproject/myapp:v1# 4. 推送镜像dockerpush registry.example.com/myproject/myapp:v1# 5. 拉取镜像dockerpull registry.example.com/myproject/myapp:v15.4 轻量级私有仓库:Docker Registry
若不需要 Harbor 的复杂功能,可使用官方轻量级 Registry:
# 启动 Registry 容器dockerrun-d-p5000:5000--nameregistry registry:2# 推送镜像dockertag myapp:v1 localhost:5000/myapp:v1dockerpush localhost:5000/myapp:v1# 拉取镜像dockerpull localhost:5000/myapp:v1六、快速索引(备忘卡片)
| 场景 | 命令 |
|---|---|
| 构建镜像 | docker build -t myapp:v1 . |
| 运行容器 | docker run -d -p 8080:80 --name web nginx |
| 查看运行中的容器 | docker ps |
| 进入容器 | docker exec -it web /bin/bash |
| 查看日志 | docker logs -f --tail 200 web |
| 停止容器 | docker stop web |
| 删除容器 | docker rm -f web |
| 删除镜像 | docker rmi myapp:v1 |
| 推送到仓库 | docker push registry/myapp:v1 |
| 一键清理 | docker system prune |
| 查看资源占用 | docker stats |
文档版本:v1.0
适用环境:Docker Engine 20.10+,Linux / macOS / Windows
维护建议:定期更新基础镜像以获取安全补丁,使用.dockerignore控制构建上下文大小,生产环境务必使用私有镜像仓库并启用 HTTPS。