Container(容器)分离的资源和隔离内容有
每个容器都可以拥有自己独立的命名空间,运行其中的应用都像是在独立的操作系统中运行一样。命名空间保证了容器间彼此互不影响
命名空间由CGroup创建的
Namespaces命名空间
),这样一个组不会看到另一个组的进程、网络连接和文件系统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是容器技术的前端工具,是用来管理容器的工具,它将容器得以简化
LXC进行大规模创建容器很难,想在另一台主机上复刻一个一模一样的容器也很难,所以docker早期的版本其核心就是一个LXC,docker对其进行了二次封装,功能的实现是通过LXC做容器管理引擎
创建容器时,将系统空间所使用的组件事先准备好,编排好,将其打包成一个镜像文件,然后将镜像文件拷贝到目标主机直接部署启动。
docker的镜像文件放在一个集中统一的互联网仓库中的称之为镜像仓库
docker的核心技术主要包括Linux操作系统的命名空间、控制组、联合文件系统和Linux虚拟网络支持。
联合文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加。
docker采取一个用户空间只跑一个业务进程的方式,在一个容器内只运行一个进程(一个容器跑一个进程或业务)
LXC是把一个容器当一个用户空间使用,当虚拟机一样使用,里面可以运行N个进程,这就使得我们在容器内去管理时极为不便,而docker用这种限制性的方式,在一个容器中只运行一个进程的方式,使得容器的管理更加方便。
docker的优劣势:
base基础镜像,是开源的
在容器中有数据称作有状态,没有数据称作无状态。在容器的使用中,我们应以有状态为耻,以无状态为荣。数据不应该放在容器中,而应放置于外部存储中,通过挂载到容器中从而进行数据的存储。
构建一个lnmp架构的时候,它们之间会有依赖关系,哪个应用应该在什么时候启动,在谁之前或之后启动,这种依赖关系我们应该要事先定义好,最好是按照一定的次序实现,而docker自身没有这个功能,所以我们需要一个在docker的基础上,能够把这种应用程序之间的依赖关系、从属关系、隶属关系等等反映在启动、关闭时的次序和管理逻辑中,这种功能被称为容器编排。
有了docker以后,运维的发布工作必须通过编排工具来实现容器的编排
常见的容器编排工具:
1.Linux容器,一种操作系统层虚拟化技术,为Linux内核容器功能的一个用户空间接口。它将应用软件系统打包成一个软件容器,内含应用软件本身的代码,以及所需要的操作系统核心和库。透过统一的名字空间和共享API来分配不同软件容器的可用硬件资源,创造出应用程序的独立沙箱运行环境,使得Linux用户可以容易的创建和管理系统或应用容器。
2.在Linux内核中,提供了cgroups功能,来达成资源的隔离。它同时也提供了名称空间隔离的功能,使应用程序看到的操作系统环境被区隔成独立区间,包括进程树,网络,用户id,以及挂载的文件系统。但是cgroups并不一定需要启动任何虚拟机。
3.LXC利用cgroups与名称空间的功能,提供应用软件一个独立的操作系统环境。LXC不需要Hypervisor这个软件层,软件容器本身极为轻量化,提升了创建虚拟机的速度
4.Docker本质来说不是容器,而是容器的管理工具,最初的Docker也是基于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的虚拟化功能所需的服务器端守护程序。 需要针对特定驱动程序的管理程序。
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 #设置默认网关
[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 ~]#
[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 ~]#
[root@SYL4 ~]# ls /usr/share/lxc/templates/
lxc-busybox lxc-download lxc-local lxc-oci
[root@SYL4 ~]#
[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
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>