容器
什么是容器
容器,是一个视图隔离、资源可限制、独立文件系统的进程集合:
- 视图隔离 - 如能看见部分进程;独立主机名等等;
- 控制资源使用率 - 如 2G 内存大小;CPU 使用个数等等;
什么是镜像
镜像是容器所需要一切的文件集合,使用 Dockerfile 来描述镜像的构建过程
dockerfile
# 阶段1:构建环境(基于 golang:alpine)
FROM golang:1.19-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download # 依赖下载(独立层)
COPY . . # 复制代码
RUN go build -o /myapp # 编译生成二进制
# 阶段2:运行环境(基于纯净 alpine)
FROM alpine:3.16
WORKDIR /root/
COPY --from=builder /myapp . # 仅复制二进制文件
CMD ["./myapp"]构建过程中产生的文件变化:changeset
在构建的每一次操作都会构建成一个层(Layer),相同的层在不同的镜像中复用
运行容器
bash
docker pull busybox:1.25 #拉取镜像
docker run [-d] -name demo busybox:1.25容器运行时的生命周期
创建阶段
docker create:创建容器文件系统(基于镜像层)和配置- 分配资源限制(cgroups)和命名空间(Namespaces)
运行阶段
docker start:执行入口点(ENTRYPOINT/CMD)- 主进程(PID 1)启动,容器进入运行状态
执行阶段
- 主进程及其子进程运行
- 可通过
docker exec创建额外进程
停止阶段
docker stop:向 PID 1 发送 SIGTERM→等待→SIGKILL- 进程树被强制终止(若未优雅退出)
销毁阶段
docker rm:删除容器层(读写层)和运行时资源
容器的生命周期绑定于 PID 1 进程
数据持久化
| 特性 | Docker Volume | Bind Mount |
|---|---|---|
| 存储位置 | Docker 管理区域 (/var/lib/docker/volumes/) | 宿主机任意路径 |
| 创建方式 | docker volume create 或隐式创建 | 直接指定宿主机路径 |
| 生命周期 | 独立于容器 | 依赖宿主机文件系统 |
| 数据所有权 | Docker 管理,自动权限处理 | 需手动管理权限 |
| 备份迁移 | 标准 Docker 工具支持 | 依赖宿主机工具 |
| 性能 | 接近原生 | 原生性能 |
| 多容器共享 | 原生支持 | 需要协调路径 |
| 适用场景 | 生产环境数据库、应用数据 | 开发环境、配置文件、单机部署 |
容器 VS VM
| 特性 | VM | 容器 |
|---|---|---|
| 硬件资源 | 需要Guest OS | 不需要Guest OS,进程级别的隔离 |
| 启动速度 | 慢 | 快 |
| 隔离效果 | 好 | 差 |