- 容器相关概念
- CGroups
- CGroups简介
- CGroups功能介绍
- LXC
- LXC简介
- LXC的安装
- LXC的使用
- docker
- docker工具简介
- docker工作原理
- docker工具的改进
- docker工作方式
-
基本概念
容器是一种基础工具;泛指任何可以用于容纳其他物品的工具,被用于容纳、储存、运输物品,人类使用容器的历史悠久,容器的表现形式也很多,例如:集装箱,背包,瓶罐,箱篮等。而我们业务中实际使用的容器也是可以实现容纳,存储,运输等功能的。
-
传统虚拟化与容器的区别
传统虚拟化指的就是虚拟机,系统的运行本身就需要占用资源,当需要管理多项进程与应用时,可能需要用到多台虚拟机,随着业务量的增加,虚拟机系统占用的资源会越来越多,负载也会越来越大。
而容器就可以很好的解决这一点,容器占用的资源类似于一项服务,通过服务来管理进程与应用,相对于系统所占用的资源,容器的资源占用消耗会少很多,一台服务器可以运行成千上百个容器,而传统虚拟化很难做到这一点。
-
虚拟化相关概念
主机级虚拟化 :利用虚拟机来运行应用服务。主机级虚拟化又分为全虚拟化和半虚拟化,全虚拟化在真机安装虚拟化软件并安装系统,半虚拟化是指在系统上装一个虚拟机软件,而后在软件内再装一个虚拟机。 -
容器分离开的资源有:
主机名域名,用户(user),文件系统树(mount)和进程树(pid),共享(ipc),进程(pid),网络(tcp/ip协议栈,ip地址) -
容器技术的溯源
最早的容器技术可追溯至1982年Unix系列的chroot工具,此工具至今依然存在且被支持。 -
Namespaces命名空间
命名空间是Linux内核特性,每个容器都拥有自己的命名空间,运行其中的应用都像是在独立的操作系统中运行一样。命名空间相互分离,保证了容器间彼此互不影响。
| namespaces | 系统调用参数 | 隔离内容 | 内核版本 |
|---|---|---|---|
| UTS | CLONE_NEWUTS | 主机名和域名 | 2.6.19 |
| IPC | CLONE_NEWIPC | 信号量、消息队列和共享内存 | 2.6.19 |
| PID | CLONE_NEWPID | 进程编号 | 2.6.24 |
| Network | CLONE_NEWNET | 网络设备、网络栈、端口等 | 2.6.29 |
| Mount | CLONE_NEWNS | 挂载点(文件系统) | 2.4.19 |
| User | CLONE_NEWUSER | 用户和用户组 | 3.8 |
centos7及以上系统均可支持上述功能。
[root@rookie ~]# uname -r 4.18.0-365.el8.x86_64CGroups CGroups简介
控制组(CGroups)同样也是Linux内核特性,前面讲到的名称空间,也是CGroups创建出来的。CGroups通过控制多个容器的资源分配,避免容器们同时运行时竞争系统资源,保证系统稳定。控制组可以提供对容器的内存、CPU、磁盘IO等资源进行限制。
CGroups能够限制的资源有:
blkio:块设备IO(硬盘)
cpu:CPU
cpuacct:CPU资源使用报告
cpuset:多处理器平台上的CPU集合(cpu核心使用数量)
devices:设备访问
freezer:挂起或恢复任务
memory:内存用量及报告
perf_event:对cgroup中的任务进行统一性能测试
net_cls:cgroup中的任务创建的数据报文的类别标识符
具体来看,控制组提供如下功能:
①资源限制(Resource Limitting)——可以设定进程组内存限制的上限。一旦进程组使用内存达到上限,再申请内存,就会发出Out of Memory(内存溢出)警告;
②优先级设定(Prioritization)——通过设定优先级让一些组优先得到更多的CPU等资源的分配;
③资源审计(Accounting)——用来统计系统实际上把多少资源用到合适的目的上,可以使用cpuacct子系统记录某个进程组CPU的累计使用时间;
④隔离(Isolation)——为组隔离命名空间,这样一个组不会看到另一个组的进程、网络连接和文件系统;
⑤控制(Control)——组的挂起、恢复和重启等操作。
- 安装Docker后,我们可以在/sys/fs/cgroup/memory/docker/目录下看到对Docker组应用的各种限制项。我们可以通过写入limit限制文件值修改Docker限制的应用资源。
LXC(LinuX Container)把容器技术做得更加简单易用,将一系列容器功能整合为工具包,从而降低容器技术的使用难度。
LXC虽然极大地简化了容器技术的使用,但我们必须要学会LXC的一组命令工具。就复杂程度来说,比起直接通过内核调用来使用容器也没降低多少;且由于内核的创建都是通过命令来实现的,通过批量命令实现数据迁移并不容易。其隔离性也没有虚拟机那么强大。
后来就出现了docker,所以从一定程度上来说,docker就是LXC的增强版
LXC的安装- LXC的安装包在CentOS的epel源有提供的,使用官网的epel源需要安装一个软件包
[root@rookie ~]#yum -y install epel-release #这个软件包里包含epelyum源和GPG的配置
2.安装LXC软件包和依赖包
[root@rookie ~]#yum -y install lxc lxc-templates bridge-utils lxc-libs libcgroup libvirt lxc #主程序包 lxc-templates #lxc的配置模板 bridge-utils #网桥管理工具 lxc-libs #lxc所需的库文件 libcgroup #cgroup是为Linux内核提供任务聚集和划分的机制,通过一组参数集合将一些任务组织成一个或多个子系统。 libvirt #管理Linux的虚拟化功能所需的服务器端守护程序。 需要针对特定驱动程序的管理程序。
- 服务启动与检查
[root@rookie ~]# systemctl start lxc
[root@rookie ~]# systemctl start libvirtd
[root@rookie ~]# systemctl status lxc
● lxc.service - LXC Container Initialization and Autoboot Code
Loaded: loaded (/usr/lib/systemd/system/lxc.service; disabled; vendor preset: disab>
Active: active (exited) since Sat 2022-04-23 16:41:50 CST; 9min ago
Docs: man:lxc-autostart
man:lxc
//检查配置
[root@rookie ~]# lxc-checkconfig
Kernel configuration not found at /proc/config.gz; searching...
Kernel configuration found at /boot/config-4.18.0-365.el8.x86_64
--- Namespaces ---
Namespaces: enabled
Utsname namespace: enabled
Ipc namespace: enabled
Pid namespace: enabled
User namespace: enabled
Warning: newuidmap is not setuid-root
Warning: newgidmap is not setuid-root
Network namespace: enabled
--- Control groups ---
Cgroups: enabled
Cgroup v1 mount points:
/sys/fs/cgroup/systemd
/sys/fs/cgroup/memory
/sys/fs/cgroup/perf_event
/sys/fs/cgroup/devices
/sys/fs/cgroup/blkio
/sys/fs/cgroup/net_cls,net_prio
/sys/fs/cgroup/freezer
/sys/fs/cgroup/rdma
/sys/fs/cgroup/cpuset
/sys/fs/cgroup/cpu,cpuacct
/sys/fs/cgroup/pids
/sys/fs/cgroup/hugetlb
Cgroup v2 mount points:
Cgroup v1 clone_children flag: enabled
Cgroup device: enabled
Cgroup sched: enabled
Cgroup cpu account: enabled
Cgroup memory controller: enabled
Cgroup cpuset: enabled
--- Misc ---
Veth pair device: enabled, not loaded
Macvlan: enabled, not loaded
Vlan: enabled, not loaded
Bridges: enabled, loaded
Advanced netfilter: enabled, loaded
CONFIG_NF_NAT_IPV4: missing
CONFIG_NF_NAT_IPV6: missing
CONFIG_IP_NF_TARGET_MASQUERADE: enabled, not loaded
CONFIG_IP6_NF_TARGET_MASQUERADE: enabled, not loaded
CONFIG_NETFILTER_XT_TARGET_CHECKSUM: enabled, loaded
CONFIG_NETFILTER_XT_MATCH_COMMENT: enabled, not loaded
FUSE (for use with lxcfs): enabled, loaded
--- Checkpoint/Restore ---
checkpoint restore: enabled
CONFIG_FHANDLE: enabled
CONFIG_EVENTFD: enabled
CONFIG_EPOLL: enabled
CONFIG_UNIX_DIAG: enabled
CONFIG_INET_DIAG: enabled
CONFIG_PACKET_DIAG: enabled
CONFIG_NETLINK_DIAG: enabled
File capabilities:
Note : Before booting a new kernel, you can check its configuration
usage : CONFIG=/path/to/config /usr/bin/lxc-checkconfig
LXC的使用
- 创建虚拟机
// 查看当前系统中可用的LXC模板容器 [root@rookie ~]# ls /usr/share/lxc/templates/ lxc-busybox lxc-download lxc-local lxc-oci
- 创建LXC主机
[root@rookie ~]# lxc-create -t centos -n xieyanxin01 lxc-create: xieyanxin01: utils.c: get_template_path: 943 No such file or directory - bad template: centos lxc-create: xieyanxin01: lxccontainer.c: do_lxcapi_create: 1794 Unknown template "centos" lxc-create: xieyanxin01: tools/lxc_create.c: main: 331 Failed to create container xieyanxin01 //配置文件 没写好 卡壳了docker docker工具简介
docker并不是容器,而是容器技术的一个前端工具,容器作为内核技术,docker把这项技术的使用得以简化,使之普及。
docker工作原理LXC的不便之处在于:①很难进行大规模创建容器,②很难在另一台主机上复刻一个完全相同的容器,而docker就是从这方面着手去找解决方案。
所以docker的早期版本,核心就是一个LXC,通过对LXC进行二次封装,做一个容器管理引擎,但docker在创建容器时,不再是像LXC一样用模板去现场安装,而是事先通过一种类似镜像技术,就像KVM,将一个操作系统打包成一个镜像文件,然后将这个镜像拷贝到目标主机上直接部署启动。
那么什么是镜像文件呢?docker把一个操作系统用户空间需要用到的所有组件,事先准备、编排好,然后整体打包成一个文件,这个文件我们称其为镜像文件(image)。
docker的镜像文件是放在一个集中统一的互联网仓库中的,把一些人们常用的镜像文件放在互联网仓库中。比如最小化的centos系统,有时我们需要在操作系统上安装一些应用,比如nginx,我们就可以在一个最小化的centos系统中安装一个nginx,然后将其打包成镜像,将其放在互联网仓库中,当人们想启动一个容器的时候,docker会到这个互联网仓库中去下载我们需要的镜像到本地,并基于镜像来启动容器。
docker工具的改进自docker 0.9版本起,docker除了继续支持LXC外,还开始引入自家的libcontainer,试图打造更通用的底层容器虚拟化库。如今的docker基本上都已经是使用libcontainer而非LXC了。
从操作系统功能上看,docker底层依赖的核心技术主要包括Linux操作系统的命名空间、控制组、联合文件系统和Linux虚拟网络支持。
docker工作方式为了更好管理容器的使用,docker采取一个用户空间只跑一个业务进程的方式,在一个容器内只运行一个进程。比如我们要在一台主机上安装一个nginx和一个tomcat,那么nginx就运行在nginx的容器中,tomcat运行在tomcat的容器中,二者用容器间的通信逻辑来进行通信。
-
docker的优劣
①管理便捷——因为容器之间相互独立,删除一个容器不会影响其他容器;
②分发容易 ——真正意义上一次编写到处运行,比java的跨平台更彻底;
③部署简单——无论底层系统是什么,只要有docker,直接run就可以了;
④层级清晰——分层构建,联合挂载; -
相对于LXC的优势
LXC是把一个容器当一个用户空间使用,当虚拟机一样使用,里面可以运行N个进程,这就使得我们在容器内去管理时极为不便,而docker用这种限制性的方式,在一个容器中只运行一个进程的方式,使得容器的管理更加方便。 -
docker存在的的劣势
资源占用较高——无论什么规模的容器数量,每个容器中都必须自带调试工具,比如ps命令。
在容器中有数据称作有状态,没有数据称作无状态。在容器的使用中,我们应以有状态为耻,以无状态为荣。数据不应该放在容器中,而应放置于外部存储中,通过挂载到容器中从而进行数据的存储。



