一、Docker 是什么?
Docker 是一种开源的容器化技术 ,它能将应用程序及其运行所需的一切------包括代码、运行时环境、系统工具、库文件和配置------打包成一个轻量级、可移植的单元,称为镜像(Image)。
以 Redis 为例:官方提供了预装好 Redis 8.0 的镜像。我们无需手动安装 Redis、配置依赖或担心系统兼容性,只需从镜像仓库(如 Docker Hub)下载这个镜像,然后运行它,一个完整的 Redis 服务就立刻启动了。
镜像是静态的"模板",容器是镜像的运行实例。
就像你下载一个
.exe
安装包(镜像),双击运行后得到一个正在工作的程序窗口(容器)。
二、Docker 不是虚拟机
很多人误以为 Docker 是"轻量级虚拟机",其实完全不同:
- 虚拟机(VM) 需要运行完整的 Guest 操作系统,资源开销大,启动慢。
- Docker 容器 则共享宿主机的操作系统内核,仅隔离用户空间(进程、文件、网络等),因此启动快(秒级)、占用资源少。
Docker 背后依赖 Linux 的两大核心技术:
- Namespaces:实现进程、网络、文件系统等的隔离;
- Cgroups:限制 CPU、内存等资源使用。
这使得多个容器可以在同一台机器上安全、高效地共存。
三、镜像分层:高效构建与共享
Docker 镜像采用分层文件系统设计。例如:
dockerfile
FROM ubuntu:22.04 # 基础层
RUN apt-get update # 中间层
COPY app.py /app/ # 应用层
每一行指令都会生成一个只读层。多个镜像如果使用相同的基础层(如 ubuntu:22.04
),则共享该层 ,节省磁盘和网络带宽。同时,Docker 在构建时会利用层缓存------只要前面的指令没变,就无需重复执行,极大提升构建速度。
四、如何使用 Docker?
1. 单个服务:镜像 → 容器
bash
# 拉取 Redis 镜像
docker pull redis:8.0
# 运行容器(映射端口)
docker run -d -p 6379:6379 --name my-redis redis:8.0
如果需要自定义配置(如密码、持久化路径),不要直接修改容器内部文件,而应通过:
- 挂载配置文件:
-v ./redis.conf:/etc/redis/redis.conf
- 设置环境变量:
-e REDIS_PASSWORD=123456
2. 多服务协作:Docker Compose
一个完整应用通常包含多个组件:Web 服务、MySQL、Redis 等。Docker 推荐"一个容器一个服务 ",并通过 docker-compose.yml
统一编排:
yaml
version: '3'
services:
web:
build: .
ports:
- "8080:8080"
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootpass
redis:
image: redis:8-alpine
只需一条命令即可启动整个系统:
bash
docker-compose up -d
服务之间可通过服务名 直接通信(如 http://db:3306
),Docker 自动完成 DNS 解析。
五、数据持久化:容器是临时的!
容器的可写层是临时的。一旦删除容器,所有运行时产生的数据(如数据库文件、日志)都会丢失。
✅ 正确做法:使用 Volume(卷) 或 绑定挂载(Bind Mount) 将数据存储在宿主机:
yaml
volumes:
- mysql_data:/var/lib/mysql # 数据持久化到 Volume
这样即使容器重建,数据依然保留。
六、如何迁移到新服务器?
Docker 的最大优势之一就是可移植性。迁移应用时,你不需要复制容器,而是迁移"构建和运行的定义":
- 将代码、
Dockerfile
、docker-compose.yml
提交到 Git; - 在新服务器安装 Docker;
git clone
项目;- 执行
docker-compose up -d
,自动拉取镜像、启动服务。
整个过程无需手动安装 JDK、MySQL、Redis......真正实现"一次构建,随处运行"。
⚠️ 注意:数据库等有状态服务需单独备份数据(如用
mysqldump
),再在新环境恢复。
七、Docker 的边界:它不是万能的
- Docker 本身适合单机部署 。若需跨多台服务器管理成百上千个容器,需借助容器编排工具,如 Kubernetes(K8s)。
- 镜像应保持不可变:所有配置变更应通过重新构建镜像或运行时参数实现,而非手动修改容器。
- 敏感信息(如密码)不要写死在镜像中,应通过环境变量或密钥管理服务注入。