Docker初体验-基础入门指北

2016-11-21 18:08:35

docker是什么

docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口

docker做什么

在docker中,你可以将你的程序分为不同的基础部分,对于每一个基础部分都可以当做一个应用程序来管理
docker能够帮助你快速地测试、快速地编码、快速地交付,并且缩短你从编码到运行应用的周期
docker使用轻量级的容器虚拟化平台,并且结合工作流和工具,来帮助你管理、部署你的应用程序

docker vs VM

VMs = Server + Host OS + Hypervisor(Type2)+ Guest OS + Bins/Libs +(App A | App A’ | App B)
Containers = Server + Host OS + Docker Engine + ((Bins/Libs +App A | App A’) | (Bins/Libs +App B))
Docker去除了传统虚机的Guest OS层,免除了对应overhead,Docker Engine 替代了VM中的Guest OS + Hypervisor(Type2)层

docker架构

docker是CS架构,主要由下面三部分组成:
docker daemon: 运行在宿主机上,docker守护进程,用户通过docker client(docker命令)与docker daemon交互
docker client: docker 命令行工具,是用户使用docker的主要方式,docker client与docker daemon通信并将结果返回给用户,docker client也可以通过socket或者RESTful api访问远程的docker daemon
docker hub/registry: 共享和管理docker镜像,用户可以上传或者下载上面的镜像,官方地址为 https://registry.hub.docker.com ,也可以搭建自己私有的docker registry

docker技术术语

docker的几个技术:namespace,cgroups,veth,bridge,copy-on-write,image,container
其中namespace和cgroup是其核心技术,我们主要来介绍这两个

a. namespace

负责隔离资源,它让进程拥有独立的进程号,网络,文件系统等,不同的namespace下的进程互不可见,目前的Docker可以通过exec子命令直接切换到进程所在的namespace
docker使用到的命名空间有:

  • pid命名空间: 使用在进程隔离(PID: Process ID)
  • net命名空间: 使用在管理网络接口(NET: Networking)
  • ipc命名空间: 使用在管理进程间通信资源 (IPC: InterProcess Communication)
  • mnt命名空间: 使用在管理挂载点 (MNT: Mount)
  • uts命名空间: 使用在隔离内核和版本标识 (UTS: Unix Timesharing System)

b. cgroups

cgroup负责限制资源,主要体现在cpu、内存、磁盘

CPU子系统
cgroups提供了三种限制CPU资源的方式:cpuset, cpuquota和cpushares

  • cpuset可以限制进程使用的cpu核数,通过cpuset/cpuset.cpus来管理,相应的命令如下

    1
    docker run --cpuset-cpus 0 -d --name apache apache
  • cpuquota以时间片的使用率来限制CPU资源,要比cpuset的细粒度大一些,只需要设置一个相对100000的值就可以达到限制一个百分比的效果, 通过 cpu/cpu.cfs_period_us (配置时间片单位,默认为100000)和 cpu/cpu.cfs_quota_us (时间片占比)两个文件来管理,相应的命令如下

    1
    docker run --cpu-quota 50000 -d --name apache apache
  • cpushares根据权重来分配CPU资源,比如如果只有一个进程权重为100,那么进程可以使用100%的CPU资源,如果有两个进程且权重都是100,那么每个进程可以使用50%的CPU资源 , 通过 cpu/cpu.shares 来管理,相应的命令如下

    1
    docker run --cpu-shares 1024 -d --name apache apache

内存子系统

  • cgroups对内存的限制包括物理内存和swap,当进程使用内存达到上限时会被kill,关于内存限制的文件如下:
    memory.limit_in_bytes memory.soft_limit_in_bytes memory.memsw.limit_in_byte,需要注意的一点是docker默认会将swap的限制设置为2倍内存,实际使用的内存可能会大于 -m 设置的内存大小,相应的docker命令
    1
    docker run -m 100m -d --name apache apache

blkio子系统

  • blkio子系统的功能是对块设备读写的速率限制,目前 blkio 子系统提供的两种控制策略,一个是权重比例方式的控制,另一个是针对 IO 带宽和 IOPS 的控制.前者是针对blkio.weight 分配权重,后者对blkio.throttle.write_iops_device 进行限制。

ref

Docker 百度百科


您的鼓励是我写作最大的动力

俗话说,投资效率是最好的投资。 如果您感觉我的文章质量不错,读后收获很大,预计能为您提高 10% 的工作效率,不妨小额捐助我一下,让我有动力继续写出更多好文章。