分类目录归档:操作系统

Docker资源管理探秘-Cgroups机制

随着Docker技术被越来越多的个人、企业所接受,其用途也越来越广泛。Docker资源管理包含对CPU、内存、IO等资源的限制,但大部分Docker使用者在使用资源管理接口时往往只知其然而不知其所以然。

本文将介绍Docker资源管理背后的Cgroups机制,并且列举每一个资源管理接口对应的Cgroups接口,让Docker使用者对资源管理知其然并且知其所以然。

继续阅读

C语言中内存堆和栈的区别

在计算机领域,堆栈是一个不容忽视的概念,我们编写的C语言程序基本上都要用到。但对于很多的初学着来说,堆栈是一个很模糊的概念。

堆栈:一种数据结构、一个在程序运行时用于存放的地方,这可能是很多初学者的认识,因为我曾经就是这么想的和汇编语言中的堆栈一词混为一谈。我身边的一些编程的朋友以及在网上看帖遇到的朋友中有好多也说不清堆栈,所以我想有必要给大家分享一下我对堆栈的看法,有说的不对的地方请朋友们不吝赐教,这对于大家学习会有很大帮助。

继续阅读

Docker的内核知识之Namespace资源隔离

Docker这么火,喜欢技术的朋友可能也会想,如果要自己实现一个资源隔离的容器,应该从哪些方面下手呢?也许你第一反应可能就是chroot命令,这条命令给用户最直观的感觉就是使用后根目录/的挂载点切换了,即文件系统被隔离了。然后,为了在分布式的环境下进行通信和定位,容器必然需要一个独立的IP、端口、路由等等,自然就想到了网络的隔离。同时,你的容器还需要一个独立的主机名以便在网络中标识自己。想到网络,顺其自然就想到通信,也就想到了进程间通信的隔离。可能你也想到了权限的问题,对用户和用户组的隔离就实现了用户权限的隔离。最后,运行在容器中的应用需要有自己的PID,自然也需要与宿主机中的PID进行隔离。

继续阅读

Docker的内核知识之cgroups资源限制

上一篇,我们了解了Docker背后使用的资源隔离技术namespace,通过系统调用构建一个相对隔离的shell环境,也可以称之为一个简单的“容器”。本文我们则要开始讲解另一个强大的内核工具-cgroups。他不仅可以限制被namespace隔离起来的资源,还可以为资源设置权重、计算使用量、操控进程启停等等。在介绍完基本概念后,我们将详细讲解Docker中使用到的cgroups内容。希望通过本文,让读者对Docker有更深入的了解。

继续阅读

Docker 资源(cpu、memory)限制实践篇

写这篇的目的是为了搞清楚,在docker中的一些设置项,对容器资源(cpu、memory)产生的影响和对比,从网络中了解到docker容器的资源限制是通过cgroup来实现的。cgroup是control group的简称,是Linux内核2.6.24引入的一个新特性 ,用来限制、分离和报告一个进程组的资源(CPU、内存、磁盘输入输出等)。常用的ulimit只能基于用户或者用户组来进行资源限制,不能够针对某一进程作出详细限制,缺乏灵活度。

继续阅读

Docker create / Docker run 的选项详解

本文不止针对docker create 和 run 的选项解释,其实对以下几个指令的选项,同样有帮助和理解。

  • dockerd 启动docker engine
  • docker create / run / update 容器的创建和修改
  • daemon.json配置文件
  • docker service create 集群服务的创建
  • docker service update 集群服务的更新

继续阅读

Docker的实践笔记

学Docker差不多两个星期了,主要学习container、image、volume、network、plugin、system这六个部分,今天想通过以上的学习,制作一个centos + nginx + php7的镜像。

继续阅读

Docker network的网络特性

Docker在1.9版本中引入了一整套的自定义网络命令和跨主机网络支持。这是libnetwork项目从Docker的主仓库抽离之后的一次重大变化。不论你是否已经注意到了,Docker的网络新特性即将对用户的习惯产生十分明显的改变。

继续阅读

Docker中的镜像构建-Dockerfile指令详解

我们可以了解到,镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么之前提及的无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是 Dockerfile。

Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。

继续阅读

Docker的命令之数据卷管理 Volume

