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

目的

Docker 是一款基于 Go 语言的开源容器化技术,实现了 “一次镜像,处处运行” 的愿景。本指南旨在帮助读者系统掌握 Docker 的核心原理、常用命令、镜像构建(Dockerfile)及镜像仓库管理,实现应用的全生命周期容器化管理。

核心思路

  1. 理解原理再动手 —— 掌握 Namespace、Cgroups、UnionFS 三大基石,才能更好地理解容器行为。
  2. 镜像分层,缓存复用 —— Dockerfile 的每条指令生成一个只读层,合理编排指令顺序可最大化利用构建缓存。
  3. 一次构建,到处运行 —— 镜像标准化确保开发、测试、生产环境一致性。
  4. 安全与效率并重 —— 选择最小基础镜像、使用多阶段构建、定期更新镜像。

一、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(联合文件系统)—— 实现分层存储

镜像采用分层存储设计,每条指令(如 RUNCOPY)生成一个只读层,最终通过 UnionFS 组合成完整文件系统。这种设计使得:

  • 多个镜像可共享相同的基础层,节省磁盘空间
  • 构建时可复用未变更的缓存层,加速构建

二、Docker 安装

2.1 通过官方脚本安装(推荐)

curl -fsSL https://get.docker.com | sh
sudo systemctl enable docker
sudo systemctl start docker

2.2 验证安装

docker --version
docker info

三、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)

# 一键清理所有未使用的资源(容器、网络、镜像、构建缓存)
docker system prune

# 只清理悬空镜像(<none> 标签的镜像)
docker image prune

# 查看 Docker 磁盘使用情况
docker system df

四、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 会检查指令是否与缓存匹配,若指令或依赖文件未变更,则复用缓存层。

缓存失效的关键规则COPYADD 后的文件变更会导致后续所有指令的缓存失效。

优化策略:将高频变更的指令(如代码复制)放在 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;"]

构建命令

docker build -t my-nginx:v1 .

4.4 ARG 与 ENV 的深度解析

ARGENV 是 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

构建时传参

docker build --build-arg NODE_VERSION=22 --build-arg ALPINE_VERSION=3.19 -t myapp:v1 .
ENV 使用示例
# 设置运行时环境变量(持久存在于镜像中)
ENV NODE_ENV=production \
    PORT=3000

CMD ["node", "app.js"]

运行时覆盖

docker run -e NODE_ENV=development -e PORT=8080 myapp:v1
ARG 与 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 最佳实践

  1. 选择最小基础镜像:优先使用 Alpine、Slim 等轻量级官方镜像,缩小镜像体积并减少漏洞。
  2. 使用多阶段构建:分离构建环境和运行环境,减小最终镜像大小。
  3. 合并 RUN 指令:用 && 连接多个命令,减少镜像层数。
  4. 优化指令顺序:将不易变更的指令放在前面,易变更的(如代码复制)放在后面,最大化缓存命中。
  5. 使用 .dockerignore:排除无关文件(如 node_modules.git),避免构建上下文过大。
  6. 指定镜像版本标签:避免使用 latest,使用明确的版本号如 nginx:1.25-alpine
  7. 定期重建镜像:使用 --no-cache 选项获取最新的安全补丁。

五、镜像仓库管理

5.1 镜像仓库概述

Docker 镜像是通过镜像仓库进行存储和分发的。镜像仓库分为两类:

类型 说明 典型代表
公有仓库 公开访问,适合开源项目 Docker Hub、阿里云容器镜像服务
私有仓库 仅授权用户可访问,适合企业 Harbor、Docker Registry

5.2 Docker Hub 基本操作

# 登录 Docker Hub
docker login

# 给本地镜像打上仓库标签
docker tag myapp:v1 username/myapp:v1

# 推送到 Docker Hub
docker push username/myapp:v1

# 从 Docker Hub 拉取
docker pull username/myapp:v1

# 登出
docker logout

5.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

# 安装 Docker
curl -fsSL https://get.docker.com | sh
sudo systemctl enable docker
sudo systemctl start docker

# 安装 Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/download/v2.23.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

Step 2:下载并解压 Harbor 安装包

# 从 GitHub Releases 下载最新版本
wget https://github.com/goharbor/harbor/releases/download/v2.10.0/harbor-offline-installer-v2.10.0.tgz
tar xvf harbor-offline-installer-v2.10.0.tgz -C /opt/
cd /opt/harbor

Step 3:配置 harbor.yml

# 核心配置项
hostname: registry.example.com          # 访问域名或 IP
http:
  port: 80
https:                                   # 生产环境建议启用 HTTPS
  port: 443
  certificate: /path/to/cert.pem
  private_key: /path/to/key.pem
harbor_admin_password: Harbor12345      # 管理员密码
data_volume: /data/harbor               # 镜像存储路径

Step 4:执行安装

./install.sh

Step 5:验证安装

docker-compose ps
# 所有服务状态应为 Up
使用 Harbor 私有仓库
# 1. 在 Docker 客户端配置信任(HTTP 仓库需配置 insecure-registries)
# 编辑 /etc/docker/daemon.json
{
  "insecure-registries": ["registry.example.com"]
}
sudo systemctl restart docker

# 2. 登录私有仓库
docker login registry.example.com

# 3. 给镜像打标签
docker tag myapp:v1 registry.example.com/myproject/myapp:v1

# 4. 推送镜像
docker push registry.example.com/myproject/myapp:v1

# 5. 拉取镜像
docker pull registry.example.com/myproject/myapp:v1

5.4 轻量级私有仓库:Docker Registry

若不需要 Harbor 的复杂功能,可使用官方轻量级 Registry:

# 启动 Registry 容器
docker run -d -p 5000:5000 --name registry registry:2

# 推送镜像
docker tag myapp:v1 localhost:5000/myapp:v1
docker push localhost:5000/myapp:v1

# 拉取镜像
docker pull 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。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