第1页
docker 原理与应用实践
docker 原理与应用实践
张成远
www.jd.com
第2页
Agenda
• 容器系统整体架构 • Namespace • CGroup • Device Mapper • Pull Image • Start Container • Stop Container • Docker Image Storage
第3页
容器系统整体架构
第4页
Namespace
• 提供进程级别的资源隔离 • 为进程提供不同的命名空间视图 • 与虚拟机不同
第5页
Namespace 概念及当前支持的种类
• mnt (Mount points) • pid (Processes) • net (Network stack) • ipc (System V IPC) • uts (Hostname) • user (UIDS)
第6页
Namespace 实现
第7页
Namespace 使用接口 • 创建新进程及 namespace
• 加入当前进程到新建 namespace 中 • 改变当前进程的 namespace
第8页
CGroup
• 提供进程的资源管理功能 • 资源管理主要涉及内存 ,CPU,IO 等 • 不依赖于 Namespace ,可单独使用 • 管理功能通过 VFS 接口暴露 • CGroups 提供通用框架,各子系统负责实现
第9页
CGroups IO 子系统
• blkio — 块设备 I/O 限制 • cpu — CPU 限制 • cpuacct — 自动生成 CPU 使用报告 • cpuset — 限定所使用的核 • memory — 限制内存 • devices— 控制任务访问设备 • freezer— 挂起 / 恢复任务
第10页
Device Mapper
• DM 框架为上层应用提供了丰富的设备映射及 IO 策 略方面的支持
• Docker 存储端实现之一使用 DM - thin provision • 上层通过 dmsetup 工具或 libdevmapper 库使用
第11页
Device Mapper
第12页
Docker storage driver
• Docker 支持 Aufs,Btrfs,DM 等 • 由于 DM 基于设备层,对上层文件系统 layer Diff
无法直接支持, Docker 手工比对文件实现 • 启动 docker 如果未指定 stroage driver ,依据 os
依次选择 aufs 、 btrfs 、 devicemapper
第13页
DM thin-provision
• many virtual devices to be stored on the same volume
• an arbitrary depth of recursive snapshots • metadata is stored on a seperate device from
data
第14页
DM-thin provision example
• dd if=/dev/zero of=metadata bs=1024k count=128
• dd if=/dev/zero of=data bs=1024k count=1024
• losetup /dev/loop7 metadata • losetup /dev/loop6 data • dmsetup create pool --table "0 20971520
thin-pool /dev/loop7 /dev/loop6 128 512"
第15页
DM-thin provision example
• dmsetup message /dev/mapper/pool 0 "create_thin 0"
• dmsetup create thin --table "0 2097152 thin /dev/mapper/pool 0"
• mkfs.ext4 /dev/mapper/thin • mount /dev/mapper/thin /export
第16页
Docker storage driver—DM thin provision
• data 和 metadata 需要两个块设备 • truncate 生成文件, loop 设备 • dm.loopdatasize=100G • dm.basesize=10G • dm.datadev 指定 pool 使用的设备 • dm.metadatadev 指定 metadata 使用的设备 • dd if=/dev/zero of=$metadata_dev bs=4096
count=1
第17页
Pull Image
第18页
Start Container
第19页
Stop Container
第20页
Start Docker& Start Container
第21页
Start/Stop Container 注意点
• docker 退出时会依次 stop 各个 container • Start container 时 mount 相关设备 • Stop container 时, monitor 会做清理工作 • docker 异常停止时,各个 container 对应的
namespace 等相关信息依然存在 • docker 启动时候会将之前的 container stop ,但
umount 失败, start container 会失败
第22页
JD image storage system
第23页
小结
• 当前 Namespace 功能仍不完善,需要更多的隔离 • Docker 主要用到 CGroup 的一部分子系统 • Docker 存储端仍需做一些选择或工作 • 选择 DM thin-provision 时需要注意 data 及
metadata 的设置 • docker start/stop 之间的交互及扫尾工作 • image 本地存储与 dm 之间的关系 • Docker Registry Storage 需要选择开源或定制开发
第24页
广告篇
第25页
广告篇
Docker RDS Linux kernel Golang SDN/Network
联系方式: • zhanchengyuan@jd.com
第26页
Q&A
谢谢
微博: @NEU_ 寒水
www.jd.com