精华内容
参与话题
问答
  • 嵌入式Linux容器技术

    千次阅读 2019-08-13 14:59:21
    嵌入式Linux容器技术 一、Linux容器技术 Linux Container容器是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源。 LXC为Linux Container的简写。可以提供轻量级的虚拟化,以便隔离进程和资源,...

    嵌入式Linux容器技术

    一、Linux容器技术

    1. Linux Container容器是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源。

    2. LXC为Linux Container的简写。可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。相当于C++中的NameSpace。容器有效地将由单个操作系统管理的资源划分到孤立的组中,以更好地在孤立的组之间平衡有冲突的资源使用需求。与传统虚拟化技术相比,它的优势在于:

      (1)与宿主机使用同一个内核,性能损耗小;

      (2)不需要指令级模拟;

      (3)不需要即时(Just-in-time)编译;

      (4)容器可以在CPU核心的本地运行指令,不需要任何专门的解释机制;

      (5)避免了准虚拟化和系统调用替换中的复杂性;

      (6)轻量级隔离,在隔离的同时还提供共享机制,以实现容器与宿主机的资源共享。

      总结:Linux Container是一种轻量级的虚拟化的手段。

    3. Linux Container提供了在单一可控主机节点上支持多个相互隔离的server container同时执行的机制。Linux Container有点像chroot,提供了一个拥有自己进程和网络空间的虚拟环境,但又有别于虚拟机,因为lxc是一种操作系统层次上的资源的虚拟化。

    4. LXC与docker的关系

    (1)Docker并不是LXC的替代品,Docker的底层就是使用了LXC来实现的。LXC将Linux进程沙盒化,使得进程之间相互隔离,并且能够控制各
    进程的资源分配。

    (2)在LXC的基础之上,Docker提供了一系列更强的功能。

    二、嵌入式Linux容器

    Linux主流的容器包括LXC和Docker,其中LXC是Linux原生的轻量化的容器技术。Docker基于LXC实现,但是,Docker的主要应用场景是云服务
    器,其功能十分的强大,但是,其对于嵌入式Linux开发平台的支持可能不那么友好。balenaOS号称对Docker进行了精简,使其可以可靠的运行
    于嵌入式Linux环境中。它基于Yocto框架开发,systemd作为init系统。相比较而言,LXC更为轻量化,对于系统资源的要求更低,所以,其天然
    的适于嵌入式Linux环境。不过,(balenaOS)docker和LXC各有千秋,需要深度体验之后,才能得出最后的结论。

    三、体验容器

    3.1 LXC

    3.1.1硬件环境

    • allwinner T3
    • Cortex-A7 四核
    • 1G RAM
    • Ubuntu Core 18.04(Linux kernel 3.10.108)

    3.1.2 LXC安装

    系统要求:

    • 硬性要求:

      1. glibc、libc、uclib中的一种C库
      2. Linux kernel >= 2.6.32
    • lxc-attach额外要求:

      1. Linux kernel >= 3.8
    • 非特权容器额外要求:

      1. libpam-cgfs,cgmanager或其他CGroup管理器为非特权CGroups操作配置系统
      2. 最新版本的shadow,包括newuidmap和newgidmap
      3. Linux kernel >= 3.12
    • 推荐库:

      1. libcap (to allow for capability drops)
      2. libapparmor (to set a different apparmor profile for the container)
      3. libselinux (to set a different selinux context for the container)
      4. libseccomp (to set a seccomp policy for the container)
      5. libgnutls (for various checksumming)
      6. liblua (for the LUA binding)
      7. python3-dev (for the python3 binding)

    Ubuntu环境下,LXC的安装十分的简单,只需一个命令就可以完成LXC的安装,包括其依赖的所有库文件:

    	$sudo  apt-get  install  lxc
    

    3.1.3 创建非特权容器

    无特权容器是最安全的容器。那些使用uid和gid的映射来为容器分配一系列uid和gids。这意味着容器中的uid 0(root)实际上就像容器外的uid 100000。因此,如果出现问题并且攻击者设法逃离容器,他们将发现自己拥有与无人用户一样多的权利。

    不幸的是,这也意味着不允许以下常见操作:

    • 安装大多数文件系统
    • 创建设备节点
    • 针对映射集之外的uid / gid的任何操作

    注:,因为本次测试的Ubuntu Core环境的内核版本为3.10.108,所以,系统不支非特权容器。

    3.1.4 创建特权容器

    **注:**下面创建的容器为特权容器,即,容器通过root创建和启动。

    lxc安装完成之后,可以使用lxc-checkconfig检测Linux内核是否支持容器。

    	$ lxc-checkconfig
    
    	--- Namespaces ---
    	Namespaces: enabled
    	Utsname namespace: enabled
    	Ipc namespace: enabled
    	Pid namespace: enabled
    	**User namespace: missing**
    	Network namespace: enabled
    	Multiple /dev/pts instances: enabled
    	
    	--- Control groups ---
    	Cgroups: enabled
    	
    	Cgroup v1 mount points: 
    	/sys/fs/cgroup/systemd
    	/sys/fs/cgroup/blkio
    	/sys/fs/cgroup/cpuset
    	/sys/fs/cgroup/devices
    	/sys/fs/cgroup/perf_event
    	/sys/fs/cgroup/cpu,cpuacct
    	/sys/fs/cgroup/memory
    	/sys/fs/cgroup/freezer
    	
    	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, loaded
    	Macvlan: enabled, not loaded
    	Vlan: enabled, not loaded
    	Bridges: enabled, loaded
    	Advanced netfilter: enabled, not loaded
    	CONFIG_NF_NAT_IPV4: enabled, loaded
    	CONFIG_NF_NAT_IPV6: enabled, not loaded
    	CONFIG_IP_NF_TARGET_MASQUERADE: enabled, not loaded
    	CONFIG_IP6_NF_TARGET_MASQUERADE: enabled, not loaded
    	CONFIG_NETFILTER_XT_TARGET_CHECKSUM: enabled, loaded
    	CONFIG_NETFILTER_XT_MATCH_COMMENT: enabled, not loaded
    	FUSE (for use with lxcfs): enabled, not 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
    

    该命令会根据内核的.config文件,检测内核对于容器的支持情况。

    lxc-create用于创建一个容器,lxc在创建一个容器时,提供了很多模板,这些模板的位置:/usr/share/lxc/templates/目录下。

    	sudo lxc-busybox  lxc-download  lxc-local  lxc-oci
    

    下面,通过lxc-download,创一个distribution为Ubuntu,release为bionic,并且arch为armhf的容器:

    	sudo lxc-create -n c1 -t download
    

    上面的命令用于创建一个名为c1的容器,键入该命令后,其会提示输入系统、系统的版本、架构等参数,之后,lxc会下载对应的容器的rootfs。rootfs下载的时间可能比较长,其下载成功之后,说明容器已经下载成功了。rootfs的目录位于:/var/lib/lxc/c1目录,其包括一个config配置文件和rootfs系统。

    通过lxc-ls可以看到系统中已经部署了c1容器,lxc-info可以查看c1当前的运行状态。

    lxc-start用于启动一个容器,具体参数可以通过lxc-start -h查看。

        sudo lxc-start -n c1 -o logfile -d
    

    问题

    1.apparmor配置问题

    	  1 lxc-start c1 20190812055509.777 ERROR    apparmor - lsm/apparmor.c:apparmor_process_label_set:223 - If you really want to start this container, set
    	  2 lxc-start c1 20190812055509.812 ERROR    apparmor - lsm/apparmor.c:apparmor_process_label_set:224 -lxc.apparmor.allow_incomplete = 1
    	  3 lxc-start c1 20190812055509.822 ERROR    apparmor - lsm/apparmor.c:apparmor_process_label_set:225 - in your container configuration file
    	  4 lxc-start c1 20190812055509.842 ERROR    sync - sync.c:__sync_wait:62 - An error occurred in another process (expected sequence number 5)
    	  5 lxc-start c1 20190812055509.908 ERROR    lxccontainer - lxccontainer.c:wait_on_daemonized_start:842 - Received container state "ABORTING" instead of "RUNNING"
    	  6 lxc-start c1 20190812055509.953 ERROR    lxc_start - tools/lxc_start.c:main:330 - The container failed to start
    	  7 lxc-start c1 20190812055509.970 ERROR    lxc_start - tools/lxc_start.c:main:333 - To get more details, run the container in foreground mode
    	  8 lxc-start c1 20190812055509.984 ERROR    lxc_start - tools/lxc_start.c:main:336 - Additional information can be obtained by setting the --logfile and --logpriority options
    	  9 lxc-start c1 20190812055509.577 ERROR    start - start.c:__lxc_start:1939 - Failed to spawn container "c1"
    

    通过分析日志,可知需要在容器的配置文件里,添加一条"lxc.apparmor.allow_incomplete = 1"。c1容器的配置文件为/var/lib/lxc/c1/config,将这一条配置添加到config末尾。

    完成如上步骤之后,再次启动容器c1,仍然没有启动成功,错误日志为:

    	  1 lxc-start c1 20190812034836.659 ERROR    lsm - lsm/lsm.c:lsm_process_label_set_at:174 - No such file or directory - Failed to set AppArmor label "lxc-container-default"
    	  2 lxc-start c1 20190812034836.659 ERROR    apparmor - lsm/apparmor.c:apparmor_process_label_set:245 - Failed to change apparmor profile to lxc-container-default
    	  3 lxc-start c1 20190812034836.660 ERROR    sync - sync.c:__sync_wait:62 - An error occurred in another process (expected sequence number 5)
    	  4 lxc-start c1 20190812034836.660 ERROR    lxccontainer - lxccontainer.c:wait_on_daemonized_start:842 - Received container state "ABORTING" instead of "RUNNING"
    	  5 lxc-start c1 20190812034836.661 ERROR    lxc_start - tools/lxc_start.c:main:330 - The container failed to start
    	  6 lxc-start c1 20190812034836.662 ERROR    lxc_start - tools/lxc_start.c:main:333 - To get more details, run the container in foreground mode
    	  7 lxc-start c1 20190812034836.662 ERROR    lxc_start - tools/lxc_start.c:main:336 - Additional information can be obtained by setting the --logfile and --logpriority options
    	  8 lxc-start c1 20190812034836.719 ERROR    start - start.c:__lxc_start:1939 - Failed to spawn container "c1"
    

    分析日志,AppArmor找不到 "lxc-container-default"配置文件。AppArmor是Linux内核提供的下类似于SeLinux的安全模块,Ubuntu默认
    支持该功能。但是,Ubuntu Core默认并不支持apparmor_status和apparmor_parser工具,而且系统中自带的profile配置文件很少,可以
    通过可以通过sudo apt-get install apparmor-profiles进行安装,上面的apparmor_status、apparmor_parser工具也会一并安装。

    apparmor profile安装完成之后,需要重启apparmor,启动方法如下:

    	Start : sudo /etc/init.d/apparmor start
    	Stop : sudo /etc/init.d/apparmor stop
    	reload: sudo /etc/init.d/apparmor reload
    	Show status: sudo /etc/init.d/apparmor status
    

    通过sudo lxc-info -n c1可以查看,容器的运行状态:

    	sudo lxc-info -n c1
    	
    	Name:           c1
    	State:          RUNNING
    	PID:            2993
    	IP:             10.0.3.81
    	CPU use:        1.87 seconds
    	BlkIO use:      18.83 MiB
    	Memory use:     22.02 MiB
    	KMem use:       0 bytes
    	Link:           vethLWC02H
    	 TX bytes:      1.04 KiB
    	 RX bytes:      1.12 KiB
    	 Total bytes:   2.16 KiB
    

    可以看到当前c1容器当前的系统资源使用率。

    通过lxc-attach命令,可以得到一个与容器进行交互的shell,例如

       sudo lxc-attach -n c1
    

    attach成功之后,会进入到一个shell终端,

    	#root@c1:
    

    可以通过lxc-attach执行容器中任何命令,例如:

    	sudo lxc-attach -n c1 ls
    	sudo lxc-attach -n c1 top
    

    可以将APP打包成deb,然后将deb拷贝到容器rootfs的适当的位置,最后,通过lxc-attach命令执行进行deb的安装。

    	sudo lxc-attach -n c1 -- dpkg -i /home/ubuntu/app.deb  //安装app.deb
    	sudo lxc-attach -n c1 -- dpkg  -r /home/ubuntu/app.deb //卸载app.deb
    

    该终端提供了Ubuntu几乎所有的功能,例如,apt,但是,该Ubuntu却是以容器的方式运行与Ubuntu Core物理主机下的。

    最后,lxc-stop可以关闭容器,lxc-destroy删除容器相关的一切配置文件,包括rootfs。

    3.2 LXD

    未完待续 。。。 。。。

    3.3 BalenaOS

    未完待续 。。。。。。

    展开全文
  • Linux 容器的使用

    千次阅读 2018-08-01 14:49:21
    Linux 容器在 v2.6.29版本之后就加入到内核之中了, 之前虽然也听说过, 但一直没有太留心, 一直使用 KVM 来创建虚拟机. 直至最近 Docker 大出风头, 才开始关注. 想了解一下 Linux 容器究竟是什么? 与现有虚拟机技术...

    https://www.cnblogs.com/wang_yb/p/3923040.html

     

    Linux 容器的使用

    Linux 容器在 v2.6.29版本之后就加入到内核之中了, 之前虽然也听说过, 但一直没有太留心, 一直使用 KVM 来创建虚拟机.
    直至最近 Docker 大出风头, 才开始关注. 想了解一下 Linux 容器究竟是什么? 与现有虚拟机技术(Xen, KVM等)有什么区别?

    Linux 容器技术出现的很早, 其实也是一直虚拟化技术, 但似乎一直没有 Xen, KVM 这些来的出名.
    同时, 在实现原理上, 和Xen, KVM之类的也是有很大区别的.
    下面简单说明下目前4类虚拟技术的区别: (下面说明中, VM:虚拟机, HOST:主机, 即安装虚拟机的机器)

    1. 传统的虚拟化技术 (VirtualBox, VMware)
      通过在Linux上安装虚拟化软件, 然后通过虚拟化软件来安装虚拟机系统, 大致结构如下:

       VM1  VM2 VM3 ... ...                                   
                   VirtualBox or VMWare or ...                
                      Linux Kernel                            
                       硬件                                   

      VM是由虚拟化软件(VirtualBox, VMWare…)来管理的, Linux Kernel不能直接管理到各个VM.

    2. Xen (半虚拟化)
      Xen是Linux上历史比较长的虚拟化技术, 它的虚拟化结构大致如下:

       Linux Kernel  VM1  VM2 VM3 ... ...                     
                       Xen                                    
                       硬件                                   

      Xen的虚拟化原理是在 Linux Kernel和硬件之间加入一层 Xen代码, 有Xen来管理Linux Kernel和其它的VM.

    3. KVM (最新的虚拟化技术)
      相比其它的虚拟化技术, KVM是比较新的, 它需要CPU的支持. 它的虚拟化结构大致如下:

       VM1  VM2 VM3 ... ...                                   
                       KVM (由内核管理)                       
                      Linux Kernel                            
                       硬件                                   

      这个结构和传统的虚拟化技术很类似, 有一点不同的是, KVM和Linux Kernel是紧密结合的,
      所以Linux Kernel能够更好的管理 VMs, VM的性能会比传统的虚拟化技术更好.

    4. Linux 容器 (LXC - linux container)
      LXC 是非常轻量级的, 它将 VM 的进程也伪装成 HOST 的进程. 大致的结构如下:

       p1(HOST), p2(VM), p3(VM), p4(HOST)......               
                    Linux Kernel                              
                       硬件                                   

      那么, 对于某些系统进程, PID是固定的, 比如 init进程的PID=1, VM中的 init进程的PID是如何处理的呢?
      原来, VM的 init进程的PID在 HOST的进程表中会显示成其它PID(>1).

      从上面可以看出, LXC这种虚拟化, VM的进程就像HOST的进程一样运行, 管理, 所以创建和销毁都是非常快速的.

    : 参考 http://veck.logdown.com/posts/200566-compare-of-kvm-and-lxc

    Linux 容器相关的2个重要概念

    Linux容器功能是基于 cgroups 和 Namespace 来实现的. 所以要了解 Linux 容器必须先了解 cgroup 和 Namespace.

    cgroups

    cgroups 是将任意进程进行分组化管理的 Linux 内核功能.
    通过cgroups可以有效的隔离各类进程, 同时还可以控制进程的资源占用(CPU, 内存等等)情况.
    使用示例: (debian v7.6 x86_64)

    mount -t tmpfs cgroup_root /sys/fs/cgroup
    mkdir /sys/fs/cgroup/test
    mount -t cgroup -ocpuset test /sys/fs/cgroup/test

    此时, test目录就是一个 cgroup, 这里 -o 指定了 cpuset, cpuset是Linux中既定的一种cgroup, 后面有时间重新写博客详细介绍.
    test 目录有cgroup必须的各个文件

    cd /sys/fs/cgroup/test
    ls -l
    total 0
    -rw-r--r-- 1 root root 0 Aug 14 14:34 cgroup.clone_children
    --w--w--w- 1 root root 0 Aug 14 14:34 cgroup.event_control
    -rw-r--r-- 1 root root 0 Aug 14 14:34 cgroup.procs
    -rw-r--r-- 1 root root 0 Aug 14 14:34 cpuset.cpu_exclusive
    -rw-r--r-- 1 root root 0 Aug 14 14:34 cpuset.cpus
    -rw-r--r-- 1 root root 0 Aug 14 14:34 cpuset.mem_exclusive
    -rw-r--r-- 1 root root 0 Aug 14 14:34 cpuset.mem_hardwall
    -rw-r--r-- 1 root root 0 Aug 14 14:34 cpuset.memory_migrate
    -r--r--r-- 1 root root 0 Aug 14 14:34 cpuset.memory_pressure
    -rw-r--r-- 1 root root 0 Aug 14 14:34 cpuset.memory_pressure_enabled
    -rw-r--r-- 1 root root 0 Aug 14 14:34 cpuset.memory_spread_page
    -rw-r--r-- 1 root root 0 Aug 14 14:34 cpuset.memory_spread_slab
    -rw-r--r-- 1 root root 0 Aug 14 14:34 cpuset.mems
    -rw-r--r-- 1 root root 0 Aug 14 14:34 cpuset.sched_load_balance
    -rw-r--r-- 1 root root 0 Aug 14 14:34 cpuset.sched_relax_domain_level
    -rw-r--r-- 1 root root 0 Aug 14 14:34 notify_on_release
    -rw-r--r-- 1 root root 0 Aug 14 14:34 release_agent
    -rw-r--r-- 1 root root 0 Aug 14 14:34 tasks

    其中部分文件介绍.

    文件名 R/W 用途
    release_agent RW 删除分组时执行的命令. 这个文件只存在于根分组
    notify_on_release RW 设置是否执行 release\_agent. 为1时执行
    tasks RW 属于分组的线程 TID 列表
    cgroup.procs R 属于分组的进程 PID 列表. 仅包括多线程进程的线程leader的TID, 这点与 tasks 不同
    cgroup.event_control RW 监视状态变化的分组删除事件的配置文件

    在cgroup中还可以建立子cgroup, 建立的方法很简单, 只要创建文件夹即可.

    cd /sys/fs/cgroup/test
    mkdir test-child
    ls -l test-child    # 创建了文件夹之后, 自动生成cgroup需要的文件
    total 0
    -rw-r--r-- 1 root root 0 Aug 14 15:10 cgroup.clone_children
    --w--w--w- 1 root root 0 Aug 14 15:10 cgroup.event_control
    -rw-r--r-- 1 root root 0 Aug 14 15:10 cgroup.procs
    -rw-r--r-- 1 root root 0 Aug 14 15:10 cpuset.cpu_exclusive
    -rw-r--r-- 1 root root 0 Aug 14 15:10 cpuset.cpus
    -rw-r--r-- 1 root root 0 Aug 14 15:10 cpuset.mem_exclusive
    -rw-r--r-- 1 root root 0 Aug 14 15:10 cpuset.mem_hardwall
    -rw-r--r-- 1 root root 0 Aug 14 15:10 cpuset.memory_migrate
    -r--r--r-- 1 root root 0 Aug 14 15:10 cpuset.memory_pressure
    -rw-r--r-- 1 root root 0 Aug 14 15:10 cpuset.memory_spread_page
    -rw-r--r-- 1 root root 0 Aug 14 15:10 cpuset.memory_spread_slab
    -rw-r--r-- 1 root root 0 Aug 14 15:10 cpuset.mems
    -rw-r--r-- 1 root root 0 Aug 14 15:10 cpuset.sched_load_balance
    -rw-r--r-- 1 root root 0 Aug 14 15:10 cpuset.sched_relax_domain_level
    -rw-r--r-- 1 root root 0 Aug 14 15:10 notify_on_release
    -rw-r--r-- 1 root root 0 Aug 14 15:10 tasks

    注意, 删除子cgroup的时候, 要用 rmdir 来删除文件夹, 用 rm -rf 的方法无法删除

    cd /sys/fs/cgroup/test
    rmdir test-child

    : 参考内核文档 Documentation/cgroups/cgroups.txt

    Namespace (命名空间)

    使用Namespace, 可以让每个进程组有独立的PID, IPC和网络空间.
    Namespace的生效主要是通过 clone系统调用来实现的.
    clone系统调用的第3个参数flags就是通过设置Namespace来划分资源的.
    参数种类如下:

    名称 说明
    CLONE_NEWIPC 划分IPC(进程间通信)命名空间, 信号量(semaphore), 共享内存, 消息队列等进程间通信用的资源
    CLONE_NEWNET 划分网络命名空间. 分配网络接口
    CLONE_NEWNS 划分挂载的命名空间. 与chroot同样分配新的根文件系统
    CLONE_NEWPID 划分 PID 命名空间. 分配新的进程ID空间
    CLONE_NEWUTS 划分 UTS(Universal Time sharing System)命名空间. 分配新的 UTS 空间

    Linux 容器的使用方法 (以下命令基于 debian v7.5)

    1. 安装 LXC

      apt-get install lxc
      lxc-checkconfig   # 安装完成后, 用这个命令检查系统是否可以使用 lxc
      # 我的debian系统上有个 missing
      Cgroup namespace: CONFIG_CGROUP_NSmissing
      # 对于这个missing, 可能是由于系统中没有挂载cgroup导致的, 挂载一个cgroup即可
      mount -t cgroup cgroup /mnt/cgroup
    2. 创建容器
      从现有模板创建容器, 比较慢, 需要下载

      # 创建一个 debian 系统
      lxc-create -n test -t debian

      这样创建的容器默认在 /var/lib/lxc/test 中, 为了将容器创建在我们指定的位置, 可以写个简单的配置文件
      lxc.conf, 里面只需要一句

      lxc.rootfs = /home/lxc/test

      然后,

      lxc-create -n test -t debian -f /path/to/lxc.conf

      这样, 就把容器创建在了 /home/lxc/test 中了, /var/lib/lxc/test 中只有一个 config文件(这个config文件可以作为 lxc-create 命令 -f 参数对应配置文件的参考)

    3. 启动容器
      启动后就进行入了虚拟机的控制台了. (果然像传说一样, 几秒就启动完成了 ^_^)

      lxc-start -n test
    4. 停止容器
      在主机中输入停止的命令.

      lxc-stop -n test
    5. 销毁容器
      销毁之前, 可以通过 lxc-ls 来查看有几个容器

      lxc-ls
        test
      lxc-destroy -n test
      lxc-ls

    : 参考URL - http://obdnmagazine.blogspot.com/2013/07/tested-lxc-080-rc1-debian-wheezyax3a6.html

    容器示例 - 配置python uliweb 开发环境

    尝试在容器配置一次开发环境, 然后通过复制容器, 形成多个虚拟机.

    # 主机中
    root@debian-113:~# uliweb   # 主机中没有安装uliweb 软件包
    -bash: uliweb: command not found
    root@debian-113:~# lxc-start -n test
    # 虚拟机登录界面, 输入用户名和密码
    # 虚拟机中
    root@test:~# apt-get install python
    root@test:~# apt-get install python-pip
    root@test:~# pip install Uliweb
    root@test:~# uliweb --version
    Uliweb version is 0.3.1

    主机中设置网桥, 虚拟机用桥接方式上网, 确保每个虚拟机有独立的IP

    # 主机中
    root@debian-113:~# lxc-stop -n test
    root@debian-113:~# apt-cache search bridge-utils
    root@debian-113:~# brctl addbr br0
    # 配置主机的网桥
    root@debian-113:/var/lib/lxc/test# cat /etc/network/interfaces 
    # This file describes the network interfaces available on your system
    # and how to activate them. For more information, see interfaces(5).
    
    # The loopback network interface
    auto lo
    #auto eth0
    iface lo inet loopback
    
    # 追加的网桥配置    
    auto br0
    iface br0 inet static
    address 192.168.1.113
    netmask 255.255.255.0
    gateway 192.168.1.1
       bridge_ports eth0
       bridge_stp on
       bridge_fd 0
    
    root@debian-113:/var/lib/lxc/test# /etc/init.d/networking restart

    配置容器的网络(也是在主机中修改容器的配置文件)

    root@debian-113:/var/lib/lxc/test# cat /var/lib/lxc/test/config
    ... ... (很多默认生成的配置)
    
    # network  <-- 这个 network 相关的是要追加的
    lxc.network.type = veth
    lxc.network.flags = up
    lxc.network.link = br0
    lxc.network.name = eth0

    启动Linux容器, 进入虚拟机

    root@debian-113:/var/lib/lxc/test# lxc-start -n test
    # 登录进入虚拟机, 确认虚拟机的IP
    root@test:~# cat /etc/network/interfaces  <-- 默认是自动获取IP
    auto lo
    iface lo inet loopback
    
    auto eth0
    iface eth0 inet dhcp
    root@test:~# ifconfig   <-- 我的机器自动分配的 192.168.1.167
    # 创建一个简单的uliweb工程
    root@test:~# cd /home/
    root@test:/home# mkdir CM-web
    root@test:/home# cd CM-web/
    root@test:/home/CM-web# uliweb makeproject test
    root@test:/home/CM-web# cd test/
    root@test:/home/CM-web/test# uliweb makeapp first_app
    root@test:/home/CM-web/test# uliweb runserver -h 0.0.0.0

    启动Web服务后, 就可以在主机的浏览器中 通过 http://192.168.1.167:8000/ 来访问虚拟机中的web服务了.

    最后, 复制一个新的容器, 也就是再重新生成一个上面的 python uliweb 开发环境

    # 在主机中
    root@debian-113:~# cd /var/lib/lxc
    root@debian-113:/var/lib/lxc# cp -r test test2
    # 修改 test2/config 如下
    lxc.utsname = test2           <-- 修改名称
    xc.rootfs = /home/lxc/test2   <-- 修改 rootfs位置
    ... ...                       <-- 其它部分不用修改, 和 test 一样就行
    root@debian-113:/var/lib/lxc# cd /home/lxc/
    root@debian-113:/home/lxc# cp -r test test2  <-- 重新复制一份 rootfs
    root@debian-113:/home/lxc# lxc-start -n test2  <-- 启动 test2 虚拟机, 其中环境和 test一样, IP会不一样, 自动获取的
    # 进入 test2 虚拟机中, 可以直接启动之前的 uliweb 测试工程, 也可以从主机中访问其web服务.
    展开全文
  • Windows上的Linux容器

    2019-02-14 22:08:09
    翻译自:...Linux容器占整个容器生态系统的很大比例,是开发人员体验和生产环境的基础。但是,由于容器与容器主机共享内核,因此不能直接在Windows上运行Linux容器。这是虚拟化的发展方向。 现在可...

    翻译自:https://docs.microsoft.com/en-us/virtualization/windowscontainers/deploy-containers/linux-containers

    Linux容器占整个容器生态系统的很大比例,是开发人员体验和生产环境的基础。但是,由于容器与容器主机共享内核,因此不能直接在Windows上运行Linux容器。这是虚拟化的发展方向。

    现在可以使用Docker for Windows和Hyper-V这两种方法运行Linux容器:

    1. 在完整的Linux VM(虚拟机)中运行Linux容器 - Docker在Windows上的通用做法。
    2. 使用Hyper-V隔离(LCOW)运行Linux容器- 这是Docker for Windows中的新选项。

    本文概述了每种方法的工作原理,提供了何时选择哪种解决方案,分享工作进展。

    Moby VM 中的Linux容器

    要在Linux VM中运行Linux容器,请按照Docker的入门指南中的说明进行操作。

    Docker已经能够在Windows桌面上运行Linux容器,因为它是在2016年首次发布(在Hyper-V隔离或LCOW可用之前),使用在Hyper-V上运行的基于LinuxKit的虚拟机。

    在此模型中,Docker Client在Windows桌面上运行,但在Linux VM上调用Docker守护程序(Docker Daemon)。

    Moby VM as the container host

    在此模型中,所有Linux容器共享一个基于Linux的容器主机并且所有Linux容器:

    彼此和Moby VM共享内核,但不与Windows主机共享。
    与Linux上运行的Linux容器具有一致的存储和网络属性(因为它们在Linux VM上运行)。

    这也意味着Linux容器主机(Moby VM)需要运行Docker守护程序和所有Docker守护程序的依赖项。

    要查看您是否正在使用Moby VM运行,请使用Hyper-V Manager UI或在管理员权限的PowerShell窗口中运行Get-VM,检查运行 Moby VM

    具有Hyper-V隔离的Linux容器

    要尝试LCOW(Linux container on windows),请按照此入门指南中的Linux容器说明进行操作

    具有Hyper-V隔离功能的Linux容器在优化的Linux VM中运行每个Linux容器(LCOW),并且只有由操作系统来运行容器。与Moby VM方法相比,每个LCOW都有自己的内核和自己的VM沙箱。它们也是由Windows上的Docker直接管理的。

    Linux containers with Hyper-V isolation (LCOW)

    仔细研究一下Moby VM方法和LCOW之间的容器管理有何不同,在LCOW模型中,容器管理保留在Windows上,每个LCOW管理都通过GRPC和containerd进行。这意味着用于LCOW的Linux发行版容器可以拥有更小的体积。目前,我们正在使用LinuxKit来优化发行版容器的使用,但其他项目如Kata也正在构建类似的高度调整的Linux发行版(Clear Linux)。

    以下是每个LCOW的详细信息:

    LCOW architecture

    要查看您是否正在运行LCOW,请导航至 C:\Program Files\Linux Containers 。如果Docker配置为使用LCOW,那么这里将包含一些文件,其中包含在每个Hyper-V容器中运行的最小LinuxKit发行版。请注意,优化的VM组件小于100 MB,远小于Moby VM中的LinuxKit映像。

    工作进展

    LCOW正在积极发展中。跟踪GitHub上 Moby项目的持续进展

    绑定 mounts

    docker run -v ...绑定卷并将文件存储在Windows NTFS文件系统上,因此POSIX操作需要进行一些转换。某些文件系统操作当前已部分或未实现,这可能会导致某些应用程序不兼容。

    这些操作当前不适用于装入卷:

    • MkNod
    • XAttrWalk
    • XAttrCreate
    • Lock
    • Getlock
    • Auth
    • Flush
    • INotify

    还有一些尚未完全改善:

    • GetAttr - Nlink计数始终报告为2
    • Open - 仅实现ReadWrite,WriteOnly和ReadOnly

    这些应用程序都需要卷映射,无法正常启动或运行。

    • MySQL
    • PostgreSQL
    • WordPress
    • Jenkins
    • MariaDB
    • RabbitMQ

    额外的信息

    Docker blog describing LCOW

    Linux Container Video

    LinuxKit LCOW-kernel plus build instructions

    何时使用Moby VM vs LCOW

    何时使用Moby VM

    现在,我们建议将Moby VM方法运行Linux容器给以下人员:

    想要一个稳定的容器环境。这是Docker for Windows默认的。
    运行Windows或Linux容器,但很少同时运行。
    Linux容器之间有复杂或自定义的网络要求。
    Linux容器之间不需要内核隔离(Hyper-V隔离)。

    何时使用LCOW

    现在,我们向以下人士推荐LCOW:

    1. 想要测试我们的最新技术。
    2. 同时运行Windows和Linux容器。
    3. Linux容器之间需要内核隔离(Hyper-V隔离)。

    我们考虑的其他选择

    当我们研究在Windows上运行Linux容器的方法时,我们考虑了WSL。最终,我们选择了基于虚拟化的方法,以便Windows上的Linux容器与Linux上的Linux容器保持一致。使用Hyper-V还可以使LCOW更安全。我们可能会在将来重新评估,但目前,LCOW将继续使用Hyper-V。

    如果您有想法,请通过GitHub或UserVoice发送反馈。我们特别感谢您对您希望看到的具体体验的反馈。

    译者 PS:今天是情人节,,单身狗在写博客 >.<

    展开全文
  • linux低级格式化命令 在Red Hat,我们... Linux容器 什么是Linux容器? 容器术语简介 下载:容器入门 Kubernetes操作员:自动化容器编排平台 什么是Kubernetes? 当您在系统上运行大量容器时,您不...

    linux低级格式化命令

    在Red Hat,我们喜欢说:“容器是Linux,Linux是容器”。 这就是这个意思。 传统容器是系统上的进程,通常具有以下三个特征:

    1.资源限制

    2.安全约束

    通常,您不希望容器能够互相攻击或攻击主机系统。 我们利用Linux内核的多个功能来建立安全性隔离,例如SELinux,seccomp,功能等。

    3.虚拟分离

    容器进程不应查看容器外部的任何进程。 他们应该在自己的网络上。 容器进程需要能够绑定到不同容器中的端口80。 每个容器都需要一个不同的映像视图,需要自己的根文件系统(rootfs)。 在Linux中,我们使用内核名称空间来提供虚拟分隔。

    因此,在cgroup中运行,具有安全设置并在名称空间中运行的进程可以称为容器。 查看在Red Hat Enterprise Linux 7系统上的PID 1,systemd,您可以看到systemd在cgroup中运行。

    
    
    # tail -1 /proc/1/cgroup
    1:name=systemd:/

    ps命令向您显示系统进程具有SELinux标签...

    
    
    # ps -eZ | grep systemd
    system_u:system_r:init_t:s0             1 ?     00:00:48 systemd

    和功能。

    
    
    # grep Cap /proc/1/status
    ...
    CapEff: 0000001fffffffff
    CapBnd: 0000001fffffffff
    CapBnd:    0000003fffffffff

    最后,如果查看/proc/1/ns子目录,将看到systemd在其中运行的名称空间。

    
    
    ls -l /proc/1/ns
    lrwxrwxrwx. 1 root root 0 Jan 11 11:46 mnt -> mnt:[4026531840]
    lrwxrwxrwx. 1 root root 0 Jan 11 11:46 net -> net:[4026532009]
    lrwxrwxrwx. 1 root root 0 Jan 11 11:46 pid -> pid:[4026531836]
    ...

    如果PID 1(实际上是系统上的所有其他进程)都具有资源限制,安全设置和名称空间,那么我认为系统上的每个进程都在容器中。

    容器运行时工具只需修改这些资源约束,安全设置和名称空间。 然后,Linux内核执行进程。 启动容器后,容器运行时可以监视容器内部或容器的stdin / stdout的PID 1 —容器运行时管理这些进程的生命周期。

    容器运行时

    您可能会对自己说,良好的systemd听起来非常类似于容器运行时。 好了,在讨论了为什么容器运行时为什么不使用systemd-nspawn作为启动容器的工具的电子邮件讨论之后,我认为值得讨论容器运行时并提供一些历史背景。

    Docker通常被称为容器运行时,但是“容器运行时”是一个重载术语。 当人们谈论“容器运行时”时,他们实际上是在谈论开发人员功能随附的高级工具,例如Docker, CRI-ORKT 它们是API驱动的。 它们包括诸如从容器注册表中提取容器映像,设置存储以及最终启动容器的概念。 启动容器通常涉及运行专用工具,该工具将内核配置为运行容器,这些工具也称为“容器运行时”。 我将它们称为“低级容器运行时”。 像Docker和CRI-O这样的守护进程,以及像PodmanBuildah这样的命令行工具,应该被称为“容器管理器”。

    最初编写Docker时,它使用lxc工具集启动了容器,该工具集早于systemd-nspawn Red Hat与Docker的最初合作是试图将libvirtlibvirt-lxc )集成到Docker中,以替代lxc工具,RHEL不支持lxc工具。 libvirt-lxc也未使用systemd-nspawn 当时,systemd团队说systemd-nspawn只是用于测试的工具,而不是用于生产的工具。

    同时,上游Docker开发人员(包括我的Red Hat团队的一些成员)决定,他们希望使用golang本机方式来启动容器,而不是启动单独的应用程序。 libcontainer的工作开始了,它是用于启动容器的本地golang库。 红帽工程公司认为这是前进的最佳途径,因此放弃了libvirt-lxc

    后来,由于人们希望能够以其他方式发射容器,因此成立了开放容器倡议 (OCI)。 传统的以名称空间分隔的容器很流行,但是人们也渴望虚拟机级隔离。 英特尔和Hyper.sh致力于KVM分隔的容器,而微软则致力于基于Windows的容器。 OCI想要一个定义容器是什么的标准规范,因此OCI运行时规范诞生了。

    OCI运行时规范定义了一个JSON文件格式,该格式描述了应运行的二进制文件,应如何包含它以及容器的rootfs位置。 工具可以生成此JSON文件。 然后其他工具可以读取此JSON文件并在rootfs上执行一个容器。 Docker的libcontainer部分已分解并捐赠给OCI。 上游Docker工程师和我们的工程师帮助创建了一个新的前端工具,以读取OCI运行时规范JSON文件并与libcontainer交互以运行容器。 这个名为runc工具也被捐赠给了OCI。 尽管runc可以读取OCI JSON文件,但用户可以自己生成它。 runc成为最受欢迎的低级容器运行时。 几乎所有的容器管理工具都支持runc ,包括CRI-O,Docker,Buildah,Podman和Cloud Foundry Garden 从那时起,其他工具也实现了OCI运行时规范,以执行符合OCI的容器。

    创建了Clear Containers和Hyper.sh的runV工具都是为了使用OCI运行时规范来执行基于KVM的容器,并且它们将自己的努力结合到了一个名为Kata的新项目中。 去年,Oracle创建了一个用Rust编写的名为RailCar的OCI运行时工具的演示版。 GitHub项目已经更新了两个月,所以尚不清楚它是否仍在开发中。 几年前,Vincent Batts致力于添加工具nspawn-oci ,该工具解释OCI运行时规范文件并启动systemd-nspawn ,但没人真正接受它,它不是本机实现。

    如果有人想实现本机systemd-nspawn --oci OCI-SPEC.json并使其得到systemd团队的支持,那么CRI-O,Docker和Podman最终将可以在runc和清除Container / runV( Kata )。 (我的团队中没有人正在为此工作。)

    最重要的是,三到四年前,上游开发人员想编写一个用于启动容器的低级golang工具,而该工具最终成为runc 当时,那些开发人员拥有一个基于C的工具来执行此操作,称为lxc并放弃了它。 我非常确定,在他们决定构建libcontainer的时候,他们不会对systemd-nspawn或运行“名称空间”分隔容器的任何其他非本地(golang)方式感兴趣。

    翻译自: https://opensource.com/article/18/1/history-low-level-container-runtimes

    linux低级格式化命令

    展开全文
  • linux容器技术和Docker

    2019-10-16 16:00:00
    linux容器技术和Docker 概述 Docker在一定程度上是LXC的增强版,早期的Docker使用LXC作为容器引擎,所以也可以说Docker是LXC的二次封装发行版,目前docker使用的容器引擎为runC,其是容器运行时标准的实现之一;...
  • 一份如何选取Linux容器镜像的对比报告阐述了镜像选取中的一些最佳实践。报告中涉及了架构、安全和性能等因素,此外,商业用户还需要考虑厂商的支持情况。\\Linux容器提供了对内核空间和用户空间组件的独立管理,这是...
  • linux容器技术之chroot

    2019-10-15 21:29:00
    linux容器技术之chroot linux chroot 机制的由来 root 用户启动一个daemon,必须用root 用户来启动,比如一个web 服务器(nginx/apapce 80端口)是在操作系统的接口(1-1024),只有root 有这个权限来启动这类接口;用...
  • 自从Linux上的容器变得流行以来,了解Linux容器和虚拟机之间的区别变得更加棘手。本文将向您提供详细信息,以了解Linux容器和虚拟机之间的差异。 Linux容器vs虚拟机 - 应用程序与操作系统 首先要了解的有关容器...
  • 自从Linux上的容器变得流行以来,了解Linux容器和虚拟机之间的区别变得更加棘手。本文将向您提供详细信息,以了解Linux容器和虚拟机之间的差异。  Linux容器vs虚拟机 – 应用程序与操作系统  首先要了解的有关...
  • 这篇文章着重来讲一下Linux容器,为什么强调Linux容器,而不是Docker,是因为Docker是基于虚拟化技术来实现的,但是这篇文章涉及到Linux容器的核心实现方面,两者不同,所以着重强调一下. 容器其实是一种沙盒技术.顾名思义...
  • Linux容器是操作系统级虚拟化,在单个Linux主机上提供多个独立Linux环境的技术。与虚拟机(VM)不同,容器不运行专用客户操作系统。相反,他们共享主机操作系统内核...
  • Linux 容器的资源管理

    2014-11-17 10:28:59
    XC 就是 Linux 容器工具,容器可以提供轻量级的虚拟化,以便隔离进程和资源,使用 LXC 的优点就是不需要安装太多的软件包,使用过程也不会占用太多的资源。LXC 是在 Linux 平台上基于容器的虚拟化技术的未来标准,...
  • .NET程序在Linux容器中的演变

    千次阅读 2017-04-10 14:25:57
    现在,.NET开发人员可以无障碍地使用如Docker这样的Linux容器,那么让我们来尝试如何以正确的方式配置一个容器。可能,文章的标题改成“Linux容器开发人员的演变”会更好。由于.NET可在Linux(以及Windows和macOS)...
  • 底层 Linux 容器运行时之发展史 在 Red Hat,我们乐意这么说,“容器LinuxLinux容器”。下面解释一下这种说法。传统的容器是操作系统中的进程,通常具有如下 3 个特性: 资源限制 当你在系统中运行多个...
  • 通过 Linux 容器进行虚拟化

    千次阅读 2014-06-25 08:27:48
    Linux 容器是一种轻量级“虚拟化”方法,用于在单个控制主机上同时运行多个虚拟装置(容器)。另一个可用来描述 Linux 容器所执行的操作的术语是“容器化”。 Linux 容器提供操作系统级别的虚拟化,其中的内核控制...

空空如也

1 2 3 4 5 ... 20
收藏数 17,792
精华内容 7,116
关键字:

linux容器

linux 订阅