docker_practice Documentation

最新Docker容器技术,从真实案例中学习最佳实践!| Learn and understand Docker&Container technologies, with real DevOps practice!

RAW Doc

Docker & Self-Hosted Deployment Verified OCI

Deploy docker_practice on any server, homelab, or cloud container platform.

1-Click Terminal Command
bash (docker run)
docker run -d --name docker_practice -p 443:443 --restart always registry:2
Configured Services & Ports
⚙️ registry
image: registry:2
🔌 Ports: 443:5000
docker-compose.yml
yaml (docker-compose.yml)
services:
  registry:
    image: registry:2
    ports:
      - "443:5000"
    volumes:
      - ./:/etc/docker/registry
      - registry-data:/var/lib/registry

volumes:
  registry-data:

File: README.md


关于本书

Docker 是个划时代的开源项目,它彻底释放了计算虚拟化的威力,极大提高了应用的维护效率,降低了云计算应用开发的成本!使用 Docker,可以让应用的部署、测试和分发都变得前所未有的高效和轻松!

无论是应用开发者、运维人员、还是其他信息技术从业人员,都有必要认识和掌握 Docker,节约有限的生命。

本书既适用于具备基础 Linux 知识的 Docker 初学者,也希望可供理解原理和实现的高级用户参考。同时,书中给出的实践案例,可供在进行实际部署时借鉴。

内容特色

  • 入门基础:第 1 ~ 6 章为基础内容,帮助深入理解 Docker 的基本概念 (镜像、容器、仓库) 和核心操作。
  • 进阶应用:第 7 ~ 11 章涵盖 Dockerfile 指令详解、数据与网络管理、Buildx、Compose 等高级配置和管理操作。
  • 深入原理:第 12 ~ 17 章介绍其底层实现技术,深入探讨容器编排体系 (Kubernetes、Etcd),并延伸涉及容器与云计算及其它关键生态项目 (Fedora CoreOS、Podman 等)。
  • 实战扩展:第 18 ~ 21 章重点讨论容器安全防护机制、监控与日志聚合系统 (Prometheus、ELK),并展示操作系统、CI/CD 自动化构建等典型实践案例。

五分钟快速上手

“5分钟运行第一个容器”——跟随以下步骤快速体验 Docker:

  1. 安装 Docker(第3章):根据操作系统完成 Docker 的安装与验证
  2. 第一个容器(第1章 1.1):快速体验构建镜像与启动容器的完整流程
  3. 交互式容器(第5章):执行 docker run -it ubuntu bash,进入容器内部与系统交互
  4. 镜像与仓库(第2章、第4章、第6章):理解核心概念,并学会拉取、使用与管理镜像和仓库
  5. 自定义镜像(第7章):学习如何编写 Dockerfile 创建自己的镜像

学习路线图

mermaid
graph LR
    Start[Docker 学习入口] --> Ch1[第1章:Docker 简介]

    Ch1 --> Role1["运维新手第1-6章"]
    Ch1 --> Role2["开发者第1-8章 → 第11章"]
    Ch1 --> Role3["DevOps 工程师第1-11章 → 第13-14章 → 第18-21章"]
    Ch1 --> Role4["架构师第1-6章 → 第12-17章 → 第18-19章"]

    Role1 --> End1["掌握基本操作"]
    Role2 --> End2["构建与部署应用"]
    Role3 --> End3["自动化与运维"]
    Role4 --> End4["设计容器方案"]
读者角色 学习重点 核心成果
运维新手 第1-6章 掌握容器的基本概念与操作
开发者 第1-8章 → 第11章 学会容器化应用的构建与部署
DevOps 工程师 第1-11章 → 第13-14章 → 第18-21章 实现容器编排与自动化部署流程
架构师 第1-6章 → 第12-17章 → 第18-19章 设计高可用、高性能的容器基础设施

在线阅读

本书在线阅读,可直接访问 GitBook。也可访问 GitHub 仓库目录。

下载离线版本

本书提供 PDF 版本供离线阅读,可前往 GitHub Releases 页面下载最新版本。

如需获取默认分支自动更新的预览版,可直接下载 docker_practice.pdf。该文件会随主线更新覆盖,不代表正式发布版本。

本地阅读

先安装 mdPress:

bash
brew tap yeasy/tap && brew install mdpress
mdpress serve

社区交流

推荐阅读

