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 文件定义和运行多容器应用,一条命令启动整个应用栈: