lxc语法
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>
//准备工作
在centos7上做实验环境
//安装一个epel源
[root@localhost ~]# yum -y install epel-release
//安装LXC软件包和依赖包
[root@localhost ~]# yum -y install lxc lxc-templates bridge-utils lxc-libs libcgroup libvirt perl debootstrap
lxc #主程序包
lxc-templates #lxc的配置模板
bridge-utils #网桥管理工具
lxc-libs #lxc所需的库文件
libcgroup #cgroup是为Linux内核提供任务聚集和划分的机制,通过一组参数集合将一些任务组织成一个或多个子系统。
libvirt #管理Linux的虚拟化功能所需的服务器端守护程序。 需要针对特定驱动程序的管理程序。
//启动服务
[root@localhost ~]# systemctl start lxc libvirtd
[root@localhost ~]# systemctl status lxc
//检查容器是否满足使用要求
[root@localhost ~]# lxc-checkconfig
Kernel configuration not found at /proc/config.gz; searching...
Kernel configuration found at /boot/config-3.10.0-1127.el7.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
Multiple /dev/pts instances: enabled
--- Control groups ---
Cgroup: enabled
Cgroup 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
Macvlan: enabled
Vlan: enabled
Bridges: enabled
Advanced netfilter: enabled
CONFIG_NF_NAT_IPV4: enabled
CONFIG_NF_NAT_IPV6: enabled
CONFIG_IP_NF_TARGET_MASQUERADE: enabled
CONFIG_IP6_NF_TARGET_MASQUERADE: enabled
CONFIG_NETFILTER_XT_TARGET_CHECKSUM: enabled
--- 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: enabled
Note : Before booting a new kernel, you can check its configuration
usage : CONFIG=/path/to/config /usr/bin/lxc-checkconfig
//当前系统可用的LXC模板容器
[root@localhost ~]# ls /usr/share/lxc/templates/
lxc-alpine lxc-debian lxc-oracle
lxc-altlinux lxc-download lxc-plamo
lxc-archlinux lxc-fedora lxc-sshd
lxc-busybox lxc-gentoo lxc-ubuntu
lxc-centos lxc-openmandriva lxc-ubuntu-cloud
lxc-cirros lxc-opensuse
//创建LXC容器
[root@localhost ~]# lxc-create -t centos -n myhost
[root@localhost ~]# tree /var/lib/lxc/myhost/ -L 1
/var/lib/lxc/myhost/
├── config
├── rootfs
└── tmp_root_pass
1 directory, 2 files
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl status firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# chroot /var/lib/lxc/myhost/rootfs passwd
Changing password for user root.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
[root@localhost ~]# lxc-start -n myhost
systemd 219 running in system mode. (+PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 -SECCOMP +BLKID +ELFUTILS +KMOD +IDN)
Detected virtualization lxc.
Detected architecture x86-64.
Welcome to CentOS Linux 7 (Core)!
Running in a container, ignoring fstab device entry for /dev/root.
Cannot add dependency job for unit display-manager.service, ignoring: Unit not found.
[ OK ] Started Dispatch Password ...onsole Directory Watch.
[ OK ] Reached target Swap.
[ OK ] Reached target Remote File Systems.
[ OK ] Started Forward Password R...o Wall Directory Watch.
[ OK ] Reached target Local Encrypted Volumes.
[ OK ] Reached target Paths.
[ OK ] Created slice Root Slice.
[ OK ] Created slice User and Session Slice.
[ OK ] Listening on Delayed Shutdown Socket.
[ OK ] Listening on /dev/initctl Compatibility Named Pipe.
[ OK ] Created slice System Slice.
[ OK ] Reached target Slices.
[ OK ] Created slice system-getty.slice.
[ OK ] Listening on Journal Socket.
Mounting POSIX Message Queue File System...
Starting Remount Root and Kernel File Systems...
Mounting Huge Pages File System...
Starting Journal Service...
Starting Read and set NIS ...tc/sysconfig/network...
[ OK ] Mounted POSIX Message Queue File System.
[ OK ] Mounted Huge Pages File System.
[ OK ] Started Journal Service.
[ OK ] Started Read and set NIS d.../etc/sysconfig/network.
[ OK ] Started Remount Root and Kernel File Systems.
[ OK ] Reached target Local File Systems (Pre).
Starting Rebuild Hardware Database...
Starting Configure read-only root support...
Starting Flush Journal to Persistent Storage...
<46>systemd-journald[17]: Received request to flush runtime journal from PID 1
[ OK ] Started Flush Journal to Persistent Storage.
[ OK ] Started Configure read-only root support.
Starting Load/Save Random Seed...
[ OK ] Reached target Local File Systems.
Starting Rebuild Journal Catalog...
Starting Mark the need to relabel after reboot...
Starting Create Volatile Files and Directories...
[ OK ] Started Load/Save Random Seed.
[ OK ] Started Rebuild Journal Catalog.
[ OK ] Started Mark the need to relabel after reboot.
[ OK ] Started Create Volatile Files and Directories.
Starting Update UTMP about System Boot/Shutdown...
[ OK ] Started Update UTMP about System Boot/Shutdown.
[ OK ] Started Rebuild Hardware Database.
Starting Update is Completed...
[ OK ] Started Update is Completed.
[ OK ] Reached target System Initialization.
[ OK ] Listening on D-Bus System Message Bus Socket.
[ OK ] Reached target Sockets.
[ OK ] Reached target Basic System.
Starting OpenSSH Server Key Generation...
Starting LSB: Bring up/down networking...
[ OK ] Started D-Bus System Message Bus.
Starting Permit User Sessions...
Starting Login Service...
[ OK ] Started Daily Cleanup of Temporary Directories.
[ OK ] Reached target Timers.
Starting Cleanup of Temporary Directories...
[ OK ] Started Permit User Sessions.
[ OK ] Started Command Scheduler.
[ OK ] Started Console Getty.
[ OK ] Reached target Login Prompts.
[ OK ] Started Cleanup of Temporary Directories.
[ OK ] Started Login Service.
[ OK ] Started OpenSSH Server Key Generation.
CentOS Linux 7 (Core)
Kernel 3.10.0-1127.el7.x86_64 on an x86_64
myhost login: root
Password:
Last failed login: Sun Apr 24 10:32:20 UTC 2022 on lxc/console
There was 1 failed login attempt since the last successful login.
[root@myhost ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
5: eth0@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether fe:1b:3b:8f:d1:87 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.122.4/24 brd 192.168.122.255 scope global dynamic eth0
valid_lft 2841sec preferred_lft 2841sec
inet6 fe80::fc1b:3bff:fe8f:d187/64 scope link
valid_lft forever preferred_lft forever
[root@myhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 17G 2.6G 15G 15% /
devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 17M 1.9G 1% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
tmpfs 378M 0 378M 0% /run/user/0
LXC(LinuX Container)简称Linux的容器,是世界上第一个容器应用。它将容器技术做的更加易用了,把用到的容器功能做成一种工具,简化了用户使用容器的麻烦。
但由于使用LXC还需重新学会LXC的命令工具,复杂程度依旧不小,隔离性也没有虚拟机那么强大。
1.Docker的定义
Docker是以Docker容器为资源分割和调度的基本单位,封装整个软件运行时环境,为开发者和系统管理员设计,用于构建、发布和运行分布式应用的平台。它是一个跨平台、可移植且简单易用的容器解决方案。Docker的源代码托管在GitHub.上, 基于Go语言开发,并遵从Apache 2.0协议。Docker可在容器内部快速自动化地部署 应用,并通过操作系统内核技术(namespace、 CGroups等 )为容器提供资源隔离与安全保障。
Docker本身并不是容器,它是创建容器的工具,是应用容器引擎。
Docker技术的三大核心概念,分别是:
镜像(Image)
容器(Container)
仓库(Repository)
2.优点
(1)更快的交付和部署
(2)高效的资源利用和隔离
(3)环境标准化和版本控制
(4)更轻松的迁移和扩展
(5)更简单的维护和更新管理
Docker不同于传统的虚拟机,Docker容器是使用Docker弓|擎而不是管理程序来执行的。它只包含应用程序及依赖库,基于Libcontainer运行在宿主机上,因此容器比虚拟机小,并且由于主机内核的共享,可以更快地启动,具有更好的性能、更少的隔离和更好的兼容性。启动容器只需几秒即可完成。由于Docker轻量、资源占用少,使得Docker可以轻易地应用到构建标准化的应用中。
为了使容器的使用更加易于管理,docker采取一个用户空间只跑一个业务进程的方式,在一个容器内只运行一个进程,比如我们要在一台主机上安装一个nginx和一个tomcat,那么nginx就运行在nginx的容器中,tomcat运行在tomcat的容器中,二者用容器间的通信逻辑来进行通信。
LXC是把一个容器当一个用户空间使用,当虚拟机一样使用,里面可以运行N个进程,这就使得我们在容器内去管理时极为不便,而docker用这种限制性的方式,在一个容器中只运行一个进程的方式,使得容器的管理更加方便。
Docker产生的背景
一款产品从开发到上线,从操作系统,到运行环境,再到应用配置。作为开发+运维之间的协作我们需要关心很多东西,这也是很多互联网公司不得不面对的问题,特别是各种版本的迭代之后,不同版本环境的兼容,对运维人员是考验。
Docker之所以发展如此迅速,也是因为他对此给出了一个标准化的解决方案。
环境配置如此麻烦,换一台机器,就要重来一次,费力费时。很多人想到,能不能从根本上解决问题,软件可以带安装环境?也就是说,安装的时候,把原始环境一模一样的复制过来。让开发人员利用Docker可以消除协作编码是“在我的机器上可正常工作”的问题。
之前在服务器配置一个应用的运行环境,要安装各种软件,JAVA//TOMCAT/MYSQL等。安装和配置这些东西有多麻烦就不说了,它还不能跨平台。假如我们是在windonws上安装的这些环境,到了Linux又要重新安装。况且就算不夸操作系统,换另一台同样操作系统的服务器,要移植应用也是非常麻烦的。
传统上认为,软件棉麻开发、测试结束后所产出的成果即使是程序或者是能够编译执行的二进制字节码等(java为例)。而为了让这些程序可以顺利执行,开发团队也得准备完整的部署文件,让运维团队得以部署应用程序,开发需要清楚的告诉运维部署团队,用的全部配置文件+所有软件环境。不过,即便如此,仍然常常发行部署失败的状况。Docker镜像的设计,使得Docker得以打破过去[程序即应用]的观念。透过镜像(images)将作业系统核心除外,运作应用程序所需要的系统环境,有下而上打包,达到应用程序式跨平台之间的无缝接轨运作。
使用docker的优劣:
删除一个容器不会影响其他容器
调试不便,占空间(每个容器中都必须自带调试工具,比如ps命令)
分发容易,真正意义上一次编写到处运行,比java的跨平台更彻底
部署容易,无论底层系统是什么,只要有docker,直接run就可以了
分层构建,联合挂载
CGroups
控制组(CGroups)是Linux内核的一个特性,用来对共享资源进行隔离、限制、审计等。只有能控制分配到容器的资源,Docker才能避免多个容器同时运行时的系统资源竞争。
控制组可以提供对容器的内存、CPU、磁盘IO等资源进行限制。
CGroups能够限制的资源有:
blkio:块设备IO
cpu:CPU
cpuacct:CPU资源使用报告
cpuset:多处理器平台上的CPU集合
devices:设备访问
freezer:挂起或恢复任务
memory:内存用量及报告
perf_event:对cgroup中的任务进行统一性能测试
net_cls:cgroup中的任务创建的数据报文的类别标识符
具体来看,控制组提供如下功能:
资源限制(Resource Limitting)组可以设置为不超过设定的内存限制。比如:内存子系统可以为进行组设定一个内存使用上限,一旦进程组使用的内存达到限额再申请内存,就会发出Out of Memory警告
优先级(Prioritization)通过优先级让一些组优先得到更多的CPU等资源
资源审计(Accounting)用来统计系统实际上把多少资源用到合适的目的上,可以使用cpuacct子系统记录某个进程组使用的CPU时间
隔离(Isolation)为组隔离命名空间,这样一个组不会看到另一个组的进程、网络连接和文件系统
控制(Control)挂起、恢复和重启等操作