本书是技术丛书的一部分。以下书籍与本书形成互补:

书名 与本书的关系
《前线部署工程实践指南》 讲容器、Kubernetes、GitOps、IaC、供应链、安全、观测与 SLO 如何组合成可交付、可审计、可运营的部署工程体系
《智能体 Harness 工程指南》 Agent 基础设施中的容器化部署与隔离
《大模型安全权威指南》 容器安全与 AI 系统安全的交叉实践
《区块链技术指南》 区块链节点的容器化部署

参与贡献

欢迎参与项目维护。

进阶学习

《Docker 技术入门与实战》已更新到第 4 版,讲解最新容器技术栈知识,欢迎大家阅读并反馈建议。京东图书 | 天猫图书

支持鼓励

欢迎鼓励项目一杯 coffee~

Star History

许可证

本书采用 CC BY-NC-SA 4.0 许可证。

您可以自由分享和演绎,但需署名、非商业使用、相同方式共享。


File: 01_introduction/README.md

第一章 Docker 简介

本章将带领你进入 Docker 的世界。

版本提示:本书内容及示例基于 Docker Engine v29.x 及以上版本。值得注意的是,自 Docker Engine v29 起,官方在全新安装场景下 默认启用 containerd image store 作为镜像存储后端(取代传统 classic store 路径下的 graph driver 体系)。这项底层革新极大增强了 Docker 对多架构镜像(Multi-platform)以及软件供应链安全元数据(Attestations, SBOM, Provenance)的本地支持原生性。

本章内容

  • 快速上手

    • 通过一个简单的 Web 应用例子,带你快速体验 Docker 的核心流程:构建镜像、运行容器。
  • 什么是 Docker

    • 介绍 Docker 的起源、发展历程以及其背后的核心技术 (Cgroups,Namespaces,UnionFS,以及 containerd 引擎的演进)。
    • 了解 Docker 是如何改变软件交付方式的。
  • 为什么要用 Docker

    • 对比传统虚拟机技术,阐述 Docker 在启动速度、资源利用率、交付效率等方面的巨大优势。
    • 探讨 Docker 在 DevOps、微服务架构中的关键作用。

学习目标

通过本章的学习,你将能够:

  1. 理解 Docker 的核心概念与架构。
  2. 明白 Docker 解决了现代软件开发与运维中的哪些痛点。
  3. 建立起对容器技术的初步认知,为后续的实战操作打下基础。

好吧,让我们带着问题开始这神奇之旅。


File: 02_basic_concept/README.md

第二章 基本概念

版本说明:本章内容及示例基于 Docker v29.x 编写。镜像标签相关示例请查阅官方文档以确认最新可用版本。

