Docker基本管理
1. 概述
1.1 特点
- Docker是一个用go语言开发并遵循apache2.0协议的开源应用容器引擎。
- Docker是在Linux容器里运行应用的开源工具,是一种轻量级的“虚拟机”。
- Docker的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的、可移植的、自给自足的容器。
- Docker的Logo设计为拖着许多集装箱的蓝色鲸鱼。如果鲸鱼看作为宿主机,集装箱可理解为相互隔离的容器,每个集装箱中都包含自己的应用程序。
- Docker的设计宗旨:Build,Ship and Run Any App,Anywhere。即通过对应用组件的封装、发布、部署、运行等生命周期的管理来达到应用组件级别的“一次封装,到处运行”的目的。这里的组件既可以是一个应用,也可以是一套服务,甚至是一个完整的操作系统。
1.2 容器化
- 灵活:即使是最复杂的应用也可以集装箱化。
- 轻量级:容器利用并共享主机内核。
- 可互换:可以即时部署更新和升级。
- 便携式:可以在本地构建,部署到云,并在任何地方运行。
- 可扩展:可以增加并自动分发容器副本。
- 可堆叠:可以垂直和即时堆叠服务。
1.3 Docker与虚拟机的区别
- 容器在本机上的linux运行与其他容器共享的主机内核,但运行的是一个独立的进程,不占用其他任何可执行文件的内存。
- 虚拟机运行的是一个完整的操作系统,通过虚拟机管理程序对主机资源进行虚拟访问,相比之下需要的资源更多。
- docker本质是宿主机的一个进程,docker是通过namespace实现资源隔离,通过cgroup实现资源限制,通过写时复制技术(copy-on-write)实现了高效的文件操作(相当于比如虚拟机的磁盘分配500g并不是实际占用物理磁盘500g)。
1.4 核心概念
1.4.1 镜像
- Docker的镜像是创建容器的基础。类似虚拟机的快照,可以理解为一个面向Docker容器引擎的只读模板。
- 镜像是用来启动一个容器的可执行的包,其中包括运行应用程序所需要的所有内容包含代码,包括运行时间,库、环境变量、和配置文件。
- 镜像同时也是一个压缩包。这个压缩包不只是可执行文件,它还包含了完整的操作系统。因为大部分的镜像都是基于某个操作系统来构建,所以可以轻松在本地构建和远端一样的环境,这也是Docker镜像的精髓。
1.4.2 容器
- Docker的容器是从镜像创建的运行实例,可以被启动、停止和删除。所创建的每一个容器都相互隔离,以此保证平台的安全性。
- 可以把容器看做是一个简易版的linux环境(包括root用户权限、镜像空间、用户空间和网络空间等)和运行在其中的应用程序。
1.4.3 仓库
Docker仓库是用来集中保存镜像的地方。创建镜像之后可以使用push命令将它上传到公有仓库(Public)或者私有仓库(Private)。当下次在另外一台机器上使用这个镜像时,可以只需从仓库获取。
Docker的镜像、容器、日志等内容全部都默认存储在/var/lib/docker
2. Docker容器操作
2.1 容器创建
即将镜像加载到容器的过程。新创建的容器默认处于停止状态,不运行任何程序时需要在其中发起一个进程来启动容器。
2.2 启动容器
-
直接执行docker run命令, 等同于先执行docker create命令,再执行docker start命令。
注意:容器是与其中运行的shell命令共生的终端,命令运行容器运行, 命令结束容器退出。
-
docker容器默认把容器内部第一个进程,也就是pid=1的程序作为docker容器正在运行的依据。如果docker容器中pid=1的进程结束,那么docker容器便会直接退出,也就是说Docker容器中必须有一个前台进程。
2.3 运行过程
- 检查本地是否存在指定的镜像。当镜像不存在时从公有仓库下载。
- 利用镜像创建并启动一个容器。
- 分配一个文件系统给容器,在只读的镜像层外面挂载一层可读写层。
- 从宿主主机配置的网桥接口中桥接一个虚拟机接口到容器中。
- 分配一个地址池中的IP地址给容器。
- 执行用户指定的应用程序,执行完毕后容器被终止运行。
3. Docker网络
3.1 实现原理
- Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP;同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。
- Docker网桥不是真实存在的网络设备而是宿主机虚拟出来的,因此外部网络无法直接通过Container-IP访问到容器。如果希望外部能够访问容器,可以通过映射容器端口到宿主主机(端口映射),即docker run创建容器时候通过-p或-P参数来启用,访问容器的时候就能通过[宿主机IP]:[容器端口]访问容器。
3.2 模式
- Host:容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
- Container:创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围。
- None:该模式关闭了容器的网络功能。
- Bridge:默认为该模式,此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,通过docker0网桥以及iptables nat 表配置与宿主机通信。
4. 资源控制
4.1 cgroups功能
cgroups(Control groups)是一个非常强大的linux内核工具,它不仅可以限制被namespace隔离起来的资源, 还可以为资源设置权重、计算使用量、操控进程启停等等,从而实现了对资源的配额和度量。
- 资源限制:可以对任务使用的资源总额进行限制
- 优先级分配:通过分配的cpu时间片数量以及磁盘IO带宽大小,实际上相当于控制了任务运行优先级
- 资源统计:可以统计系统的资源使用量,如cpu时长,内存用量等
- 任务控制:cgroup可以对任务执行挂起、恢复等操作
4.2 CPU资源控制
- 设置CPU使用率上限
Linux通过CFS(Completely Fair Scheduler,完全公平调度器)来调度各个进程对CPU的使用。CFS默认的调度周期是100ms。
我们可以设置每个容器进程的调度周期,以及在这个周期内各个容器最多能使用多少 CPU 时间。
使用 --cpu-period 即可设置调度周期,使用 --cpu-quota 即可设置在每个周期内容器能使用的CPU时间。两者可以配合使用。
CFS 周期的有效范围是 1ms~1s,对应的 --cpu-period 的数值范围是 1000~1000000。 周期100毫秒
而容器的 CPU 配额必须不小于 1ms,即 --cpu-quota 的值必须 >= 1000。 - 设置CPU资源占用比(设置多个容器时才有效)
- 设置容器绑定指定的CPU