容器和LXC简单命令
文章目录
- 容器和LXC简单命令
- 一.CGroup(控制组)的功能
- 1. cgroup(容器控制组)
- 1.1 功能:
- 1.2 具体功能:
- 1.3 控制组可以限制的资源有
- 二.docker基本概念
- 三.docker工作方式
- 四.容器的编排
- 五. lxc命令用法
- 1.1 下载lxc的epel源,并安装lxc软件包和依赖包
- 1.2 添加网桥
- 2.启动lxc
- 3. 用于判断linux内核是否支持LXC
- 4. 列出容器模板
- 5. 创建lxc主机
- 6. 命令
一.CGroup(控制组)的功能
1. cgroup(容器控制组)
- Container(容器)分离的资源和隔离内容有
- UTS:(主机名与域名)
- Mount(文件系统挂载树):文件系统挂载点
- IPC:共享内存
- PID进程树,进程编号
- User:用户和用户组
- Network(tcp/ip协议栈):网络设备,IP地址,端口
- 每个容器都可以拥有自己独立的命名空间,运行其中的应用都像是在独立的操作系统中运行一样。命名空间保证了容器间彼此互不影响
- 命名空间由CGroup创建的
1.1 功能:
- 用来对共享资源进行隔离,限制和审计,控制组可以对容器的内存,CPU和磁盘io等资源进行限制
1.2 具体功能:
- 资源限制组:可以对资源所使用的内存进行限制,超出会发出警告OOM(内存溢出)
- 优先级:让一些组优先得到更多的CPU等资源
- 资源审计:用来统计系统实际上把多少资源用到合适的目的上,可以使用cpuacct子系统记录某个进程组使用的CPU时间
- 隔离:为控制组隔离命名空间(
Namespaces命名空间
),这样一个组不会看到另一个组的进程、网络连接和文件系统 - 控制:挂起(暂停),恢复,重启
1.3 控制组可以限制的资源有
- blkio:块设备,硬盘
- CPU
- cpuacct:CPU资源使用报告
- cpuset:CPU核心
- devices:设备访问
- freezer:挂起或恢复任务
- memory:内存用量
- perf_event:对控制组中的任务进行统一性能测试
- net_cls:cgroup中的任务创建的数据报文的类别标识符
1.安装Docker后,用户可以在/sys/fs/cgroup/memory/docker/
目录下看到对Docker组应用的各种限制项,用户可以通过修改这些文件值来控制组限制Docker应用资源
[root@SYL4 ~]# ls /sys/fs/cgroup/memory/
cgroup.clone_children memory.memsw.failcnt
cgroup.event_control memory.memsw.limit_in_bytes
cgroup.procs memory.memsw.max_usage_in_bytes
cgroup.sane_behavior memory.memsw.usage_in_bytes
init.scope memory.move_charge_at_immigrate
machine.slice memory.numa_stat
memory.failcnt memory.oom_control
memory.force_empty memory.pressure_level
memory.kmem.failcnt memory.soft_limit_in_bytes
memory.kmem.limit_in_bytes memory.stat
memory.kmem.max_usage_in_bytes memory.swappiness
memory.kmem.slabinfo memory.usage_in_bytes
memory.kmem.tcp.failcnt memory.use_hierarchy
memory.kmem.tcp.limit_in_bytes notify_on_release
memory.kmem.tcp.max_usage_in_bytes release_agent
memory.kmem.tcp.usage_in_bytes system.slice
memory.kmem.usage_in_bytes tasks
memory.limit_in_bytes user.slice
memory.max_usage_in_bytes
[root@SYL4 ~]#
二.docker基本概念
- docker是容器技术的前端工具,是用来管理容器的工具,它将容器得以简化
- LXC进行大规模创建容器很难,想在另一台主机上复刻一个一模一样的容器也很难,所以docker早期的版本其核心就是一个LXC,docker对其进行了二次封装,功能的实现是通过LXC做容器管理引擎
- 创建容器时,将系统空间所使用的组件事先准备好,编排好,将其打包成一个镜像文件,然后将镜像文件拷贝到目标主机直接部署启动。
- docker的镜像文件放在一个集中统一的互联网仓库中的称之为镜像仓库
- docker的核心技术主要包括Linux操作系统的命名空间、控制组、联合文件系统和Linux虚拟网络支持。
- 联合文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加。
三.docker工作方式
- docker采取一个用户空间只跑一个业务进程的方式,在一个容器内只运行一个进程(一个容器跑一个进程或业务)
- LXC是把一个容器当一个用户空间使用,当虚拟机一样使用,里面可以运行N个进程,这就使得我们在容器内去管理时极为不便,而docker用这种限制性的方式,在一个容器中只运行一个进程的方式,使得容器的管理更加方便。
- docker的优劣势:
- 删除一个容器不会影响其他容器
- 调试不便,占空间(每个容器中都必须自带调试工具,ps命令)
- 分发容易,真正意义上一次编写(写的镜像可以到处运行)到处运行,比java的跨平台更彻底,装的docker,可以直接部署
- 部署容易,无论底层系统是什么,只要有docker,直接run就可以了
- 分层构建,联合挂载(真机上的资源跟容器所绑定)
- base基础镜像,是开源的
- 在容器中有数据称作有状态,没有数据称作无状态。在容器的使用中,我们应以有状态为耻,以无状态为荣。数据不应该放在容器中,而应放置于外部存储中,通过挂载到容器中从而进行数据的存储。
四.容器的编排
构建一个lnmp架构的时候,它们之间会有依赖关系,哪个应用应该在什么时候启动,在谁之前或之后启动,这种依赖关系我们应该要事先定义好,最好是按照一定的次序实现,而docker自身没有这个功能,所以我们需要一个在docker的基础上,能够把这种应用程序之间的依赖关系、从属关系、隶属关系等等反映在启动、关闭时的次序和管理逻辑中,这种功能被称为容器编排。
有了docker以后,运维的发布工作必须通过编排工具来实现容器的编排
常见的容器编排工具:
- machine+swarm(把N个docker主机当一个主机来管理)+compose(单机编排)
- mesos(实现统一资源调度和分配)+marathon
- kubernetes --> k8s
五. lxc命令用法
- 1.Linux容器,一种操作系统层虚拟化技术,为Linux内核容器功能的一个用户空间接口。它将应用软件系统打包成一个软件容器,内含应用软件本身的代码,以及所需要的操作系统核心和库。透过统一的名字空间和共享API来分配不同软件容器的可用硬件资源,创造出应用程序的独立沙箱运行环境,使得Linux用户可以容易的创建和管理系统或应用容器。
- 2.在Linux内核中,提供了cgroups功能,来达成资源的隔离。它同时也提供了名称空间隔离的功能,使应用程序看到的操作系统环境被区隔成独立区间,包括进程树,网络,用户id,以及挂载的文件系统。但是cgroups并不一定需要启动任何虚拟机。
- 3.LXC利用cgroups与名称空间的功能,提供应用软件一个独立的操作系统环境。LXC不需要Hypervisor这个软件层,软件容器本身极为轻量化,提升了创建虚拟机的速度
- 4.Docker本质来说不是容器,而是容器的管理工具,最初的Docker也是基于LXC实现的。
1.1 下载lxc的epel源,并安装lxc软件包和依赖包
[root@SYL4 ~]# yum -y install epel-release
[root@SYL4 ~]# 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的虚拟化功能所需的服务器端守护程序。 需要针对特定驱动程序的管理程序。
1.2 添加网桥
brctl addbr virbr0 #添加网桥
brctl addif virbr0 ens160 ; # 将网桥关联到ens160这个网卡 \
ip addr del dev ens160 192.168.232.132/24 ; #把网卡上的ip删了 \
ifconfig virbr0 192.168.232.132/32 up #给网桥配置ip \
ip addr add 192.168.232.132/32 dev virbr0
ip link set virbr0 ip
route add default gw 192.168.232.2 #设置默认网关
2.启动lxc
[root@SYL4 ~]# systemctl start lxc//启动服务
[root@SYL4 ~]# systemctl status lxc//查看状态
● lxc.service - LXC Container Initialization and Autoboot Code
Loaded: loaded (/usr/lib/systemd/system/lxc.service; disabled; v>
Active: active (exited) since Sat 2022-04-23 17:49:23 CST; 1s ago
Docs: man:lxc-autostart
man:lxc
Process: 51796 ExecStart=/usr/libexec/lxc/lxc-containers start (c>
Process: 51794 ExecStartPre=/usr/libexec/lxc/lxc-apparmor-load (c>
Main PID: 51796 (code=exited, status=0/SUCCESS)
Apr 23 17:49:23 SYL4 systemd[1]: Starting LXC Container Initializat>
Apr 23 17:49:23 SYL4 systemd[1]: Started LXC Container Initializati>
[root@SYL4 ~]#
[root@SYL4 ~]# systemctl start libvirtd//启动虚拟网络
[root@SYL4 ~]#
3. 用于判断linux内核是否支持LXC
[root@SYL4 ~]# lxc-checkconfig
Kernel configuration not found at /proc/config.gz; searching...
Kernel configuration found at /boot/config-4.18.0-348.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/freezer
/sys/fs/cgroup/perf_event
/sys/fs/cgroup/memory
/sys/fs/cgroup/pids
/sys/fs/cgroup/cpu,cpuacct
/sys/fs/cgroup/rdma
/sys/fs/cgroup/cpuset
/sys/fs/cgroup/net_cls,net_prio
/sys/fs/cgroup/blkio
/sys/fs/cgroup/devices
/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, not loaded
Advanced netfilter: enabled, not 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, not 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
[root@SYL4 ~]#
4. 列出容器模板
[root@SYL4 ~]# ls /usr/share/lxc/templates/
lxc-busybox lxc-download lxc-local lxc-oci
[root@SYL4 ~]#
5. 创建lxc主机
[root@SYL4 ~]# ls /usr/share/lxc/templates/
lxc-busybox lxc-download lxc-local lxc-oci
[root@SYL4 ~]# lxc-create --name=mushuang -t /usr/share/lxc/templates/lxc-busybox
/usr/bin/which: no busybox in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)
ERROR: Please pass a pathname for busybox binary
lxc-create: mushuang: lxccontainer.c: create_run_template: 1625 Failed to create container from template
lxc-create: mushuang: tools/lxc_create.c: main: 331 Failed to create container mushuang
用法: lxc-create {-n name} [-f config_file] {-t template} [-B backingstore] [-- template-options]
- 选项
-n,--name #容器的主机名
-f,--config #指定配置文件以配置容器的虚拟化和隔离功能
-t template #调用模板脚本,可执行模板脚本的完整路径也可以作为参数传递。 “none”可用于强制lxc-create跳过rootfs创建。
-B backingstore #指定根文件储存路径的文件系统,可选:dir、lvm、loop、btrfs、zfs、best ,默认为dir,如果是dir可以使用--dir指定lxc主机的根在宿主机的存储路径。
-P, --lxcpath #自定义容器路径。默认值为/var/lib/lxc。
-o, --logfile #输出创建过程到一个日志文件中。
-l, --logpriority #将日志优先级设置为LEVEL,默认优先级为ERROR
-- #向template传递参数查看可选参数:lxc-create -t TEMPLATE -h,常用参数如下
-n,--name #容器标识符
-p,--path #指定容器根的创建路径,默认/var/lib/lxc/容器名/
-c,--clean #清除缓存
-R,--release #指定Centos的发行版本
--fqdn #用于DNS和系统命名的完全域名(FQDN)
--repo #指定创建容器是使用的yum源,这个是redhat系统的参数
-a,--arch #指定容器的架构,可选i686,x86_64
6. 命令
lxc-checkconfig
检查系统环境是否满足容器使用要求;
lxc-create
创建lxc容器;
格式:lxc-create -n NAME -t TEMPLATE_NAME
lxc-start
启动容器;
格式:lxc-start -n NAME -d
lxc-info
查看容器相关的信息;
格式:lxc-info -n NAME
lxc-console
附加至指定容器的控制台;
格式:lxc-console -n NAME -t NUMBER
lxc-stop
停止容器;
lxc-destory
删除处于停机状态的容器;
lxc-snapshot
创建和恢复快照;
退出容器方式:<Ctrl+a q>