Docker 入门指南:从安装到实战,一篇吃透容器化

什么是 Docker?

Docker 是一个开源的容器化平台,用于开发、部署和运行应用程序。它通过将应用及其依赖打包到一个轻量级、可移植的容器中,实现了"一次构建,随处运行"的目标。

可以把 Docker 容器想象成一个轻量级的虚拟机——但它不需要运行完整的操作系统,而是共享宿主机的内核,只包含应用及其运行所需的库和配置。这使得容器比虚拟机更轻量、启动更快、资源占用更少。

Docker vs 传统虚拟机

特性 | Docker 容器 | 虚拟机 启动速度 | 毫秒级 | 分钟级 磁盘占用 | MB 级 | GB 级 性能 | 接近原生 | 有损耗 内核 | 共享宿主机 | 独立内核 隔离性 | 进程级 | 完全隔离 资源密度 | 一台宿主机跑数百个 | 十到几十个

核心概念

理解 Docker 必须先掌握三个核心概念:

1. 镜像(Image)

镜像是容器的只读模板,包含运行应用所需的文件系统、库、环境变量和配置。你可以把镜像想象成一个"类"(Class)——它定义了应用运行的所有条件。

镜像由多层组成,每一层对应 Dockerfile 中的一条指令。这种分层结构使得镜像构建时可以缓存和复用,节省存储和网络传输。

2. 容器(Container)

容器是镜像的运行实例,是"对象"(Instance)。它可以被启动、停止、删除。当容器被删除时,其中写入的数据也会丢失(除非使用了数据卷)。

3. 仓库(Registry)

仓库用于存储和分发镜像。最常用的是 Docker Hub(官方公共仓库),企业也可以搭建私有仓库如 Harbor。

安装 Docker

Ubuntu / Debian

CentOS / Rocky Linux / RHEL

国内镜像加速配置

如果你在国内访问 Docker Hub 速度较慢,可以配置镜像加速器:

免 sudo 运行 Docker(推荐)

Docker 常用命令

镜像管理

容器管理

Dockerfile — 构建自己的镜像

Dockerfile 是一个文本文件,包含一系列指令,Docker 会按顺序执行这些指令来构建镜像。

一个简单的 Node.js 应用示例

多阶段构建 — 减小镜像体积

多阶段构建可以让你在同一个 Dockerfile 中使用多个 FROM 指令,前一阶段编译好的二进制文件复制到最终镜像中,省去了构建工具和中间文件:

最终镜像从 800MB+(Go 编译环境)缩小到约 15MB。

Dockerfile 指令详解

  • FROM— 指定基础镜像,必须是第一条指令
  • WORKDIR— 设置工作目录,后续 RUN/CMD/COPY 都在此目录下
  • COPY— 从宿主机复制文件到镜像
  • ADD— 类似 COPY,但支持 URL 和自动解压 tar
  • RUN— 在构建时执行命令(常用于安装软件包)
  • CMD— 指定容器启动时的默认命令(可被 docker run 参数覆盖)
  • ENTRYPOINT— 类似于 CMD,但不被覆盖,适合作为容器的主命令
  • EXPOSE— 声明容器要监听的端口(仅文档用途)
  • ENV— 设置环境变量
  • ARG— 构建时的变量(docker build --build-arg)
  • VOLUME— 声明数据卷挂载点
  • USER— 指定运行用户(安全最佳实践,避免 root)
  • HEALTHCHECK— 定义容器健康检查

数据卷(Volumes)

容器删除后数据就会丢失,数据卷是持久化和共享数据的机制:

三种挂载方式

网络(Networking)

网络模式

  • bridge(默认)— 容器间通过虚拟网桥通信,适合单机
  • host— 容器直接使用宿主机网络栈,性能最佳
  • none— 无网络
  • overlay— 跨主机通信,用于 Swarm 或 K8s

Docker Compose — 多容器编排

Compose 用 YAML 文件定义和运行多容器应用,一条命令启动整个应用栈:

最佳实践与安全

镜像优化