Docker 是什么?

一、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 的最大优势之一就是可移植性。迁移应用时,你不需要复制容器,而是迁移"构建和运行的定义":

  1. 将代码、Dockerfiledocker-compose.yml 提交到 Git;
  2. 在新服务器安装 Docker;
  3. git clone 项目;
  4. 执行 docker-compose up -d,自动拉取镜像、启动服务。

整个过程无需手动安装 JDK、MySQL、Redis......真正实现"一次构建,随处运行"。

⚠️ 注意:数据库等有状态服务需单独备份数据(如用 mysqldump),再在新环境恢复。

七、Docker 的边界:它不是万能的

  • Docker 本身适合单机部署 。若需跨多台服务器管理成百上千个容器,需借助容器编排工具,如 Kubernetes(K8s)。
  • 镜像应保持不可变:所有配置变更应通过重新构建镜像或运行时参数实现,而非手动修改容器。
  • 敏感信息(如密码)不要写死在镜像中,应通过环境变量或密钥管理服务注入。
相关推荐
app出海创收老李3 小时前
海外独立创收日记(4)-第一笔汇款
前端·后端·程序员
咕白m6253 小时前
Python 将 Excel 转换为图片:实现数据可视化
后端·python
一叶飘零_sweeeet3 小时前
从 0 到 1 掌控云原生部署:Java 项目的 Docker 容器化与 K8s 集群实战指南
docker·云原生·kubernetes·项目部署
森林猿4 小时前
docker-compose-kafka 4.1.0
docker·容器·kafka
蓑笠翁0014 小时前
Django REST Framework 全面指南:从模型到完整API接口开发
后端·python·django
鸽鸽程序猿4 小时前
【项目】基于Spring全家桶的论坛系统 【下】
后端·spring·restful
IT_陈寒4 小时前
Redis性能优化:5个被低估的配置项让你的QPS提升50%
前端·人工智能·后端
radient4 小时前
初识Agent、Prompt、Function Coding、MCP
后端·程序员·架构
Lisonseekpan4 小时前
Spring Boot 中使用 Caffeine 缓存详解与案例
java·spring boot·后端·spring·缓存