AI APPLICATION ENGINEERING · 08
认识虚拟机与容器、Docker 运行组件、镜像、容器、命令和构建流程。
- Docker
- 容器
本文目录
Docker 基础与常用操作
认识虚拟机与容器、Docker 运行组件、镜像、容器、命令和构建流程。
3. 虚拟机和Docker有什么区别?
| 维度 | 虚拟机(VM) | Docker容器 |
|---|---|---|
| 虚拟化层级 | 虚拟化整个硬件层,包含完整操作系统 | 基于操作系统内核,共享宿主机内核 |
| 资源占用 | 重,每个VM需要独立OS,占用GB级空间 | 轻,容器共享内核,通常MB级大小 |
| 启动速度 | 慢(分钟级) | 快(秒级) |
| 性能损耗 | 较大,有Hypervisor层开销 | 接近原生性能 |
| 隔离性 | 强,完全隔离 | 较弱,共享内核(通过namespace和cgroup隔离) |
| 镜像管理 | 完整系统镜像,体积大 | 分层镜像,体积小,便于分发 |
| 代表技术 | VMware、VirtualBox、KVM | Docker、Containerd |
4. Docker运行时有哪些组件?
| 组件 | 说明 |
|---|---|
| Docker Daemon(dockerd) | Docker守护进程,负责管理容器的生命周期、镜像、网络、存储等 |
| containerd | 容器运行时的高层管理组件,负责容器生命周期管理、镜像分发等 |
| runc | 底层容器运行时,直接与Linux内核交互,执行实际的容器创建和运行(基于OCI标准) |
| Docker CLI(docker) | 命令行客户端,用户通过它与Docker Daemon交互 |
| Docker Registry | 镜像仓库,存储和分发Docker镜像(如Docker Hub、私有Registry) |
| Docker API | 暴露RESTful API供CLI和第三方工具调用 |
调用链:Docker CLI → Docker Daemon → containerd → runc → Linux Kernel
5. docker pull 命令从客户端到服务端是怎么执行的?
执行流程:
1. 用户执行 docker pull nginx
2. Docker CLI 将请求发送给本地 Docker Daemon(dockerd)
→ 通过 Unix Socket 或 TCP 连接通信
3. Docker Daemon 收到请求后,委托给 containerd 处理
4. containerd 查找本地是否已有该镜像的缓存层
5. 若无缓存或需要更新,containerd 向配置的 Registry(默认Docker Hub)
发起 HTTPS 请求,获取镜像的 manifest(清单文件)
6. 解析 manifest,获取镜像的所有层(layer)信息
7. 逐层下载(并行),每层通过 digest(SHA256哈希)校验完整性
8. 下载的层存入本地存储(通常在 /var/lib/docker/ 目录下)
9. 所有层下载完成后,组装为完整的镜像,注册到本地镜像列表
10. 返回成功信息给 CLI,显示 Pull complete
6. Docker的镜像和容器的概念和联系
镜像(Image):
- 一个只读的模板,包含了运行应用所需的所有内容:代码、运行时、库、环境变量、配置文件
- 采用分层存储(Union File System),每一层对应一次构建指令
- 镜像是静态的,不可修改
容器(Container):
- 镜像的运行实例
- 在镜像的只读层之上添加一层可写层(Copy-on-Write)
- 容器是动态的,有生命周期(创建、运行、停止、删除)
联系:
镜像 → (docker run) → 容器
类比:类(Class) → 实例化 → 对象(Object)
- 一个镜像可以创建多个容器
- 容器停止后,可写层数据保留(除非删除容器)
- 容器的修改不会影响原始镜像
7. 你都知道哪些Docker命令?
镜像相关:
docker pull <image> # 拉取镜像
docker build -t <name> . # 构建镜像
docker images # 列出本地镜像
docker rmi <image> # 删除镜像
docker tag <image> <tag> # 给镜像打标签
docker push <image> # 推送镜像到仓库
容器相关:
docker run -d -p 8080:80 <image> # 创建并运行容器
docker ps # 查看运行中的容器
docker ps -a # 查看所有容器
docker stop <container> # 停止容器
docker start <container> # 启动容器
docker restart <container> # 重启容器
docker rm <container> # 删除容器
docker exec -it <container> bash # 进入容器终端
docker logs <container> # 查看容器日志
docker inspect <container> # 查看容器详细信息
其他:
docker compose up -d # 启动编排服务
docker compose down # 停止并移除编排服务
docker system prune # 清理无用资源
docker volume ls # 查看存储卷
docker network ls # 查看网络
8. Docker镜像构建步骤
- 编写 Dockerfile:
FROM python:3.11-slim # 基础镜像
WORKDIR /app # 设置工作目录
COPY requirements.txt . # 复制依赖文件
RUN pip install -r requirements.txt # 安装依赖
COPY . . # 复制源代码
EXPOSE 8000 # 声明端口
CMD ["python", "app.py"] # 启动命令
- 执行构建命令:
docker build -t myapp:v1 .
-
构建过程:
- Docker 读取 Dockerfile,逐行执行指令
- 每条指令生成一个镜像层(Layer),有独立的缓存
- 若某层未变化,会使用缓存(Build Cache),加速构建
- 最终所有层叠加形成完整镜像
-
验证:
docker run -p 8000:8000 myapp:v1
优化要点:合理排序指令(频繁变化的放后面)、使用 .dockerignore、合并 RUN 指令减少层数、使用多阶段构建减小镜像体积。