Docker 包括三个基本概念:

  • 镜像 (Image):Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数 (如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
  • 容器 (Container):镜像 (Image) 和容器 (Container) 的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
  • 仓库 (Repository):镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。

理解了这三个概念,就理解了 Docker 的整个生命周期。


File: 03_install/README.md

第三章 安装 Docker

Docker Engine 主要提供 stable 和 test 两个更新频道;test.docker.com 对应测试频道,适合预发布验证,不建议直接用于生产环境。

官方网站上有各种环境下的安装指南,这里主要介绍 Docker 在 Linux、Windows 10/11 和 macOS 上的安装。

安装方式选择指南

在开始安装前,笔者建议你根据以下决策树选择最合适的安装方式:

生产环境 vs 开发环境

生产环境(服务器部署):

  • 优先使用官方 APT/YUM 源安装(Ubuntu、Debian、Fedora、CentOS)
  • 优势:获得官方安全更新、长期技术支持、版本管理清晰
  • 安装步骤稍多一些,但这种“麻烦”是值得的——它为你的生产系统争取了稳定性和可维护性

开发环境(本地开发机、测试服务器):

  • 配置 Docker 官方源后 使用包管理器安装,或在一次性测试环境使用官方脚本自动安装
  • 如果你想快速上手,官方脚本(get.docker.com)是最便捷的选择
  • 国内用户注意:这一步一定要选对镜像源,否则网络卡顿会严重影响体验

国内用户的网络优化建议

值得注意的是,国内直接访问 Docker 官方源速度较慢,建议:

  • 安装过程:使用阿里云、腾讯云等国内镜像源
  • 镜像拉取:安装完成后配置 Docker 镜像加速器(详见 3.9 镜像加速器),这一步对日常开发的体验提升最明显

特殊场景

详细安装指南


File: 04_image/README.md

第四章 使用镜像

在之前的介绍中,我们知道镜像是 Docker 的三大组件之一。

Docker 运行容器前需要本地存在对应的镜像,如果本地不存在该镜像,Docker 会从镜像仓库下载该镜像。

本章内容

本章将介绍更多关于镜像的内容,包括:

版本提示:镜像存储后端的变迁

在 Docker Engine v29 及后续版本中,Docker 在全新安装场景默认启用 containerd image store(替代传统 classic store 路径)。这一底层架构级别的变迁,意味着 Docker 解锁了对 OCI Image Index 和 Attestations(例如原生的 provenance 来源证明与 SBOM 软件物料清单)的全量本地支持。
读者在执行类似 docker buildx build --provenance=mode=min --sbom=true 甚至使用后续审查工具(如 docker buildx imagetools inspect)时,其元数据能够与镜像数据一并完好地管理于本地存储系统中,为供应链安全验证补齐了最后一块拼图。


File: 05_container/README.md

第五章 操作容器

容器是 Docker 又一核心概念。

简单的说,容器是独立运行的一个或一组应用,以及它们的运行态环境。对应的,虚拟机可以理解为模拟运行的一整套操作系统 (提供了运行态环境和其他系统环境) 和跑在上面的应用。

本章将具体介绍如何来管理一个容器,包括创建、启动和停止等。

版本号说明

本章示例涉及多个 Docker 镜像,遵循以下版本号最佳实践:

  • 官方镜像(如 ubuntu、nginx、mysql):使用具体大版本号(如 ubuntu:24.04、mysql:8.4)而非 latest,确保示例的可重复性
  • 镜像标签约定:
    • latest 或 v1.0.0 等:带标签的自定义镜像,示例中指定具体版本
    • 24.04、8.4:官方镜像的稳定版本分支
    • 生产环境建议:指定确切版本号(如 nginx:1.28.0、mysql:8.4.4)而非仅大版本号

File: 06_repository/README.md

第六章 访问仓库

仓库 (Repository) 是集中存放镜像的地方。

一个容易混淆的概念是注册服务器 (Registry)。实际上注册服务器是管理仓库的具体服务器,每个服务器上可以有多个仓库,而每个仓库下面有多个镜像。从这方面来说,仓库可以被认为是一个具体的项目或目录。例如对于仓库地址 docker.io/ubuntu 来说,docker.io 是注册服务器地址,ubuntu 是仓库名。

大部分时候,并不需要严格区分这两者的概念。

版本号说明

本章涉及的 Registry 和相关工具版本说明:

  • Docker Registry / CNCF Distribution:本章示例使用 registry:2 兼容路径;新生产部署应评估 Distribution 3.x,并核对配置路径、迁移说明和生态兼容性。已停止维护的 registry:1 不建议使用
  • Nexus 3:建议指定具体版本(如 sonatype/nexus3:3.69)而非 latest,避免自动升级带来的兼容性问题
  • 镜像标签规范:
    • 生产环境推送至仓库时应明确指定版本号(如 myapp:v1.0.0)
    • 避免依赖 latest 标签,因为其含义存在歧义且易导致版本混淆

为什么需要私有仓库?

在讨论具体的安装和配置前,让我们先理解:什么时候你应该建设私有仓库?

开发团队(有专利代码、不能公开):

  • 需要私有仓库存储内部镜像
  • 涉及访问控制和审计
  • 强烈推荐使用托管方案(如 Harbor 或云厂商提供的镜像仓库)

开源项目或个人学习:

  • Docker Hub 公开仓库足够
  • 无需自建私有仓库的成本

企业级部署:

  • 需要高可用、备份、灾难恢复
  • 推荐使用专业级方案(Nexus 3、Harbor)而非简单的 Registry

本章涵盖的方案从简到复杂:

  • Docker Registry:最小化部署(适合简单场景)
  • 私有仓库高级配置:添加认证、HTTPS 等生产必需项
  • Nexus 3:企业级完整解决方案,支持权限管理、备份等

本章内容


File: 07_dockerfile/README.md

第七章 Dockerfile 指令详解

什么是 Dockerfile

Dockerfile 是一个文本文件,其内包含了一条条的 指令 (Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。

在第四章中,我们通过 docker commit 学习了镜像的构成。但是,手动 commit 只能作为临时修补,并不适合作为生产环境镜像的构建方式。

使用 Dockerfile 构建镜像有以下优势:

  • 自动化:可以通过 docker build 命令自动构建镜像。
  • 可重复性:由于 Dockerfile 是文本文件,可以确保每次构建的结果一致。
  • 版本控制:Dockerfile 可以纳入版本控制系统 (如 Git),便于追踪变更。
  • 透明性:任何人都可以通过阅读 Dockerfile 了解镜像的构建过程。

Dockerfile 编写哲学

在深入每个指令的细节之前,笔者想强调一个至关重要的原则:Dockerfile 不是脚本,而是镜像的“设计图”。这个区别决定了你如何思考每条指令的作用。

相比编写 Bash 脚本的思维(“按顺序执行这些命令”),Dockerfile 的思维应该是(“这一层镜像应该如何构建,下一层如何分层”)。这个思维转变会影响你的决策:

  • 合并命令:一个 RUN apt-get update && apt-get install ... 应该写在一起,而不是分开成多个 RUN 指令,因为它们是同一个“层”的逻辑
  • 选择合适的指令:COPY vs ADD、CMD vs ENTRYPOINT 这些选择不是随意的,而是根据镜像分层的语义来决定的
  • 优化镜像大小:最后才清理缓存、删除临时文件,让这些“瘦身”操作在同一层完成

这个章节将详细介绍各个指令。在学习指令语法时,请始终思考:“这个指令为什么要以这样的方式工作?如果我是 Docker,我应该如何设计它?”

Dockerfile 基本结构

Dockerfile 一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。

可运行 docker buildx build --check 校验的完整 Dockerfile 示例与配套 index.html 保存在仓库中。它使用 scratch,因此结构检查不会解析远程基础镜像元数据。下面的围栏与该文件由测试强制保持一致。

dockerfile
FROM scratch

COPY index.html /index.html

指令详解

本章将详细讲解 Dockerfile 中的各个指令:

高级特性

本章还将介绍 Dockerfile 的高级特性:

参考与最佳实践

此外,我们还将介绍 Dockerfile 的最佳实践和常见问题。

使用 Dockerfile 构建镜像

构建镜像的基本命令格式为:

bash
docker build [选项] <上下文路径/URL/->

例如,在 Dockerfile 所在目录执行:

bash
docker build -t my-image:1.0 .

关于版本号最佳实践

本章中的 Dockerfile 示例使用的基础镜像标签遵循以下原则:

  • 通用标签(如 ubuntu:24.04、alpine、nginx):保持原样,无需修改
  • 基础镜像版本号(如 node:22、python:3.12):使用主或次版本号而非完整版本号(patch),这样可以自动获取最新的补丁版本,确保获得安全更新
  • 避免:不建议使用 latest 标签和完整的 patch 版本号(如 20.10.0)作为基础镜像,因为这会导致构建的不可重现性或安全风险

读者在使用这些示例时,应根据实际生产环境需求选择合适的版本号。

更多关于 docker build 的用法,我们在实战中会结合具体指令进行演示。


File: 08_data/README.md

第八章 数据管理

如图 8-1 所示,Docker 数据管理主要围绕三类挂载方式展开。

图 8-1:Docker 数据挂载类型示意图

这一章介绍如何在 Docker 内部以及容器之间管理数据,在容器中管理数据主要有以下几种方式:


File: 09_network/README.md

第九章 网络配置

Docker 容器需要网络来与外部世界通信、容器之间相互通信以及与宿主机通信。Docker 在安装时会自动配置网络基础设施,大多数情况下开箱即用。

概述

Docker 启动时自动创建以下网络组件:

mermaid
graph TD
    subgraph Host [宿主机]
        eth0[物理网卡 eth0192.168.1.100]
        docker0[docker0 网桥172.17.0.1]

        subgraph Containers
            subgraph ContainerA [容器 A]
                eth0_A[eth0172.17.0.2]
            end
            subgraph ContainerB [容器 B]
                eth0_B[eth0172.17.0.3]
            end
        end

        eth0 <--> docker0
        docker0 <--> eth0_A
        docker0 <--> eth0_B
    end

    Internet((互联网)) <--> eth0

本章将详细介绍 Docker 网络配置的各个方面。

本章内容