10分钟看懂Docker核心概念

别急着想复杂的概念,我们先通过一个简单的例子理解Docker。

一个最简单的例子

想象你要开一家咖啡店:

传统部署方式

每开一家分店都要:

  1. 找房子(服务器)
  2. 装修(安装操作系统、依赖环境)
  3. 买设备(安装软件)
  4. 招人培训(配置环境)
  5. 开业(部署应用)

每家店都要从头开始,而且每家店的装修、设备可能都不一样,导致咖啡品质不一致。

Docker方式

先在一个地方把一切都准备好:

  1. 做一个标准化的"店铺模板"(镜像)
  2. 包含所有的装修、设备、配方
  3. 要开新店时,直接复制这个模板(容器)
  4. 瞬间开业

每家店都一模一样,品质完全一致。

Docker的三大核心概念

1. 镜像(Image)

镜像是一个只读的"模板",包含:

  • 应用程序代码
  • 运行环境(操作系统、运行时库)
  • 依赖文件
  • 配置参数

镜像的特点:

  • 只读:创建后不能修改
  • 分层:由多层叠加而成
  • 可复用:可以基于已有镜像创建新镜像

常见镜像:

  • nginx:Web服务器
  • python:Python运行环境
  • mysql:MySQL数据库
  • redis:缓存服务

2. 容器(Container)

容器是镜像运行起来的"实例"

容器的特点:

  • 可以启动、停止、删除
  • 相互隔离,互不影响
  • 可以访问宿主机资源(需要配置)
  • 容器内部修改不会影响镜像

类比:

  • 镜像 = 类(Class)
  • 容器 = 对象(Object)
  • 一个类可以创建多个对象,一个镜像可以启动多个容器

3. 仓库(Registry)

仓库是存放镜像的地方,类似代码仓库(如GitHub)。

常见仓库:

  • Docker Hub:官方公共仓库(https://hub.docker.com)
  • 阿里云镜像加速器:国内访问更快
  • 私有仓库:企业内部使用

镜像命名规范:

仓库地址/组织名/镜像名:标签

例如:
docker.io/library/nginx:latest
registry.cn-hangzhou.aliyuncs.com/library/nginx:latest
nginx:latest  # 省略仓库地址,默认用Docker Hub

Docker的工作流程

┌─────────────┐    拉取/构建    ┌──────────────┐
│  Dockerfile │ ────────────> │    镜像      │
└─────────────┘              └──────────────┘
                                  │
                            启动容器
                                  ↓
                            ┌──────────────┐
                            │    容器      │
                            │ (运行中的应用)│
                            └──────────────┘

流程说明:

  1. 编写Dockerfile:定义如何构建镜像
  2. 构建镜像:根据Dockerfile创建镜像
  3. 推送/拉取:把镜像推送到仓库或从仓库拉取
  4. 启动容器:基于镜像运行容器

第一个Docker容器

让我们运行一个真正的容器:

# 运行一个nginx容器
docker run -d -p 80:80 --name my-web nginx

命令解析:

  • docker run:运行容器的命令
  • -d:后台运行(detach)
  • -p 80:80:端口映射(宿主机80 -> 容器80)
  • --name my-web:给容器起个名字
  • nginx:使用的镜像名称

验证:

  1. 打开浏览器访问 http://localhost
  2. 你会看到nginx的欢迎页面!

查看容器:

# 查看运行中的容器
docker ps

# 查看所有容器(包括停止的)
docker ps -a

容器的生命周期

创建 ──> 启动 ──> 运行中 ──> 停止 ──> 删除
   ↑        ↓        ↓        ↓        ↓
   └────────────────┴────────────────┘
         任意状态都可以重启

常用操作:

# 创建并启动容器
docker run ...

# 停止运行中的容器
docker stop my-web

# 启动已停止的容器
docker start my-web

# 重启容器
docker restart my-web

# 删除容器
docker rm my-web

容器的隔离机制

1. 进程隔离(Namespace)

每个容器都有独立的进程空间:

# 在容器内
docker exec my-web ps aux
# 只能看到容器内的进程,看不到宿主机的进程

2. 文件系统隔离

每个容器有独立的文件系统:

  • 容器内的文件操作不影响宿主机
  • 容器删除后,文件也会丢失(除非做了持久化)

3. 网络隔离

每个容器有独立的网络空间:

  • 容器之间默认隔离
  • 需要配置才能互相访问

4. 资源限制(Cgroups)

可以限制容器使用的资源:

# 限制容器最多用512MB内存
docker run -d -m 512m nginx

镜像的分层原理

Docker镜像采用分层存储,每层都是只读的:

┌─────────────┐  应用层(代码、配置)
├─────────────┤  运行时层(Python、Node.js等)
├─────────────┤  系统工具层(wget、curl等)
├─────────────┤  基础系统层(Ubuntu、Alpine等)
└─────────────┘

优势:

  1. 节省空间:多个镜像共享相同的层
  2. 快速构建:只修改变化的层
  3. 版本管理:每层都有唯一ID

容器运行时: 在镜像最上层添加一个可写层:

┌─────────────┐  可写层(容器运行时修改的文件)
├─────────────┤  只读层(镜像的层)
├─────────────┤
├─────────────┤
├─────────────┤
└─────────────┘

实战:运行一个Python程序

# 1. 创建一个简单的Python脚本
echo 'print("Hello, Docker!")' > hello.py

# 2. 用Docker运行这个脚本
docker run --rm -v $(pwd):/app python:3.11 python /app/hello.py

命令解析:

  • --rm:容器退出后自动删除
  • -v $(pwd):/app:挂载当前目录到容器内的/app目录
  • python:3.11:使用Python 3.11镜像
  • python /app/hello.py:在容器内执行的命令

输出:

Hello, Docker!

常用命令速查

# 镜像相关
docker pull nginx              # 拉取镜像
docker images                  # 查看本地镜像
docker rmi nginx               # 删除镜像

# 容器相关
docker run nginx               # 运行容器
docker ps                      # 查看运行中的容器
docker ps -a                   # 查看所有容器
docker stop my-web             # 停止容器
docker start my-web            # 启动容器
docker rm my-web               # 删除容器
docker logs my-web             # 查看容器日志
docker exec -it my-web bash    # 进入容器

本章小结

  • 镜像:只读的模板,包含应用和运行环境
  • 容器:镜像运行起来的实例,相互隔离
  • 仓库:存放镜像的地方(如Docker Hub)
  • 分层存储:镜像由多层叠加,节省空间
  • 隔离机制:进程、文件系统、网络、资源都隔离

现在已经理解了Docker的核心概念,下一章我们来安装配置Docker环境!

继续学下去,马上就能实际操作了!