数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS(UNIX文件系统的简称),可以提供很多有用的特性:

  • 数据卷可以在容器之间共享和重用
  • 对数据卷的修改会立马生效
  • 对数据卷的更新,不会影响镜像
  • 数据卷默认会一直存在,即使容器被删除

Tips 1:数据卷的使用,类似于 Linux 下对目录或文件进行 mount,镜像中的被指定为挂载点的目录中的文件会隐藏掉,能显示看的是挂载的数据卷。

继续阅读

Docker的命令之系统管理 Docker system

Docker system是Docker 1.13引进了新的管理命令,它有4个子命令分别是 df, events, info 和 prune 。命令 docker system df 提供Docker整体磁盘使用率的概况,包括镜像、容器和(本地)volume。所以我们现在随时都可以查看Docker使用了多少资源。
如果之前的命令展示出 docker 已经占用了太多空间,我们会开始清理。有一个包办一切的命令:

docker system prune

这个命令会删除当前没有被使用的一切项目,它按照一种正确的序列进行清理,所以会达到最大化的输出结果。首先删除没有被使用的容器,然后是volume和网络,最后是挂起的镜像。通过使用 y 回复来确认操作。如果想在脚本中使用这个命令,可以使用参数 –force 或者 -f 告诉Docker不要发来确认请求。

继续阅读

Docker的命令之集群管理 swarm

Swarm 是提供 Docker 容器集群服务,是 Docker 官方对容器云生态进行支持的核心方案。使用它,用户可以将多个 Docker 主机封装为单个大型的虚拟 Docker 主机,快速打造一套容器云平台。

作为容器集群管理器,Swarm 最大的优势之一就是 100% 支持标准的 Docker API。各种基于标准 API 的工具比如 Compose、docker-py、各种管理软件,甚至 Docker 本身等都可以很容易的与 Swarm 进行集成。这大大方便了用户将原先基于单节点的系统移植到 Swarm 上。同时 Swarm 内置了对 Docker 网络插件的支持,用户可以很容易地部署跨主机的容器集群服务。

继续阅读

Docker的命令之集群服务管理 Service

应该说docker service是swarm(docker集群)最重要的管理指令,可以实现部署运行服务、服务扩容缩容、删除服务、滚动更新等功能,学习本章节的内容尤其重要,本文将详细展开docker service 中的每一个选项的用法,不同于介绍其他的docker指令。

在Swarm集群上部署服务,必须在Manager Node上进行操作。先说明一下Service、Task、Container(容器)这个三个概念的关系,如下图(出自Docker官网)非常清晰地描述了这个三个概念的含义:

继续阅读

Docker的命令之安全管理 Docker secret

集中式管理Docker 容器需要使用的敏感信息,包括密码,证书等,敏感信息不会保存在镜像中,compose模版也可以不需要显式填写密码等敏感信息,只需要引用密码对象的名称。实现的方式是通过把密码等敏感信息以文件的方式挂载到容器的/run/secrets/目录内,使用该特性的镜像需要支持通过文件读取的方式来使用敏感信息的能力。

继续阅读

Docker的命令之插件管理 Plugin

Docker的一个重要特性是开箱即用,“开箱即用”是指什么呢?简单来说,安装好Docker就可以马上使用。不需要任何额外的操作,诸如网络、进程、文件系统隔离等繁杂事情也不在你担心的范围内。

不过,经过一段时间的使用,你可能开始会考虑更多——诸如自定义网络,自定义保留IP地址,分布式文件系统等等。这些需求会在你将Docker应用到生产或者做进一步准备时候浮现而出。

幸运的是,Docker不仅仅是开箱即用,其中的功能点也是可以进行调整的。如何调整呢?通过Docker的插件!

继续阅读

Docker的命令之集群节点管理 Swarm node

节点(Node)为swarm(docker 集群)中的一个Docker Engine实例。其中管理节点(Manager Node)负责swarm管理并向工作节点分配任务;工作节点(Work Node)接受并执行来自管理节点的Task。简单可理解为一个Node就是一台Docker宿主机。

关于Swarm的介绍,参考:Docker的命令之集群管理 swarm,docker node的指令管理docker集群中的节点,docker swarm 管理整个docker集群的指令,docker  node 管理docker集群中节点的指令,集群中的节点包括worker和manager两种类型的节点。

继续阅读