- 容器
- docker的基本概念
- 容器是如何工作的
- CGroup的功能
- LXC常用操作
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
docker_logo.jpg
Docker的核心思想就是来自集装箱;集装箱的概念是隔离货物,所以docker的核心就是隔离机制。同时docker使用可移植镜像所以部署以及运维极其方便快捷。
容器是如何工作的容器通过四个主要组件工作: 名称空间(namespaces) , 控制组(cgroups), 映像(images)和用户空间工具,如LXC或docker
每个容器都是从镜像建立的,镜像告诉Docker容器内包含了什么,当容器启动时运行什么程序,还有许多配置数据。Docker镜像是只读的,当Docker运行一个从镜像建立的容器,它会在镜像顶部添加一个可读写的层,应用程序可以在这里运行。
CGroup的功能cgroups(Control Groups)最初叫 Process Container,由 Google 工程师(Paul Menage 和 Rohit Seth)于 2006 年提出,后来因为 Container 有多重含义容易引起误解,就在 2007 年更名为 Control Groups,并被整合进 Linux 内核。顾名思义就是把进程放到一个组里面统一加以控制。
cgroups是Control Groups的缩写,它是Linux 内核的一个特征,在2.6.24被引入,Cgroups用于提供对Linux的进程组进行资源上的限制/统计/隔离等操作的这样一种功能。
cgroups 是 Linux 内核提供的一种机制,这种机制可以根据特定的行为,把一系列系统任务及其子任务整合(或分隔)到按资源划分等级的不同组内,从而为系统资源管理提供一个统一的框架。
过去有一段时间,内核开发者甚至把 namespace 也作为一个 cgroups 的 subsystem 加入进来,也就是说 cgroups 曾经甚至还包含了资源隔离的能力。但是资源隔离会给 cgroups 带来许多问题,如 PID 在循环出现的时候 cgroup 却出现了命名冲突、cgroup 创建后进入新的 namespace 导致脱离了控制等等。所以在 2011 年就被移除了。
cgroups能够限制的资源有:
- blkio:块设备IO
- cpu:CPU
- cpuacct:CPU资源使用报告
- cpuset:多处理器平台上的CPU集合
- devices:设备访问
- freezer:挂起或恢复任务
- memory:内存用量及报告
- perf_event:对cgroup中的任务进行统一性能测试
- net_cls:cgroup中的任务创建的数据报文的类别标识符
LXC为Linux Container的简写。可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。相当于C++中的NameSpace。容器有效地将由单个操作系统管理的资源划分到孤立的组中,以更好地在孤立的组之间平衡有冲突的资源使用需求
LXC虽然极大的简化了容器技术的使用,但比起直接通过内核调用来使用容器技术,其复杂程度其实并没有多大降低。后来就出现了docker,所以从一定程度上来说,docker就是LXC的增强版
# 安装lxc [root@localhost ~]# dnf -y install lxc
[root@localhost ~]# ifconfig virbr0 virbr0: flags=4163mtu 1500 inet 192.168.10.102 netmask 255.255.255.0 broadcast 192.168.10.255 inet6 fe80::20c:29ff:fe39:9951 prefixlen 64 scopeid 0x20 ether 00:0c:29:39:99:51 txqueuelen 1000 (Ethernet) RX packets 190 bytes 14659 (14.3 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 145 bytes 20284 (19.8 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lxc 安装后 在 /usr/share/lxc/templates 为我们提供了几个容器安装的模板:
- lxc-download:通过网络获取容器镜像来创建容器。
- lxc-local:通过本地已有的镜像来创建容器。
- lxc-busybox:使用 busybox 来创建最基本的容器。
- lxc-oci:通过 oci 标准的镜像来创建容器。
[root@localhost ~]# ls -alh /usr/share/lxc/templates/ total 52K drwxr-xr-x 2 root root 77 Apr 22 15:04 . drwxr-xr-x 6 root root 106 Apr 22 14:47 .. -rwxr-xr-x 1 root root 9.1K Dec 15 2019 lxc-busybox -rwxr-xr-x 1 root root 18K Dec 15 2019 lxc-download -rwxr-xr-x 1 root root 7.1K Dec 15 2019 lxc-local -rwxr-xr-x 1 root root 11K Dec 15 2019 lxc-oci
# 判断linux内核是否支持LXC [root@localhost ~]# lxc-checkconfig
# 创建容器,-t指定模块,-n名称 [root@localhost ~]# lxc-create -t lxc-busybox -n test1
# 查看有哪些容器 [root@localhost ~]# ls /var/lib/lxc test1
# 启动容器 [root@localhost ~]# lxc-start test1
# 关闭容器 [root@localhost ~]# lxc-stop # 销毁容器 [root@localhost ~]# lxc-destroy
]# lxc-start test1
```bash # 关闭容器 [root@localhost ~]# lxc-stop # 销毁容器 [root@localhost ~]# lxc-destroy



