02-Docker快速入门-10分钟理解容器
10分钟看懂Docker核心概念
别急着想复杂的概念,我们先通过一个简单的例子理解Docker。
一个最简单的例子
想象你要开一家咖啡店:
传统部署方式
每开一家分店都要:
- 找房子(服务器)
- 装修(安装操作系统、依赖环境)
- 买设备(安装软件)
- 招人培训(配置环境)
- 开业(部署应用)
每家店都要从头开始,而且每家店的装修、设备可能都不一样,导致咖啡品质不一致。
Docker方式
先在一个地方把一切都准备好:
- 做一个标准化的"店铺模板"(镜像)
- 包含所有的装修、设备、配方
- 要开新店时,直接复制这个模板(容器)
- 瞬间开业
每家店都一模一样,品质完全一致。
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 │ ────────────> │ 镜像 │
└─────────────┘ └──────────────┘
│
启动容器
↓
┌──────────────┐
│ 容器 │
│ (运行中的应用)│
└──────────────┘
流程说明:
- 编写Dockerfile:定义如何构建镜像
- 构建镜像:根据Dockerfile创建镜像
- 推送/拉取:把镜像推送到仓库或从仓库拉取
- 启动容器:基于镜像运行容器
第一个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:使用的镜像名称
验证:
- 打开浏览器访问
http://localhost - 你会看到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等)
└─────────────┘
优势:
- 节省空间:多个镜像共享相同的层
- 快速构建:只修改变化的层
- 版本管理:每层都有唯一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环境!
继续学下去,马上就能实际操作了!