容器和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>