Docker 粉们,是否还记得上一个 Docker 大版本的发布是什么时候?你的记忆是否已经模糊? 答案是: 10 月 14 号 在中国春节即将到来之际,Docker 官方发布了跨时代的 Docker 1.10.0 版本,着实为猴年的到来献上了一份大礼。 如果说 Docker 1.9.0 的 overlay 网络意味着 Docker 在集群能力方面的质的飞跃,那么这次发布的 Docker 1.10.0 更是在多个方面实现重大突破。 总体而言,我认为这次新发布的 Docker 1.10.0 主要有以下这几方面意义非凡的变化和看点: - Docker Engine 支持配置热更新,容器与 Docker Daemon 的耦合性大大降低
- Docker API 的完善程度稳步上升,容器隔离维度更细致、更全面
- Docker 安全划时代地支持了 User Namespace 与 seccomp,安全程度直逼虚拟机
- 镜像格式首推「内容寻址方式」,可以做到 Docker 镜像的全球唯一性,镜像的安全与存储都有大的改观
- 网络能力,无论单机,还是跨主机,功能逐渐完善,成熟度稳步提升,发展之迅速不得不令人佩服
- 稍显惋惜的是,传统的容器管理工具 LXC 即将退出 Docker 的舞台,伴随 Docker 接近三年的时间,终于被更完善的容器管理方案取代,同时 Docker 的飞速发展以及追求卓越也一览无余
看完 Docker 1.10.0 的主要变化,我们来看一下这一版本更为细节的变化,相信 Docker Engine、安全、Distribution、网络、日志、存储卷 Volume 等多方面,总有一款适合您。详情请见下文: 1. Docker Engine(Runtime) 开发了新命令docker update,允许用户更新运行中容器的资源限制(对于资源的重分配意义很大,后期可以考虑集成) 为docker run命令添加 flag 参数–tmpfs,用于为容器挂载一个内存文件系统,便于文件的快速读写 为docker images命令添加 flag 参数–format 允许用户在文件中配置 Docker Daemon 的运行参数,并通过 SIGHUP 信号对其进行热加载,换言之,Docker 开始支持动态加载配置参数 更新docker events命令的内容输出,使其包含更多的元数据以及事件类型;但是,需要注意的是,此改动完全兼容 Docker 的 API,但是在 Docker CLI 中仍未支持 为docker run命令添加 flag 参数–blkio-weight-device 为docker run命令添加 flag 参数–device-read-bps和–device-write-bps,用于磁盘 I/O 的读写 BPS 为docker run命令添加 flag 参数–device-read-iops和–device-write-iops,用于磁盘 I/O 的 iops 为docker run命令添加 flag 参数–oom-score-adj,用于容器进程发生 oom 现象时,如何选择 kill 进程的评分依据 为命令run、attach、start以及exec添加 flag 参数–detach-keys,以此来覆盖从容器退出的的默认键盘键,比如使用 Docker 客户端自定义的 ctrl+a 来作为这些命令的 ESC 键 为docker run、docker create以及docker build命令添加–shm-size,用于动态内存文件系统的大小(/dev/shm 等同于 tmpfs) 丰富docker info命令的输出内容,为其添加运行容器的数目,停止容器的数目以及挂起容器的数目 丰富docker info命令的输出内容,为其添加操作系统类型以及机器结构 为docker daemon命令添加 flag 参数–cgroup-parent,从而为所有容器设置父 cgroup,即挂载于制定的 cgroup 路径下 为docker cp命令添加 flag 参数-L,使得cp命令不是仅仅拷贝符号链接,而是拷贝符号链接真实指向的内容 新增过滤规则status=dead,使命令docker ps的输出更符合用户需求 更改docker run命令的返回码(exit code),从而区分在命令返回的原因究竟是 Docker Engine 的错误,还是容器内部应用自身的错误 扩展docker events命令中添加–since和–util参数后的内容输出,使其支持时区以及纳秒 为docker stats命令添加 flag 参数-a/–all,用于显示运行中容器以及停止容器的资源使用 将默认的 cgroup-driver 设置为cgroupfs 当使用docker build -t命令为某一镜像设置标签时,Docker Daemon 触发一个 tag 事件;换言之,Docker Daemon 新支持一种 tag 事件 重新启动 Docker Daemon 时,尽最大的努力来合理安排 link 容器的启动顺序 允许docker build命令为镜像设置多个标签(tag) 对任意 url 请求添加 OPTIONS 请求,而不是修改跨域存在的问题 修复docker build命令的 flag 参数–quiet,使其真正意义上实现 quiet,即不输出构建过程的内容 修复命令docker images –filter dangling=false,现在真正意义上显示的是所有的 non-dangling 镜像 修复命令docker volumes ls –filter dangling=false,现在真正意义上显示的是所有的 non-dangling 的存储卷 修复重启容器时因为容器内部进程长时间处理 SIGTERM 信号未果儿存在的资源竞争 BUG Docker Daemon 中加入了 IBM 公司的的共享文件系统 GPFS 修复 Bug,使得 volume driver 不允许被容器化 删除容器过程中,不删除有命名的挂载点 修复阻止容器启动的某些不知名 Bug 禁止在重启过程中对容器执行docker exec操作 devicemapper 方面,当 Docker Daemon 重启过程中–storage-opt dm.basesize参数的增长会导致基础设备存储空间的增长
2. 安全 - 为 Docker Daemon 命令添加 flag 参数–userns-remap,用以支持 Linux Namespace 中的用户命名空间(User Namespace),之前 Docker 对于用户命名空间的支持仅仅存在于 Docker 试验版
在docker run命令的 flag 参数–security-opt中,添加对自定义 seccomp 文档的支持,主要用户对容器应用在系统调用方面实现沙箱化 为 Docker 添加默认的 seccomp 文档,在容器的系统调用方案实现更为细粒度的隔离 为docker daemon命令添加 flag 参数–authorization-plugin,用以支持自定义的访问控制列表(ACL) 当用户使用 BTRFS 时,允许用户在容器中运行 SELinux
3. Distribution 为 AuthConfig 数据结构添加一个名为registryToken的属性。该 Token 属性允许 API 客户端从一个镜像仓库中获取用户的认证 token,然后将 token 直接发给远程 API 对镜像和镜像层实现内容寻址的存储方式。内容寻址指的是,通过镜像层的内容来唯一的决定一个镜像的 ID,从而保证镜像的全局唯一性。需要注意的是:当 Docker 第一次运行的时候,会有一个对原有镜像进行格式转换的过程。此过程很可能会占用很长时间,主要取决于当前 Docker Daemon 所管理镜像以及容器的数目大小。从此,镜像中不再有parent image的概念,而是指向一系列的镜像层引用。同时docker load/docker save的压缩包现在会包含内容寻址镜像的配置文件 支持新的 menifest 格式(schema2) 对镜像下载和镜像上传做了众多改善,比如:性能的提高,下载失败时的重试机制,客户端失联的取消操作等 对镜像仓库 v1 协议的回调限制 新版的 Notary 支持,其中包含了客户端的 pkcs11。P.S. notary 是 Docker 一款官方推出的在客户端和服务端通过受信集合来交互的工具 修复 Bug,此 Bug 在先前的版本中出现时会导致 Docker Daemon 因为等待一个并不存在的进程去下拉镜像而僵死
4. 网络 对于容器而言,使用基于 DNS 的发现机制,取代原先的 /etc/hosts 方式 对docker network connect命令中添加网络方面的别名,如–net-alias,以及docker run命令时的–alias 为docker run以及docker network connect命令添加参数–ip和–ip6,用以在一个网络中为容器自定义 IP 为docker network create命令添加参数–ipam-opt,用于传入自动的 IP 地址管理(IPAM)的选项 在–cluster-store-opt参数中添加kv.path 在–cluster-store-opt参数中添加discovery.heartbeat和discovery.ttl参数,用于配置服务发现的 TTL 以及心跳周期 为docker network inspect命令添加–format参数 为docker network connect命令添加–link参数,用以提供容器级别的别名 通过远程 IP 地址管理器(IPAM)插件的形式 为docker network disconnect命令添加–force参数,用以强制容器从某个 network 中断开连接 在 Linux 内核版本 3.10+ 上,使用内嵌的 overlay 驱动来完成跨主机的网络互联 在用户定义的 network 中,支持在docker run命令中使用–link参数 扩展docker network rm命令,使其有能力一次删除多个 network 在docker inspect命令的输出内容中添加所有容器的名称 在docker network inspect命令中,加入为用户自定义网络自动生成的子网地址 为docker network ls命令添加 flag 参数–filter,用以隐藏预先定义的 networks 支持已停止容器的 network 连接/断开功能
在docker inspect命令的返回结果中添加 network id 修复 MTU 的 bug,之前版本 Docker 在有两条或者两条以上路由记录时启动就会失效 为容器修复重复 IP 地址的 bug 修复了有时 Docker Daemon 在创建默认网络时存在的 bug 在使用–net=host参数时,不为容器替换 127.0.0.1 的域名服务器地址
5. 日志 新增日志驱动 Splunk 在 TCP+TLS 的基础上,完善对 Syslog 的支持 扩展docker logs –since和–until命令,用以支持纳秒 扩展日志驱动awslogs,使其当 Docker Daemon 在 AWS EC2 上运行时,可以自动监测正确的 Amazon CloudWatch 的日志时区
6. 存储卷 Volumes 7. 镜像构建器(builder) 8. 客户端 - 通过使用DOCKER_API_VERSION环境变量来支持API版本覆盖的支持
9. MISC - systemd:在systemd服务的配置文件中,为LimitNPROC添加TaskMax参数
10. 遗弃 从 Docker Daemon 移除对 LXC 的支持,在 docker 1.8 版本时,Docker 用来管理容器的驱动之一——LXC 驱动就已经被标记为 deprecated,现在此驱动已经被移除 在docker daemon命令中移除 flag 参数–exec-driver,因为此驱动已经不再会被使用 移除部分 Docker CLI 方面的参数,比如(-rm,选择用–rm来替代) 在容器启动的 API 中遗弃数据结构 HostConfig 由于某些特定 Linux 版本发行版项目的终止,从而遗弃这些项目下 docker 软件包的支持;比如 Fedora 21 和 Ubuntu 15.04(vivid) 遗弃docker tag命令的-f参数
备注:本文来自DaoCloud供稿,独家授权发布,作者孙宏亮,DaoCloud技术合伙人,主要负责DaoCloud企业级容器云平台的研发。目前已出版《Docker 源码分析》一书,也是国内第一批研究及实践Docker的工程师,同时也是国内社区极具影响力的Docker布道者。 |