# Docker 容器化技术标准操作指南 ##

📅 2026/7/22 11:27:19
# Docker 容器化技术标准操作指南 ##
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不同命名空间可有相同 PIDnet隔离网络设备、IP 地址、路由表ipc隔离进程间通信资源信号量、消息队列等mnt隔离文件系统挂载点类似 chrootuts隔离主机名和域名user隔离用户和组 ID1.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 imagesdocker pull 镜像名[:标签]从仓库拉取镜像docker pull nginx:1.25docker build -t 镜像名:标签 路径构建镜像docker build -t myapp:v1 .docker rmi 镜像ID或名称删除镜像docker rmi nginx:1.25docker tag 源镜像 目标镜像给镜像打标签docker tag myapp:v1 myregistry/myapp:v13.2 容器生命周期Container命令说明示例docker run [选项] 镜像创建并启动容器docker run -d -p 8080:80 --name web nginxdocker ps查看运行中的容器docker ps -a含已停止docker stop 容器停止容器docker stop webdocker start 容器启动已停止的容器docker start webdocker restart 容器重启容器docker restart webdocker rm 容器删除容器docker rm -f web强制删除docker logs 容器查看容器日志docker logs -f --tail 200 webdocker exec -it 容器 命令进入容器内部docker exec -it web /bin/bashdocker inspect 容器查看容器详细信息docker inspect webdocker cp 源 目标宿主机与容器间拷贝文件docker cp test.txt web:/app/docker run常用参数详解参数说明-d后台运行Detached否则日志会霸占终端-p 宿主机端口:容器端口端口映射如-p 8080:80-v 宿主机路径:容器路径挂载数据卷防止容器删除后数据丢失--name 容器名给容器起名便于管理--restartalways容器退出后自动重启-e KEYvalue设置环境变量--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.04RUN执行构建命令并生成新层RUN apt-get update apt-get install -y nginxCOPY复制文件/目录到镜像仅本地COPY . /appADD类似 COPY支持 URL 和 tar 自动解压ADD app.tar.gz /app/ENV设置环境变量运行时持久存在ENV NODE_ENVproductionARG定义构建时变量仅构建阶段有效ARG VERSION1.0WORKDIR设置工作目录WORKDIR /appEXPOSE声明容器监听端口文档说明EXPOSE 80CMD指定容器启动默认命令可被覆盖CMD [nginx, -g, daemon off;]ENTRYPOINT指定容器启动固定入口不可被覆盖ENTRYPOINT [nginx]VOLUME创建挂载点VOLUME /dataUSER设置运行用户USER nginxLABEL添加元数据LABEL maintainerdevexample.comHEALTHCHECK检查容器健康状态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 maintainerdevexample.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 中最容易混淆的两个指令它们在作用阶段和生命周期上有本质区别。特性ARGENV作用阶段仅构建时docker build构建时 运行时是否持久化到镜像否除非显式传递是能否被覆盖可通过--build-arg覆盖可通过docker run -e覆盖典型用途指定版本号、编译选项等构建参数配置应用运行环境ARG 使用示例# 定义构建参数可设置默认值 ARG NODE_VERSION20 ARG ALPINE_VERSION3.21 # 在 FROM 中使用构建参数 FROM node:${NODE_VERSION}-alpine${ALPINE_VERSION} AS base WORKDIR /src COPY package*.json ./ RUN npm ci构建时传参dockerbuild --build-argNODE_VERSION22--build-argALPINE_VERSION3.19-tmyapp:v1.ENV 使用示例# 设置运行时环境变量持久存在于镜像中 ENV NODE_ENVproduction \ PORT3000 CMD [node, app.js]运行时覆盖dockerrun-eNODE_ENVdevelopment-ePORT8080myapp:v1ARG 与 ENV 的协作模式常通过ARG接收外部输入再赋值给ENV实现灵活且持久的配置管理ARG DB_HOSTlocalhost ARG DB_PORT5432 ENV DATABASE_URLpostgresql://$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 --frombuilder /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 Registry5.2 Docker Hub 基本操作# 登录 Docker Hubdockerlogin# 给本地镜像打上仓库标签dockertag myapp:v1 username/myapp:v1# 推送到 Docker Hubdockerpush username/myapp:v1# 从 Docker Hub 拉取dockerpull username/myapp:v1# 登出dockerlogout5.3 搭建私有镜像仓库HarborHarbor 是由 VMware 开发并开源的企业级 Docker 镜像仓库提供RBAC 权限管理、LDAP 集成、日志审核、镜像复制和漏洞扫描等高级功能。环境要求操作系统LinuxCentOS 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-Lhttps://github.com/docker/compose/releases/download/v2.23.0/docker-compose-$(uname-s)-$(uname-m)-o/usr/local/bin/docker-composesudochmodx /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.10Linux / macOS / Windows维护建议定期更新基础镜像以获取安全补丁使用.dockerignore控制构建上下文大小生产环境务必使用私有镜像仓库并启用 HTTPS。